Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Querverweise zwischen TCollectionItems? (dpCollection) (https://www.delphipraxis.net/66800-querverweise-zwischen-tcollectionitems-dpcollection.html)

Phil73 4. Apr 2006 14:19


Querverweise zwischen TCollectionItems? (dpCollection)
 
(Meine Delphi-Version: D7)

Hallo,

ich habe bei Euch die dpCollection unit gefunden und bin sehr begeistert. :-D

Dazu eine Frage: Kann ich auch ein CollectionItem so definieren, daß eine property des Items einen Verweis auf ein anderes beinhaltet? Und werden diese Verweise bei SaveToFile / LoadFromFile auch wieder richtig hergestellt?

Ein erster Versuch meinerseits hat NICHT geklappt (s.u.) :( Gibt es da irgendeinen Trick?

Danke im Voraus,

Philipp

Delphi-Quellcode:
  TmyCollectionItem = class(TCollectionItem)
    private
      fCaption: String;
      fCrossReference: TmyCollectionItem;
    public
      procedure Assign(Source: TPersistent); override;
    published
      property Caption: String read fCaption write fCaption;
      property CrossReference: TmyCollectionItem read fCrossReference write fCrossReference;
  end;
und

Delphi-Quellcode:

{ TmyCollectionItem }
procedure TmyCollectionItem.Assign(Source: TPersistent);
begin
  //Assign values
  if Source is TmyCollectionItem then
  begin
    fCaption := TmyCollectionItem(Source).Caption;
    fCrossReference := TmyCollectionItem(Source).CrossReference;
  end
  else
    inherited Assign(Source);
end;

Phil73 5. Apr 2006 10:33

Re: Querverweise zwischen TCollectionItems? (dpCollection)
 
(Push)

Kennt sich denn keiner aus damit? Oder ist meine Frage zu doof? :gruebel:

Philipp

Jens Schumann 5. Apr 2006 12:07

Re: Querverweise zwischen TCollectionItems? (dpCollection)
 
Hallo,
so wie Du es vor hast wird es nicht funktionieren. Es sieht so aus, als ob Du nur eine Referenz auf das andere TCollectionItem speicherst. Wenn Du das speicherst wird die wahrscheinlich nur die Referenz gespeichert. Wenn die Collection wieder geladen wird, wird wahrscheinlich auch nur die Referenz wiederhergestellt. Was jetzt aber im Arbeitsspeicher an der Stelle liegt ist völlig ungewiss.
Du musst eine Kopie des TCollectionItem speichern. Dann klappt es.

Phil73 5. Apr 2006 12:23

Re: Querverweise zwischen TCollectionItems? (dpCollection)
 
Aha, der Autor persönlich! Vielen Dank für die Antwort!

Zitat:

Zitat von Jens Schumann
Hallo,
so wie Du es vor hast wird es nicht funktionieren. Es sieht so aus, als ob Du nur eine Referenz auf das andere TCollectionItem speicherst.

Genau. Das ist auch so gewollt, denn es soll bei dem Programm von verschiedenen Stellen aus dasselbe (nicht nur das gleiche :wink: ) Object manipuliert werden.

Zitat:

Wenn Du das speicherst wird die wahrscheinlich nur die Referenz gespeichert. Wenn die Collection wieder geladen wird, wird wahrscheinlich auch nur die Referenz wiederhergestellt. Was jetzt aber im Arbeitsspeicher an der Stelle liegt ist völlig ungewiss.
Na ja, meine Experimente haben ergeben, daß der Speicheralgorithmus über die Referenz auf das dadurch referenzierte Object noch mal zugreift und dessen publishe properties noch ein weiteres mal speichert.

Zitat:

Du musst eine Kopie des TCollectionItem speichern. Dann klappt es.
Das hilft mir leider nicht, s.o. :(

Überlegung: Wenn man so was programmieren wollte müßte man doch eigentlich folgendes machen:
1) Alle Objekte und deren published properties wie gehabt speichern, mit Ausnahme der properties, die Referenzen auf Objekte darstellen. Jedes Objekt erhält eine eindeutige (innerhalb der gesamten Datei eindeutige) ID.
2) Wenn der Speicheralgorithmus auf eine Referenz trifft:
a) Prüfen, ob das Referenzierte Objekt schon gespeichert wurde.
JA-> dessen ID als Referenz Speichern
NEIN -> zunächst das Objekt speichern, dann wie bei JA.

(Ladevorgang entsprechend)

usw. Das sollte prinzipiell funktionieren, außer bei zirkulären Referenzen.
Aber die Umsetzung dürfte nicht so einfach sein, oder?

Grüße,

Phil73

Phil73 5. Apr 2006 12:27

Re: Querverweise zwischen TCollectionItems? (dpCollection)
 
*mir selbst widersprech* :wink:

Zitat:

Zitat von Phil73
Das sollte prinzipiell funktionieren, außer bei zirkulären Referenzen.

Das könnte sogar bei zirkulären Referenzen funktionieren, wenn man das Objekt schon zu beginn des Speichervorgangs als "gespeichert" markiert und ihm dann schon eine ID verpaßt... Oder?

Viele Grüße, Phil73

maximov 21. Apr 2006 11:50

Re: Querverweise zwischen TCollectionItems? (dpCollection)
 
Moin,

interessantes vorhaben, welches ich auch schonmal bei einem anderen persistierungs-system umgesetzt habe. Das sah in etwas so aus:
Delphi-Quellcode:
object DialogBG: TVertexSprite
            ...
            Tex = GuiPackman.interface_01
            Animate = False
            AniSpeed = 0.999999984306749000
            Flags = [vsfAlphaBlend]
          end
          object yes: TVertexButton
            ...
            OnMouseUp = ScnGame.router.LevelRequester.DiaLevel._OKHandler
            ButtonKind = bkRollover
            ...
          end
vom prinzip her richtig lässig, von der handhabung was referenzen zu objekten angeht, die nicht zur hierarchie gehören,und im umgang teilweise trickreich.

Zitat:

Das könnte sogar bei zirkulären Referenzen funktionieren, wenn man das Objekt schon zu beginn des Speichervorgangs als "gespeichert" markiert und ihm dann schon eine ID verpaßt... Oder?
du vergisst hier aber, das es sich um das dumme alte delphi-persistierungs-system handelt, welches nunmal über jeden zweifel erhaben ist und sich nicht modifizieren läßt ;(

Du kannst dir aber, mit ein bischen handarbeit, in DefineProperties eigene properties nach herzenslust erfinden. So zB. auf properties, die den pfad zu deiner referenz beschreiben und diesen dann als ident speichern. Das geht natürlich nicht automatisch, aber du kannst ein system erfinden, welches dir dir arbeit abnimmt.

so siehts aus!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 Uhr.

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