Ich versuche, eine VCL-Komponente wie TImage zu erstellen, mit dem ich eine variable Menge von unterschiedlich großen TPictures hinzufügen kann. Ziel ist es, diese Anzahl von TPictures über den VCL-Editor in der Eigenschaftsliste zuweisen zu können.Delphi-Komponente mit einer Sammlung von TPictures
delphi component property: TObjectList<TPicture> hier kamen wir zu der Schlussfolgerung, dass eine TCollection mit TCollectionItems verwendet werden sollte. Das ist, was ich versuche jetzt zu tun, aber so oft, bevor ich mit dem Compiler-Fehler am Ende: in dieser Zeile „Veröffentlicht Eigenschaft‚Pictures‘nicht vom Typ ARRAY sein kann“: property Pictures[Index: Integer]: TPic read GetPic write SetPic;
unit ImageMultiStates;
interface
uses
Vcl.Graphics, Vcl.StdCtrls, System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Forms, Generics.Collections;
type
TPic = class(TCollectionItem)
private
FPicture: TPicture;
public
procedure Assign(Source: TPersistent); override;
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
published
property Picture: TPicture read FPicture write FPicture;
end;
TPictures = class(TCollection)
private
function GetPic(Index: Integer): TPic;
procedure SetPic(Index: Integer; APicture: TPic);
public
constructor Create;
published
property Pictures[Index: Integer]: TPic read GetPic write SetPic;
end;
TImageMultiStates = class(TImage)
private
FPictures: TPictures;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Activate(Index: Integer);
end;
procedure Register;
implementation
constructor TPic.Create(Collection: TCollection);
begin
inherited Create(Collection);
end;
destructor TPic.Destroy;
begin
FPicture.Free;
inherited Destroy;
end;
procedure TPic.Assign(Source: TPersistent);
begin
FPicture.Assign(Source);
end;
constructor TPictures.Create;
begin
inherited Create(TPic);
end;
procedure TPictures.SetPic(Index: Integer; APicture: TPic);
begin
Items[Index].Assign(APicture);
end;
function TPictures.GetPic(Index: Integer): TPic;
begin
Result := TPic(inherited Items[Index]);
end;
constructor TImageMultiStates.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
destructor TImageMultiStates.Destroy;
begin
FPictures.Free;
inherited Destroy;
end;
procedure TImageMultiStates.Activate(Index: Integer);
begin
Picture.Assign(FPictures.Items[Index]);
end;
procedure Register;
begin
RegisterComponents('Standard', [TImageMultiStates]);
end;
end.
Da niemand damit zu rechnen scheint, dass dieser Fehler ausgelöst wird, hängt das vielleicht mit meinen installierten Komponenten zusammen? Ich habe den internen GetIt Package-Manager verwendet, um die Jedi-Codebibliothek 2.8, Jedi Visual Component Library und PNGComponents 1.0 zu installieren. Ich denke, das ist so weit, was TImage-bezogene Komponenten betrifft. Vielleicht überschreibt eine dieser Dateien einige meiner TImage-Inhalte mit funky stuff ...
Wenn Sie mehrere Bilder zur Entwurfszeit mit 'Objekt Inspector' wie Bearbeitung andere Eigenschaft zuweisen wollen, dann fürchte ich Dich nicht in der Lage sein, dies zu tun. Gut nicht direkt mit dem Objektinspektor. Was Sie tun müssen, ist Ihren eigenen benutzerdefinierten Eigenschaftseditor zu erstellen. Ich schlage vor, den Quellcode der 'TImageList'-Komponente zu überprüfen, um besser zu verstehen, wie es gemacht wird. – SilverWarior
Es ist eine Weile her, seit ich es das letzte Mal benutzt habe, aber IIRC, so funktioniert TCollection nicht. Sehen Sie sich an, wie eine Statusleiste ihre Panels verwaltet oder wie ein Listview seine Spaltenüberschriften verwaltet. AFAIK verwenden beide Nachkommen von TCollection. –
Eine nette Erklärung hier: http://www.atug.com/andypatterns/collections.htm#TCollectionMerits. Der beste Teil einer Tcollection ist, dass sie im Objektinspektor gut funktioniert und über einen Eigenschaftseditor verfügt, mit dem Sie Elemente hinzufügen können. –