AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Querverweise zwischen TCollectionItems? (dpCollection)
Thema durchsuchen
Ansicht
Themen-Optionen

Querverweise zwischen TCollectionItems? (dpCollection)

Ein Thema von Phil73 · begonnen am 4. Apr 2006 · letzter Beitrag vom 21. Apr 2006
Antwort Antwort
Phil73

Registriert seit: 1. Feb 2005
7 Beiträge
 
Delphi 7 Professional
 
#1

Querverweise zwischen TCollectionItems? (dpCollection)

  Alt 4. Apr 2006, 14:19
(Meine Delphi-Version: D7)

Hallo,

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

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;
  Mit Zitat antworten Zitat
Phil73

Registriert seit: 1. Feb 2005
7 Beiträge
 
Delphi 7 Professional
 
#2

Re: Querverweise zwischen TCollectionItems? (dpCollection)

  Alt 5. Apr 2006, 10:33
(Push)

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

Philipp
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Querverweise zwischen TCollectionItems? (dpCollection)

  Alt 5. Apr 2006, 12:07
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Phil73

Registriert seit: 1. Feb 2005
7 Beiträge
 
Delphi 7 Professional
 
#4

Re: Querverweise zwischen TCollectionItems? (dpCollection)

  Alt 5. Apr 2006, 12:23
Aha, der Autor persönlich! Vielen Dank für die Antwort!

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 ) 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
  Mit Zitat antworten Zitat
Phil73

Registriert seit: 1. Feb 2005
7 Beiträge
 
Delphi 7 Professional
 
#5

Re: Querverweise zwischen TCollectionItems? (dpCollection)

  Alt 5. Apr 2006, 12:27
*mir selbst widersprech*

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
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Querverweise zwischen TCollectionItems? (dpCollection)

  Alt 21. Apr 2006, 11:50
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!
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 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