Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TStrings (https://www.delphipraxis.net/10075-tstrings.html)

MatthiasW 11. Okt 2003 08:02


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:
MeineCompo.Tabs.Add('Test');
diese sache tritt aber auch auf wenn ich das mache
Delphi-Quellcode:
var TempTabs: TStrings;
begin
  TempTabs := MeineCompo.Tabs;
  TempTabs.Add('Test');
  MeineCompo.Tabs := TempTabs;
end;
Ich weiß echt net was ich hier verkehrt mache

Mfg Matthias

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]

Ghostwalker 11. Okt 2003 09:37

Re: TStrings
 
ich nehm mal an die Property ist wie folgt definiert:

Code:
  Property Tabs : TStrings read ftabs write SetTabs
oder

Code:
  Property Tabs: TStrings read GetTabs write SetTabs
   :
   :
  function GetTabs:TStrings;
  begin
    result := fTabs;
  end;
Da dir der Read-Zugriff das Objekt (bzw. die Objekt-instanz) zurrückgibts beim, direkten zugriff, Umgehst du quasi den Property-Mechanismuß.

Jens Schumann 11. Okt 2003 09:48

Re: TStrings
 
Hallo,
eine andere Möglichkleit wäre, das der Compiler die Zeile
Delphi-Quellcode:
MeineCompo.Tabs := TempTabs;
gar nicht mit in das Kompilat mit aufnimmt. D.h. weg optimiert, da die Zeile ja quasi überflüssig ist.
Delphi-Quellcode:
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;
Evt. ist der Compiler ja so schlau und merkt das. Wenn dem so ist, wird auch nicht der entsprechende Setter aufgerufen.

MatthiasW 11. Okt 2003 11:33

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

Christian Seehase 11. Okt 2003 12:55

Re: TStrings
 
Moin Matthias,

so müsste es eigentlich gehen:

Delphi-Quellcode:
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;
Wichtig:
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)

MatthiasW 11. Okt 2003 17:09

Re: TStrings
 
Hallo,

Zitat:

Zitat von Christian Seehase
Moin Matthias,

so müsste es eigentlich gehen:

Delphi-Quellcode:
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;
Wichtig:
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)

irgendwie klappt das ganze net, ich bekomm immer ne Zugriffsverletzung :? wenn ich versuche den TempTabs wieder zuzuweisen (nach dem Free).

Mfg Matthias

Christian Seehase 11. Okt 2003 17:46

Re: TStrings
 
Moin Matthias,

Zitat:

Zitat von MatthiasW
wenn ich versuche den TempTabs wieder zuzuweisen (nach dem Free).

jetzt versteh' ich nicht was Du meinst.
Könntest Du mal den Source zeigen?

Jens Schumann 11. Okt 2003 18:25

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:
procedure TMeineCompo.SetTabs(const Value: TStrings);
begin
  FTabs.Assign(Value);
end;
Wenn Du im Source dann MeineCompo.Tabs.Free aufrufst, muss eine Schutzverletzung bei MeineCompo.Tabs:=TempTabs kommen.

Christian Seehase 11. Okt 2003 18:38

Re: TStrings
 
Moin Jens,

stimmt.
Dann müsste mein Beispiel so aussehen.

Delphi-Quellcode:
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;
Jetzt ist allerdings der Nachteil, dass man bei einer Zuweisung mit := nicht damit rechnet, dass intern Assign benutzt wird.
Dafür gibt es ja extra := und Assign ;-)
Wenn ich:
Delphi-Quellcode:
MeineCompo.Tabs := TempTabs;
schreibe, erwarte ich, dass MeineCompo.Tabs auf das gleiche Objekt zeigt, wie TempTabs, und keine Kopie erhält.

Jens Schumann 11. Okt 2003 19:13

Re: TStrings
 
Hallo Christian,
interessanter Ansatz
Zitat:

schreibe, erwarte ich, dass MeineCompo.Tabs auf das gleiche Objekt zeigt, wie TempTabs, und keine Kopie erhält.
Was erwartest Du denn bei AObject.Brush:=MyBrush oder AObject.Font:=MyFont usw. ?

[edit=Christian Seehase]Doppelposting gelöscht. Mfg, Christian Seehase[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:06 Uhr.
Seite 1 von 2  1 2      

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