Einzelnen Beitrag anzeigen

mcbain

Registriert seit: 18. Mai 2011
50 Beiträge
 
#2

AW: Custom Property Editor Streaming

  Alt 29. Nov 2013, 07:25
Hier noch etwas mehr Information.
Ich habe meine Struktur eigentlich genauso wie hier von Mabuse beschrieben:

Zitat von Neutral General:
@ MaBuSE Edit: Ja das weiß ich ja... Guck mal

EDIT: Der Editor ist noch nicht so schön aber das is ja auch nur mal um zu gucken obs geht.. das die ListBox nach dem start so klein ist, kommt von ner Art AutoSize-Funktion die das Ding hat
Dein Problem ist folgendes:

Normale Properties werden direkt in der Formulardatei (*.dfm) gespeichert.
Mit Objekten funktioniert das aber nicht.

Du mußt Dich also selbst darum kümmern die Infos in der DFM zu speichern.

Hier findest Du weitere Infos: Delphi-Referenz durchsuchenDefineProperties (Methode von TComponent)


Das müsste so oder so ähnlich gehen.
(Habe ich jetzt nicht in Delphi getestet )

Delphi-Quellcode:
...
type
  TMyComp = class(TComponent)
  private
    FMyData: TMyData;
    procedure ReadMyData(Reader: TReader);
    procedure WriteMyData(Writer: TWriter);
...
  protected
    procedure DefineProperties(Filer: TFiler);
...
  published
    MyData: TMyData read FMyData write FMyData;
...

procedure TMyComp.DefineProperties(Filer: TFiler);
  function WriteData: Boolean;
  begin
    if Filer.Ancestor <> nil then
      Result := not FMyData.IsEqual(TMyComp(Filer.Ancestor).FMyData) else
      Result := FMyData.Count > 0;
  end;

begin
  inherited DefineProperties(Filer);
  Filer.DefineProperty('MyData', ReadMyData, WriteMyData, WriteData);
end;

procedure TMyComp.ReadMyData(Reader: TReader);
begin
  Reader.ReadValue;
  Reader.ReadCollection(MyData);
end;

procedure TMyComp.WriteMyData(Writer: TWriter);
begin
  Writer.WriteCollection(MyData);
end;
...
Hier mein Code:
Delphi-Quellcode:
...
type
  TMyObject= class(TCollectionItem)
    private
      FID: string;
      procedure SetID(aValue: string);
    published
      constructor Create(Collection: TCollection); override;
      destructor Destroy; override;
      property ID: string read FID write SetID;
  end;


  TMyData= class(TOwnedCollection)
    private
      function GetItem(Index: Integer): TMyObject;
      procedure SetItem(Index: Integer; const Value: TMyObject);
    public
      function Add: TMyObject; reintroduce;
      function Insert(Index: Integer): TMyObject; reintroduce;
      property Items[Index: Integer]: TMyObjectread GetItem write SetItem;
  end;

  
  TMyComp = class(TComponent)
  private
    FMyData: TMyData;
    procedure ReadMyData(Reader: TReader);
    procedure WriteMyData(Writer: TWriter);
...
  protected
    procedure DefineProperties(Filer: TFiler); override;
...
  public
    MyData: TMyData read FMyData write FMyData;
...

procedure TMyComp.DefineProperties(Filer: TFiler);
begin
  inherited DefineProperties(Filer);
  Filer.DefineProperty('MyData', ReadMyData, WriteMyData, True);
end;

procedure TMyComp.ReadMyData(Reader: TReader);
begin
  Reader.ReadValue;
  Reader.ReadCollection(MyData);
end;

procedure TMyComp.WriteMyData(Writer: TWriter);
begin
  Writer.WriteCollection(MyData);
end;
...
Aber leider wird bei dieser Art und weise die Collection erst in dei DFM gespeichert, wenn ich eine andere Eigenschaft im ObjectInspector verändere. Ändere ich die Collection in meinem Custom-Property-Editor, passiert nichts.

Interessanterweise wird die Collection 2 Mal in die DFM geschrieben.

Kann mir diesbezüglich jemand nen Tip geben bitte? Bin etwas ratlos.
Vielen Dank.
Gruß
mc

Geändert von mcbain (29. Nov 2013 um 07:28 Uhr)
  Mit Zitat antworten Zitat