Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Subkomponente unter Eigenschaften und Ereignisse gelistet ??
midan23 - Di 24.08.04 03:31
Titel: Subkomponente unter Eigenschaften und Ereignisse gelistet ??
Zunächst einmal
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| unit u1;
interface
uses classes;
type tSlave = class(tComponent) private fInt : longint; public constructor create(aOwner : tComponent); override; published property Int : longint read fInt write fInt default 20; end;
tMaster = class(tComponent) private fSlave : tSlave; public constructor create(aOwner : tComponent); override; destructor destroy; override; published property Slave : tSlave read fSlave; end;
procedure Register;
implementation
constructor tSlave.create(aOwner : tComponent); begin inherited; fInt := 20; end;
constructor tMaster.create(aOwner : tComponent); begin inherited; fSlave := tSlave.Create(self); fSlave.SetSubComponent(true); end;
destructor tMaster.destroy; begin fSlave.Free; inherited; end;
procedure Register; begin registerComponents('Test',[tMaster]); end;
end. |
Jetzt zum Problem :
So wie der Code oben steht, wird die Eigneschaft
Int von
Slave im Formular gespeichert ... allerdings taucht
Slave auch bei den Ereignissen auf ...
Wenn die Zeile
Delphi-Quelltext
1:
| fSlave.SetSubComponent(true); |
entfernt wird, taucht
Slave zwar nicht mehr bei den Ereignissen auf, allerdings wird die Eigenschaft
Int von
Slave auch nicht mehr im Formular gespeichert ...
Was mache ich da falsch ?
hansa - Di 24.08.04 03:47
Erscheint mir alles etwas seltsam. Schnelldiagnose :
Du leitest beides von TComponent ab. Wieso das ? Die eine Komponente ist eine Property der anderen ? Bei der einen verwendest du nur read und nicht write ? Einmal hast du Create, bei der zweitem auch Destroy ?
Das sieht nach etwas durcheinander aus. Aber für so was ist eigentlich Motzi zuständig. :mrgreen:
midan23 - Di 24.08.04 08:38
Zuerst ein kleiner Hinweis :
Den Code habe ich stark vereinfacht, mein eigentliches Projekt ist etwas umfangreicher ...
hansa hat folgendes geschrieben: |
Du leitest beides von TComponent ab. Wieso das ? |
1. Es hat sich ursprünglich alles um nicht visuelle Komponenten gehandelt (Ist auch einfacher zum Testen ...).
2. die Procedure
SetSubComponent gibt es in
tPersistent nicht.
3. Bei Versuchen hat sich herausgestellt, das bei einer Ableitung von
tPersistent die published properties nicht in der Formulardatei gespeichert wurden ...
Zitat: |
Die eine Komponente ist eine Property der anderen ? |
Nicht ganz, eher eine Subkomponente ähnlich wie zB
Font bei
tEdit ...
Zitat: |
Bei der einen verwendest du nur read und nicht write ? |
Die read / write Property von
Slave dient nur zu Testzwecken.
Die read-only Property von
Master dient nur dazu, die Eigenschaften von
Slave verfügbar zu machen. Ein Ersetzen der Instanz ist in diesem Fall nicht erwünscht.
Zitat: |
Einmal hast du Create, bei der zweitem auch Destroy ? |
Der Constructor von
Slave ist zum Setzten des default-Wertes nötig, den Destructor brauche ich dabei nicht zu überschreiben.
Bei
Master dienen Constructor und Destructor zum Erzeugen bzw Freigeben der
Slave Subkomponente
Motzi - Do 26.08.04 21:06
midan23 hat folgendes geschrieben: |
2. die Procedure SetSubComponent gibt es in tPersistent nicht. |
Wozu brauchst du sie da?
Zitat: |
3. Bei Versuchen hat sich herausgestellt, das bei einer Ableitung von tPersistent die published properties nicht in der Formulardatei gespeichert wurden ... |
Hm.. normalerweise schon, da musst du irgendwas falsch gemacht haben, denn..
Zitat: |
Nicht ganz, eher eine Subkomponente ähnlich wie zB Font bei tEdit ... |
gerade solche "Sub-Properties" wie TFont etc sind alle von TPersistent abgeleitet und TPersistent implementiert auch die ganzen Streaming-Mechanismen die genau dafür (zum Speichern in der DFM) benötigt werden...
Gerade bei solchen Sachen ist es immer ein Problem mit vereinfachtem Code zu arbeiten und dort Fehler zu suchen, aber wenn du magst kannst du mir die Kompo schicken und ich schau sie mir mal an...
midan23 - Fr 27.08.04 09:20
Hi
Motzi hat folgendes geschrieben: |
midan23 hat folgendes geschrieben: | 2. die Procedure SetSubComponent gibt es in tPersistent nicht. |
Wozu brauchst du sie da? |
Um sie als Subkomponente zu deklarieren ?
Ausserdem hatte ich da mal Probleme mit dem Speichern der Eigenschaften ...
Zitat: |
Zitat: | 3. Bei Versuchen hat sich herausgestellt, das bei einer Ableitung von tPersistent die published properties nicht in der Formulardatei gespeichert wurden ... |
Hm.. normalerweise schon, da musst du irgendwas falsch gemacht haben, denn.. |
Kann man den da was falsch machen ?
Zitat: |
Zitat: | Nicht ganz, eher eine Subkomponente ähnlich wie zB Font bei tEdit ... |
gerade solche "Sub-Properties" wie TFont etc sind alle von TPersistent abgeleitet und TPersistent implementiert auch die ganzen Streaming-Mechanismen die genau dafür (zum Speichern in der DFM) benötigt werden... |
So hatte ich es auch gelesen, scheine also doch irgendwo einen bB eingebaut zu haben ...
Zitat: |
Gerade bei solchen Sachen ist es immer ein Problem mit vereinfachtem Code zu arbeiten und dort Fehler zu suchen, aber wenn du magst kannst du mir die Kompo schicken und ich schau sie mir mal an... |
Dürfte unterwegs sein ...
midan23 - Sa 28.08.04 17:32
Problem gelöst, Danke Motzi
1) tSlave muss von tPersistent abgeleitet werden statt von tComponent
2) setSubComponent wird im Constructor von tMaster nicht mehr gebraucht.
3) Die Public Property Slave von tMaster wird auch beschreibbar gemacht.
Hier der funktionierende SourceCode
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| unit u1;
interface
uses classes;
type tSlave = class(tPersistent) private fInt : longint; public constructor create; published property Int : longint read fInt write fInt default 20; end;
tMaster = class(tComponent) private fSlave : tSlave; procedure setSlave(const aSlave : tSlave); public constructor create(aOwner : tComponent); override; destructor destroy; override; published property Slave : tSlave read fSlave write setSlave; end;
procedure Register;
implementation
constructor tSlave.create; begin inherited; fInt := 20; end;
constructor tMaster.create(aOwner : tComponent); begin inherited; fSlave := tSlave.Create; end;
destructor tMaster.destroy; begin fSlave.Free; inherited; end;
procedure tMaster.setSlave(const aSlave : tSlave); begin fSlave.Assign(aSlave); end;
procedure Register; begin registerComponents('Test',[tMaster]); end;
end. |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!