![]() |
TStringList(en) in DMF serialisieren
Seit längerer Zeit habe ich mal wieder eine Komponente erstellt (XE3).
Die published Properties werden in der DFM gespeichert. Jetzt habe ich einige TStringList-Properties eingeführt. Ich kann die über den OI zum bearbeiten öffnen. Die IDE schmiert dann aber beim Schließen des Editors oder beim Speichern des Projektes ab. Kann man vielleicht nur TStrings in die DFM serialisieren? Sonst wüsste ich nicht, wo das Problem liegen soll. Ich hatte in der Nacht nicht mehr die Zeit, das testweise umzustellen. (Wenn das die Ursache wäre, sollte Emba vielleicht mal nachbessern und den Absturz absichern. Kann natürlich auch sein, dass ich da etwas verbockt hatte. War schon spät. ;-) ) |
AW: TStringList(en) in DMF serialisieren
Ob TStringList wirklich buggt beim Serialisieren weiß ich nicht, aber deklariere die Property doch einfach als TStrings und behalte zur Initialisierung TStringList.Create bei :) Falls das auch nicht funktioniert, muss der Fehler noch an anderer Stelle liegen.
|
AW: TStringList(en) in DMF serialisieren
Also an TStringList liegt es nicht.
Es gibt aber alle möglichen Abbrüche. Ich habe jetzt mal die IDE debuggt. Jetzt erhalte ich aktuell die Fehlermeldung: Element '' hat kein übergeordnetes Fenster. Ich habe aber gar kein sichtbares Control im Formular und auch keines dynamisch erzeugt. Ich werde mal noch eine Testkomponente erstellen (obwohl ich die originale bis auf die primitiven Properties schon komplett entfrachtet habe) und die ggf. auch mal hier anhängen. Zuvor werde ich mal noch ein Delphi-Repair versuchen und eine neue Formularanwendung versuchen. Vielleicht ist ja mit dem Projekt etwas faul... Irgendwie scheint das am Delphi zu liegen. Oder kann jemand vielleicht mit dem CallStack etwas anfangen? Zitat:
|
AW: TStringList(en) in DMF serialisieren
Liste der Anhänge anzeigen (Anzahl: 1)
:pale:
Also ich habe mal ein Delphi-Repair versucht. Das blieb hängen, da irgendwelche Dateien nicht wiederhergestellt und auch nicht aus dem Netz geladen werden konnte. Nach Abbruch war Delphi nicht mehr vorhanden. Also habe ich ein Systembackup eingespielt. Das Problem besteht hier auch. Kann mal jemand die Komponente testen? Anbei ein XE3-Projekt. Folgendes wäre auszuführen: - Projektgruppe laden - Install des Comp-Packages - im Formularprojekt die Komponente in das Formular einsetzen - Property SL_A öffnen und Text definieren - Editor schließen - Projekt speichern -> klappt das??? Ich mache doch da nichts falsch - oder? Spinnt mein Delphi? Ist das ein Bug? |
AW: TStringList(en) in DMF serialisieren
Hallo,
so gehts
Delphi-Quellcode:
Problem ist der Designtime-Editor. Der gibt ein neues Objekt (vermutlich TMemo.Lines) ins Property und geht davon aus das die Componente die Referenz nicht übernimmt und gibt es anschliesend frei.
unit TestComp;
interface uses System.Classes; type TTestComp = class(TComponent) private fX1: String; fX2: Word; fX3: String; fSL_A: TStringList; fSL_B: TStringList; fSL_C: TStringList; fSL_D: TStringList; procedure SetSL_A(const Value: TStringList); procedure SetSL_B(const Value: TStringList); procedure SetSL_C(const Value: TStringList); procedure SetSL_D(const Value: TStringList); protected public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property X1: String read fX1 write fX1; property X2: Word read fX2 write fX2; property X3: String read fX3 write fX3; property SL_A: TStringList read fSL_A write SetSL_A; property SL_B: TStringList read fSL_B write SetSL_B; property SL_C: TStringList read fSL_C write SetSL_C; property SL_D: TStringList read fSL_D write SetSL_D; end; procedure Register; implementation uses System.SysUtils; procedure Register; begin RegisterComponents('TestComp', [TTestComp]); end; { TTestComp } constructor TTestComp.Create(AOwner: TComponent); begin inherited; fSL_A := TStringList.Create; fSL_B := TStringList.Create; fSL_C := TStringList.Create; fSL_D := TStringList.Create; end; destructor TTestComp.Destroy; begin FreeAndNil(fSL_A); FreeAndNil(fSL_B); FreeAndNil(fSL_C); FreeAndNil(fSL_D); inherited; end; procedure TTestComp.SetSL_A(const Value: TStringList); begin fSL_A.Assign(Value); end; procedure TTestComp.SetSL_B(const Value: TStringList); begin fSL_B.Assign(Value); end; procedure TTestComp.SetSL_C(const Value: TStringList); begin fSL_C.Assign(Value); end; procedure TTestComp.SetSL_D(const Value: TStringList); begin fSL_D.Assign(Value); end; end. einbeliebigername. |
AW: TStringList(en) in DMF serialisieren
Vielen Dank!!!
Wie hast Du das heraus gefunden? Ist das irgendwo dokumentiert? Oder ist das eher ein Bug? |
AW: TStringList(en) in DMF serialisieren
Hallo,
Zitat:
Alle Properties deren Typ von TPersistent aber nicht von TComponent erbt, werden per Setter und Assign gesetzt! Habe das auch schon mal anders gemacht und hab dann später über mich selbst geflucht. Und dann fehlte nur noch eine Begründung, wieso man das bei diesem Beispiel auch nicht anders machen darf. Da half ein Haltepunkt im Setter. Angehalten wurde nur nach dem Ok im Propertyeditor und Value zeigt tatsächlich auf ein anderes Objekt. Und meine Vermutung, dass dort als Objekt eine TMemo.Lines übergeben wird, kommt daher das es nur zwei sinnvolle Wege gibt wie man mit Rtti so ein Proberty setzen kann. 1. Mit Rtti holt man sich die Objektreferenz aus dem Property, Castet diese nach TPersistent und ruf Assign auf. Dann würde aber der Setter nicht getriggert. 2. Man baut ein Objekt welches von TStrings erbt und schmeißt per Rtti die Referenz in den Setter. Und das wird im XE5 und XE8 (und vermutlich auch im XE10.2) so gemacht. TMemo war auch fast richtig. Der Typ von Value beim Ok im Propertyeditor ist tatsächlich TRichEditStrings. Also aufgepasst bei published Properties mit Typen welche von TStrings erben. einbeliebigername. |
AW: TStringList(en) in DMF serialisieren
Ok vielen Dank!
Dann muss man sich das halt merken oder beim nächsten Mal diesen Thread finden. ;-) |
AW: TStringList(en) in DMF serialisieren
Der DFM-Reader/Writer hat halt nur die Strings von "TStrings" serialisiert.
Strings.Objects wird ebenfalls nicht automatisch serialisiert ... wie auch. Und da der TStrings-PropertyEditor "nur" eine TStringList für die Bearbeitung verwendet, kann und darf er seine Editor-Instanz auch garnicht rein geben. PS: Ein TMemo hat ein TMemoStrings im Lines, da funktioniert dann garnichts mehr, wenn TMemo diese durch eine TStringList austauschen würde. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:55 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