![]() |
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:
und
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;
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; |
Re: Querverweise zwischen TCollectionItems? (dpCollection)
(Push)
Kennt sich denn keiner aus damit? Oder ist meine Frage zu doof? :gruebel: Philipp |
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. |
Re: Querverweise zwischen TCollectionItems? (dpCollection)
Aha, der Autor persönlich! Vielen Dank für die Antwort!
Zitat:
Zitat:
Zitat:
Ü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 |
Re: Querverweise zwischen TCollectionItems? (dpCollection)
*mir selbst widersprech* :wink:
Zitat:
Viele Grüße, Phil73 |
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:
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.
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 Zitat:
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 21:00 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-2025 by Thomas Breitkreuz