![]() |
Define Properties
Hi,
Habe nochmal meine alte DPListBox ausgekramt und wollte die mal richtig fertig machen. Ist dummerweise schon ne Weile her und jetzt hab ich folgende Situation:
Delphi-Quellcode:
Im OI siehts jetzt so aus:
// Alles aufs Wesentliche reduziert:
type TDPListBoxHeader = class(TPersistent) private FCaption: TCaption; FColor: TColor; procedure SaveToStream(AStream: TStream); procedure LoadFromStream(AStream: TStream); protected procedure ReadMyData(AStream: TStream); procedure WriteMyData(AStream: TStream); procedure DefineProperties(Filer: TFiler); override; public constructor Create(AOwner: TDPListBox); published property Caption: TCaption read FCaption write SetCaption; property Color: TColor read FColor write SetColor; end; TDPListBox = class(..) private FHeader: TDPListBoxHeader; published property Header: TDPListBoxHeader read FHeader; end; Zitat:
Bei einer anderen Property hatte ich es mit DefineProperties gemacht. Hab ich jetzt auch versucht. Das ganze sieht so aus:
Delphi-Quellcode:
Das ganze funktioniert aber leider nicht. :arrow: DefineProperties wird nie aufgerufen... Warum das?
procedure TDPListBoxHeader.LoadFromStream(AStream: TStream);
var l: Integer; begin with AStream do begin Read(l,SizeOf(Integer)); SetLength(FCaption,l); Read(FCaption[1],l); Read(FColor,SizeOf(TColor)); end; end; procedure TDPListBoxHeader.SaveToStream(AStream: TStream); var l: Integer; begin with AStream do begin l := Length(FCaption); Write(l,SizeOf(Integer)); Write(FCaption[1],l); Write(FColor,SizeOf(TColor)); end; end; procedure TDPListBoxHeader.ReadMyData(AStream: TStream); begin LoadFromStream(AStream); end; procedure TDPListBoxHeader.WriteMyData(AStream: TStream); begin SaveToStream(AStream); end; procedure TDPListBoxHeader.DefineProperties(Filer: TFiler); begin inherited DefineProperties(Filer); Filer.DefineBinaryProperty('Header',ReadMyData,WriteMyData,true); end; Gruß Neutral General |
Re: Define Properties
Du musst DefineProperty in der TDPListBox aufrufen und für die Property Header - weil diese Klasse kennt er schliesslich nicht und kann sie somit nicht streamen.
/EDIT: Nicht aufrufen sondern überschreiben etc wie du es nun schon gemacht hast - nur halt in der falschen Klasse... Stümmt, jbg hat vollkommen Recht. Ich habe nur in letzter Zeit soviele Listenklassen mit eigenen Property Editoren und eigenen DFM Formaten geschrieben, so dass ich völligst darauf aus war. |
Re: Define Properties
schau mal hier:
![]() Edit: stimmt, SetSubComponent gibt es erst ab TComponent stahli |
Re: Define Properties
Zuerst musst du die von TPersistent geerbte Methode Assign überschreiben und dort die Daten aus Source in Self kopieren. Danach musst du noch einen Setter für die Header-Eigenschaft schreiben, in diesem Rufst du dann die Assign-Methode auf. Den Rest übernimmt das Streamingsystem. DefineProperties ist nicht notwendig.
|
Re: Define Properties
Zitat:
Gruß Neutral General |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz