Ich versuche, eine VCL-Komponente zu erstellen, mit der Sie mehrere TImages verschiedener Größen als Eigenschaften einfügen können. Mir wurde gesagt, am besten eine TObjectList (Delphi component with a variable amount of TPictures) zu verwenden, aber jetzt habe ich Mühe, die einzelnen TPictures im Eigenschafteneditor zuweisbar zu machen.Delphi Komponente Eigenschaft: TObjectList <TPicture>
Was ich im Moment haben: (kompiliert)
unit ImageMultiStates;
interface
uses
Vcl.Graphics, Vcl.StdCtrls, System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Forms, Generics.Collections;
type
TImageMultiStates = class(TImage)
private
FPictures: TObjectList<TPicture>;
procedure SetPicture(Which: Integer; APicture: TPicture);
function GetPicture(Which: Integer): TPicture;
public
Count: integer;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Activate(Which: Integer);
published
// property Pictures: TObjectList<TPicture> read GetPicture write SetPicture;
// property Pictures[Index: Integer]: TObjectList<TPicture> read GetPicture write SetPicture;
property Pictures: TObjectList<TPicture> read FPictures write FPictures;
end;
procedure Register;
implementation
constructor TImageMultiStates.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FPictures := TObjectList<TPicture>.Create;
end;
destructor TImageMultiStates.Destroy;
begin
FPictures.Free;
inherited Destroy;
end;
procedure TImageMultiStates.SetPicture(Which: Integer; APicture: TPicture);
begin
FPictures[Which] := APicture;
if Which=0 then
Picture.Assign(APicture);
end;
function TImageMultiStates.GetPicture(Which: Integer): TPicture;
begin
Result := FPictures[Which];
end;
procedure TImageMultiStates.Activate(Which: Integer);
begin
Picture.Assign(FPictures[Which]);
end;
procedure Register;
begin
RegisterComponents('Standard', [TImageMultiStates]);
end;
end.
Was nicht funktioniert das Endergebnis in der Property ist. Es zeigt ein einzelnes Element namens "Bilder" mit dem Wert "(TObjectList)". Wenn ich darauf klicke, habe ich keinen richtigen Editor. Andere Ideen für die fragliche Zeile wurden auskommentiert, sie bringen andere Fehler: Die erste wirft den Compilerfehler "E2008 Incompatible Types", der zweite wirft "Published property 'Pictures' kann nicht vom Typ ARRAY sein".
Ich bin nicht sicher, Sie Generika veröffentlichten Eigenschaften verwenden können (ich bin nicht sicher, Sie können nicht, entweder, BTW). Gibt es einen Grund, warum Sie nicht einfach eine TOwnedCollection verwenden, mit der das Streaming-System umgehen kann? Und eine veröffentlichte Eigenschaft kann nicht vom Typ array sein; Sie können eine * public * -Array-Eigenschaft mit Getter/Setter haben, aber nicht * veröffentlicht *. –
Sie sollten eine Sammlung verwenden, wie ich in den Kommentaren zu Ihrer vorherigen Frage –
Ich mochte den Vorschlag einer TObjectList, um Komplexität zu vermeiden. Okay, der nächste Ansatz beginnt mit einer Sammlung. Prost! – hzzmj