Autor Beitrag
midan23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 48

Win XP, Mac OS X, Linux
D6 Pers, XCode 2.1, Python
BeitragVerfasst: Di 24.08.04 03:31 
Zunächst einmal
ausblenden volle Höhe 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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:

_________________
Gruß
Hansa
midan23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 48

Win XP, Mac OS X, Linux
D6 Pers, XCode 2.1, Python
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
midan23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 48

Win XP, Mac OS X, Linux
D6 Pers, XCode 2.1, Python
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 48

Win XP, Mac OS X, Linux
D6 Pers, XCode 2.1, Python
BeitragVerfasst: 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
ausblenden volle Höhe 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.