AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi DFM speichert kein Objekt im Objekt als published property
Thema durchsuchen
Ansicht
Themen-Optionen

DFM speichert kein Objekt im Objekt als published property

Ein Thema von H4ndy · begonnen am 10. Nov 2009 · letzter Beitrag vom 28. Nov 2009
Antwort Antwort
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#1

DFM speichert kein Objekt im Objekt als published property

  Alt 10. Nov 2009, 14:51
Hallo,

Mal wieder ein kleines Problemchen.

Ich hab eine visuelle Komponente erstellt, welche wiederum ein spezielles Objekt als eigene published property hat, so dass man dieses Objekt im Objektinspektor aufklappen und dort eben die Eigenschaft direkt ändern kann. Jedoch werden diese Änderungen nicht in der DFM gespeichert (und somit nach dem erneuten Öffnen und im Programm verschwunden sind).

Muss ich da noch irgendetwas angeben, so dass Delphi die Eigenschaften des Objektes in der DFM mit ablegt?
Im Moment wird das Objekt im private vorgehalten und im Constructor/Destructor jeweils angelegt und weggeworfen.
In der DFM steht dann nur "MeinUnterObjektProperty = MutterObjekt.FPrivatesUnterObjekt", was ja prinzipiell richtig ist, aber nicht das ist, was ich will.

Platform ist Delphi 7 unter Windows XP.

Hier vereinfacht (darf leider keinen Original-Quelltext liefern):

Delphi-Quellcode:
  TMeineKomponente = class(TVorfahre)
  private
    { Private-Deklarationen }
    FUnterobjekt: TWasAnderes;

  protected
    procedure SetUnterobjekt(Value: TWasAnderes);
    function GetUnterobjekt: TWasAnderes;
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

  published
    { Published-Deklarationen }
    property Unterobjekt: TWasAnderes read GetUnterobjekt write SetUnterobjekt;
  end;
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: DFM speichert kein Objekt im Objekt als published proper

  Alt 10. Nov 2009, 14:57
Die Objekt-(De)Serialisierung speichert/lädt keine Objekte in Porperties!
Abgesehn von ein paar ausnahmen TCollection und dessen Items, TStrings und k.A. was sonst noch.

Aber eigentlich dachte ich, es werden zumindestens die Objekteigenschaften gespeichert.
Und es gäbe "nur" beim Laden Probleme, da derartige Objekte nicht von der VCL erstellt werden, sondern höchsten, wenn das Objekt vorhanden ist, die Eingenschaften geladen werden.

[edit]
ich glaub es ist eher so:
- es werden alle Eigenschaften und die Eigenschaften von Objekten in Published Properties gespeichert, sowie die Eigenschaften von Objekten in den Items von TCollection

- bei Laden werden aber nur Eigenschaften in schon existierende Objekte geladen, sowie Objekte in den Item von TCollection (und eventuell noch ähnlichen Container-Klassen) erstellt ... sonst Keine.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#3

Re: DFM speichert kein Objekt im Objekt als published proper

  Alt 11. Nov 2009, 10:16
Hmm Schade, da muss ich das mit den Eigenschaften Speichern irgendwie anders lösen, aber erstmal Danke für die Hinweise. Findet sich leider kaum was zu dem Thema...
Manuel
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#4

Re: DFM speichert kein Objekt im Objekt als published proper

  Alt 11. Nov 2009, 10:28
Hi,

@Himi - das geht doch viel einfacher (1 Zeile!)

normalerweise geht das durch einen Aufruf von SetSubComponent(True); im Konstruktor der Unterkomponente.

Ich kann bestätigen, das das mit Delphi 2006-2010 ohne Probleme funktioniert. Im Objekt Inspektor wird dann der Property-Baum für die Subkomponente dann grün dargestellt. Alles, was geändert wird, wird zusammen mit der Hauptkomponente dann in der DFM gespeichert.

Abeeer: Für D6 gab es einen QC Eintrag zu SetSubComponent. Laut QC ist das in D7 gefixt, mußt aber selber mal testen ob es keine Probleme gibt: http://qc.embarcadero.com/wc/qcmain.aspx?d=1732

Edit: Das Unterobjekt muß natürlich weiterhin im Kontruktor der Hauptkomponente erstellt und im Destruktor freigegeben werden. Es geht hier nur um das automatisch speichern und laden der Einstellungen. Ersatzbar zur Laufzeit ist die Unterkomponente natürlich auch, vorherige freigeben und neue zuweisen (meinetwegen auch über die published Property oder besser über einen entsprechenden getter/setter wie oben erwähnt).

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#5

Re: DFM speichert kein Objekt im Objekt als published proper

  Alt 11. Nov 2009, 10:58
Wow, das funktioniert perfekt!
Ich bedanke mich
Manuel
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#6

Re: DFM speichert kein Objekt im Objekt als published proper

  Alt 11. Nov 2009, 10:59
Hi,

Zitat von H4ndy:
Wow, das funktioniert perfekt!
Ich bedanke mich
Bitte, gerne!



Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: DFM speichert kein Objekt im Objekt als published proper

  Alt 19. Nov 2009, 12:16
Hab mich auch mal wieder an meinen Serialisierer gesetzt (dabei dachte ich, der wäre soweit erstmal fertig )

Also es gibt dann wohl *3* 4 verschiedene Fälle, wie man Objekte in den published Properties behandeln müßte

1: es wird nur der Name gespeichtert und beim Laden wird ein vorhandenes Objekt gesucht (wie bei Form.ActiveControl)
2: es werden die Werte des darin enthaltenen Objektes gespeichtert/geladen
3: es wird, zusätzlich zu 2, auch noch das Objekt erstellt, wenn es beim Laden noch nicht existiert
4: es darf nichts gespeichert werden

Aber wie kann man das denn nun ordentlich unterscheiden, was zu machen wäre?

csSubComponent = 3 oder 2 ?
csTransient = 4
$2B or not $2B
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#8

Re: DFM speichert kein Objekt im Objekt als published proper

  Alt 19. Nov 2009, 12:40
Hi himitsu,

Zitat von himitsu:
Also es gibt dann wohl *3* 4 verschiedene Fälle, wie man Objekte in den published Properties behandeln müßte

1: es wird nur der Name gespeichtert und beim Laden wird ein vorhandenes Objekt gesucht (wie bei Form.ActiveControl)
2: es werden die Werte des darin enthaltenen Objektes gespeichtert/geladen
3: es wird, zusätzlich zu 2, auch noch das Objekt erstellt, wenn es beim Laden noch nicht existiert
4: es darf nichts gespeichert werden

Aber wie kann man das denn nun ordentlich unterscheiden, was zu machen wäre?

csSubComponent = 3 oder 2 ?
csTransient = 4
1. dürfte Probleme machen, wenn die Subkomponente keinen Namen hat - und das ist ja durchaus möglich wenn diese im Konstruktor der Hauptkompo erzeugt wird.

Ich würde jetzt sagen csSubComponent in der Regel 2 und csTransient immer 4 (entspricht ja auch der OH). Für 3. dürfte es eigentlich keine Verwendung geben, da wenn das Subproperty nicht erstellt ist der Komponentenentwickler dafür sorgen muß, daß es auf nil zeigt. Sonst würde es in der IDE im OI eh krachen.

Überlicherweise sind die OI Eigenschaften von Subkomponenten ja eigene Instanzen der Hauptkomponente die im Konstruktor und Desktruktor erstellt und freigeben werden. Wenn der Entwickler die Subkomponente ersetzt, erfolgt das ja überlicherweise zur Laufzeit (Assign o.ä.), also per Code. Mir ist auch kein Weg bekannt, das im OI anders zu handeln.

Also nehm' ich 2 und 4.

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

Re: DFM speichert kein Objekt im Objekt als published proper

  Alt 19. Nov 2009, 12:51
Die 3 würde doch .Components der Form entsprechen, wo doch auch der DFM-Deserialisierer die Komponenten erstellt.
Und theoretisch könnte sowas auch bei einem Einzelproperty möglich sein.
$2B or not $2B
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#10

Re: DFM speichert kein Objekt im Objekt als published proper

  Alt 28. Nov 2009, 17:50
Hallo himitsu,

hab in der Mailflut die Antwortbenachrichtigung total übersehen...

Zitat von himitsu:
Die 3 würde doch .Components der Form entsprechen, wo doch auch der DFM-Deserialisierer die Komponenten erstellt.
Und theoretisch könnte sowas auch bei einem Einzelproperty möglich sein.
Das stimmt zwar theoretisch, aber in der Praxis ist mir der Fall bei anderen Komponenten noch nicht (bewußt) untergekommen. Ich denke auch, das würde die IDE nicht zulassen.

Üblicherweise wäre auch dann die Relation ja Form zu Subkomponente im Erstellungsprozess und in der Verknüpfung der Abhängigkeit Hauptkomponente zu Subkomponente.

Gruß Assertor
Frederik
  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 09:37 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