Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kniffliges Problem beim Serialisieren (https://www.delphipraxis.net/85737-kniffliges-problem-beim-serialisieren.html)

marabu 7. Feb 2007 17:59

Re: Kniffliges Problem beim Serialisieren
 
Nicht lachen jetzt, aber es steht bei mir direkt unter Delphi-Referenz durchsuchenGetChildren

SMALLID 7. Feb 2007 20:43

Re: Kniffliges Problem beim Serialisieren
 
Hmm, bei mir nicht direkt. Also ich meine ich wäre von WriteComponent nicht zu GetChildren gekommen und GetChildren hat auch nur bei TCustomForm eine Beschreibung. Bei TComponent taucht die Methode nichteinmal in der Liste auf.

Zitat:

TCustomForm.GetChildren Methode

Gibt die untergeordneten Komponenten des Formulars zurück (also die Komponenten, deren Methode GetParentComponent das Formular zurückgibt).
Klasse
TCustomForm

Syntax


Delphi-Quellcode:
 procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;

Beschreibung
Das Streamingsystem der Komponente ruft GetChildren auf, um die Ausführung eines Callback-Aufrufs für jede untergeordnete Komponente im Formular durch das Formular anzufordern. Die Callback-Aufrufe müssen in der Reihenfolge der Erstellung (Reihenfolge der untergeordneten Komponenten in der Formulardatei) erfolgen. Als untergeordnete Komponente gilt jede Komponente, die dieses Formular als Rückgabewert ihrer Methode GetParentComponent übergibt.

Proc ist die für jede untergeordnete Komponente auszuführende Callback-Funktion.

Root gibt die Top-Level-Komponente (beisielsweise ein Formular oder ein Datenmodul) an, die derzeit geladen oder gespeichert wird.
In TCustomForm-Objekten ruft GetChildren zunächst die geerbte Methode auf, die dann für jedes Steuerelement, das dieses Formular in seiner Eigenschaft Parent angibt, die Funktion in Proc ausführt. Bezeichnet der Parameter Root dieses Formular, führt GetChildren die in Proc angegebene Funktion anschließend auch für alle untergeordneten Komponenten aus, deren Eigenschaft Parent keinen Wert enthält.

oki 7. Feb 2007 21:03

Re: Kniffliges Problem beim Serialisieren
 
Das sieht doch schon mal gut aus. GetChildren ist auch bei mir unter TComponent zu finden. Ganz klar ist mir die Benutzung aber noch nicht.

Gruß oki

SMALLID 7. Feb 2007 21:58

Re: Kniffliges Problem beim Serialisieren
 
Also haltet mich für dumm oder so, aber ehrlich gesagt habe ich auch nicht so richtig Ahnung, was ich mit dem Parameter Proc anfangen soll :( Weiß da jemand Bescheid?

marabu 8. Feb 2007 09:00

Re: Kniffliges Problem beim Serialisieren
 
Hallo,

schau mal:

Delphi-Quellcode:
interface

uses
  Classes;

type
  TDemoComponent = class(TComponent)
    procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
  end;

implementation

procedure TDemoComponent.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
  i: Integer;
begin
  for i := 0 to Pred(ComponentCount) do
    if not Components[i].HasParent then
      Proc(Components[i]);
end;
Wenn du ComponentA in deinem Testprojekt aus der Klasse TDemoComponent erzeugst und einen Haltepunkt in der Methode GetChildren() einbaust, dann wirst du schon sehen.

Du solltest aber schon noch ein wenig Zeit in das Studium der Delphi Streaming Funktionalität investieren, denn nur mit der Methode GetChildren() könntest du sonst schon bald ein Opfer des Eisberg-Syndroms werden. Nimm alleine mal die Methode HasParent. Neben Owner (object life cycle) und Parent (visibility) findest du dort ein weiteres Konzept (active or passive streaming).

Freundliche Grüße

oki 8. Feb 2007 13:41

Re: Kniffliges Problem beim Serialisieren
 
Joop,
da waren sie wieder meine drei Probleme. Der Verdacht mit dem Eisberg-Syndroms drängt sich automatisch auf. aber trotzdem der Standard-Spruch: "Jo, jetzt ist das klar." :lol:

Ich werd mir diesen thread mal in die Favoriten legen. Zum Glück steh ich momentan nicht vor diesem Problem. Aber sicher bald.

Gruß oki

SMALLID 8. Feb 2007 21:18

Re: Kniffliges Problem beim Serialisieren
 
Ich weine gleich :(

VIelen Dank für eure Hilfe. Das mit dem GetChildren klappt wunderbar. Jetzt tritt aber das nächste Problem auf.
Er schreibt nun alle Eigenschaften ordentlich in den Stream. Dann will ich sie wieder lesen und bekomme die Meldung "EReadError - Fehler beim Lesen von Neu5.priceMasterFS: Ungültiger Eigenschaftswert"

:(

Jetzt sitze ich schon über 2 Tage an diesem sch...önen Speichern/Laden Problem :/

oki 8. Feb 2007 21:26

Re: Kniffliges Problem beim Serialisieren
 
Hatte es denn ohne GetChildren geklappt? Vielleicht steckt das Problem ja auch wo anders.

Gruß oki

SMALLID 9. Feb 2007 00:39

Re: Kniffliges Problem beim Serialisieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
An GetChildren lag es nicht. Das Problem habe ich dadurch gelöst, dass ich in "DefineProperties" eine Anweisung "DefineProperty(...)" hatte, die den gleichen Namen definierte, wie schon im interface Teil eine property hieß.
Ich hatte also eine property priceMasterFS und habe dann in DefineProperties "DefineProperty('priceMasterFS', ...) stehen gehabt. Als ich das durch reinen Zufall auf "DefineProperty('price', ...)" geändert hab, ging es dann. Very strange. Durch die Hilfe oder so wäre ich leider nie darauf gekommen.

Jetzt aber doch noch mal zu GetChildren und Co. Das Speichern funktioniert wunderbar (siehe Code unten, das ist die Datei die dabei rauskommt). Aber wenn ich das wieder lade werden die Agenten, die normalerweise dem Agentpool untergeordnet sind direkt dem Formular untergeordnet (obwohl's in der gespeicherten Datei richtig steht). Hab ich da nochwas vergessen?

oki 9. Feb 2007 06:49

Re: Kniffliges Problem beim Serialisieren
 
Moin,

also wissen tu ich es auch nicht. Mach den Owner doch mal so sichtbar, dass er mit in die Datei aufgenommen wird. Vielleicht wird er dann beim Laden explizit richtig gesetzt. Im Moment sieht das so aus, dass durch getChieldren zwar alle Subcompos beim Speichern berücksichtgt werden, aber beim laden der Owner nicht aus der Tree-hirarchie ermittelt wird. Ich denke ein explizites sichtbar machen des Owners und dessen Laden könnte eventuell das Problem lösen.

Gruß oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz