![]() |
TStrings
Hallo,
ich habe eine Eigenschaft Tabs vom Typ TStrings in meiner Kompo. Wenn ich jetzt diese über den Propertyeditor von Delphi bearbeite wird die "Set" - Methode der Eigenschaftendefinition korrekt aufgrufen, wenn ich aber jetzt per Code diese Eigenschaft bearbeite dann wird die Set - Methode nicht aufgerufen:shock:. Hat jemand ne idee wieso? Ich mache folgendes:
Delphi-Quellcode:
diese sache tritt aber auch auf wenn ich das mache
MeineCompo.Tabs.Add('Test');
Delphi-Quellcode:
Ich weiß echt net was ich hier verkehrt mache
var TempTabs: TStrings;
begin TempTabs := MeineCompo.Tabs; TempTabs.Add('Test'); MeineCompo.Tabs := TempTabs; end; Mfg Matthias [edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit] |
Re: TStrings
ich nehm mal an die Property ist wie folgt definiert:
Code:
oder
Property Tabs : TStrings read ftabs write SetTabs
Code:
Da dir der Read-Zugriff das Objekt (bzw. die Objekt-instanz) zurrückgibts beim, direkten zugriff, Umgehst du quasi den Property-Mechanismuß.
Property Tabs: TStrings read GetTabs write SetTabs
: : function GetTabs:TStrings; begin result := fTabs; end; |
Re: TStrings
Hallo,
eine andere Möglichkleit wäre, das der Compiler die Zeile
Delphi-Quellcode:
gar nicht mit in das Kompilat mit aufnimmt. D.h. weg optimiert, da die Zeile ja quasi überflüssig ist.
MeineCompo.Tabs := TempTabs;
Delphi-Quellcode:
Evt. ist der Compiler ja so schlau und merkt das. Wenn dem so ist, wird auch nicht der entsprechende Setter aufgerufen.
var TempTabs: TStrings;
begin TempTabs := MeineCompo.Tabs; // TempTabs zeigt auf MeineCompo.Tabs d.h TempTabs ist "identisch" mit MeineCompo.Tabs !!! TempTabs.Add('Test'); MeineCompo.Tabs := TempTabs; // Da TempTabs und MeineCompo.Tabs "identisch" sind, kann man diese Zeile auch weglassen end; |
Re: TStrings
Hallo,
ja du hast recht das optimiert der weg. Aber die Frage die sich mir nachwievor stellt ist wie komme ich dazu das der auch bei dieser art Zuweisung meine "SetTabs" - Funktion aufruft? Nagut eine möglichkeit wäre einen Timer zu installieren, aber mit performance hat das dann nix mehr zu tun. Mfg Matthias |
Re: TStrings
Moin Matthias,
so müsste es eigentlich gehen:
Delphi-Quellcode:
Wichtig:
var
TempTabs : TStringList; // TStrings ist eine abstrakte Klasse, von der man keine Instanzen bilden sollte. begin TempTabs := TStringList.Create; // Temporäre Liste erzeugen TempTabs.Assign(MeineCompo.Tabs); // und den Inhalt (ggf. samt Objekten) aus der anderen Liste übernehmen TempTabs.Add('Test'); // neue Zeile hinzufügen MeineCompo.Tabs.Free; // Ursprungsliste freigeben, da sie sonst nicht mehr erreicht werden kann MeineCompo.Tabs := TempTabs; // Temporäre Liste als neu zuweisen => müsste jetzt SetTabs aufrufen end; TStrings als Typ anzugeben, ist in Ordnung, ja sogar sinnvoll, da man dann alle Objekte, deren Typ eine von TStrings abgeleitete Klasse ist, übergeben kann. Nur eine Instanz von TStrings sollte man nicht erstellen. (Bei entsprechender Einstellung, gibt der Compiler da auch eine Warnung aus) |
Re: TStrings
Hallo,
Zitat:
Mfg Matthias |
Re: TStrings
Moin Matthias,
Zitat:
Könntest Du mal den Source zeigen? |
Re: TStrings
Hallo Christian,
da MeineCompo.Tabs komponentenintern wahrscheinlich als TStrings deklariert ist und im constructor der Komponente hoffentlich min. als TStringlist erzeugt wird, sollte der Setter folgendermaßen aussehen
Delphi-Quellcode:
Wenn Du im Source dann MeineCompo.Tabs.Free aufrufst, muss eine Schutzverletzung bei MeineCompo.Tabs:=TempTabs kommen.
procedure TMeineCompo.SetTabs(const Value: TStrings);
begin FTabs.Assign(Value); end; |
Re: TStrings
Moin Jens,
stimmt. Dann müsste mein Beispiel so aussehen.
Delphi-Quellcode:
Jetzt ist allerdings der Nachteil, dass man bei einer Zuweisung mit := nicht damit rechnet, dass intern Assign benutzt wird.
var
TempTabs : TStringList; // TStrings ist eine abstrakte Klasse, von der man keine Instanzen bilden sollte. begin TempTabs := TStringList.Create; // Temporäre Liste erzeugen try TempTabs.Assign(MeineCompo.Tabs); // und den Inhalt (ggf. samt Objekten) aus der anderen Liste übernehmen TempTabs.Add('Test'); // neue Zeile hinzufügen MeineCompo.Tabs := TempTabs; // Temporäre Liste als neu zuweisen => müsste jetzt SetTabs aufrufen finally FreeAndNil(TempTabs); end; end; Dafür gibt es ja extra := und Assign ;-) Wenn ich:
Delphi-Quellcode:
schreibe, erwarte ich, dass MeineCompo.Tabs auf das gleiche Objekt zeigt, wie TempTabs, und keine Kopie erhält.
MeineCompo.Tabs := TempTabs;
|
Re: TStrings
Hallo Christian,
interessanter Ansatz Zitat:
[edit=Christian Seehase]Doppelposting gelöscht. Mfg, Christian Seehase[/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:43 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