AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStrings

Ein Thema von MatthiasW · begonnen am 11. Okt 2003 · letzter Beitrag vom 12. Okt 2003
Antwort Antwort
Seite 1 von 2  1 2      
MatthiasW

Registriert seit: 29. Jan 2003
Ort: Reichenbach
253 Beiträge
 
Delphi 2009 Professional
 
#1

TStrings

  Alt 11. Okt 2003, 09:02
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. Hat jemand ne idee wieso?

Ich mache folgendes:
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]
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: TStrings

  Alt 11. Okt 2003, 10:37
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ß.
Uwe
e=mc² or energy = milk * coffee²
  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: TStrings

  Alt 11. Okt 2003, 10:48
Hallo,
eine andere Möglichkleit wäre, das der Compiler die ZeileMeineCompo.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.
  Mit Zitat antworten Zitat
MatthiasW

Registriert seit: 29. Jan 2003
Ort: Reichenbach
253 Beiträge
 
Delphi 2009 Professional
 
#4

Re: TStrings

  Alt 11. Okt 2003, 12:33
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: TStrings

  Alt 11. Okt 2003, 13:55
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)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
MatthiasW

Registriert seit: 29. Jan 2003
Ort: Reichenbach
253 Beiträge
 
Delphi 2009 Professional
 
#6

Re: TStrings

  Alt 11. Okt 2003, 18:09
Hallo,

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
Hilfe wir stürzen ab!!!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: TStrings

  Alt 11. Okt 2003, 18:46
Moin Matthias,

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?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  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
 
#8

Re: TStrings

  Alt 11. Okt 2003, 19:25
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: TStrings

  Alt 11. Okt 2003, 19:38
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:
MeineCompo.Tabs := TempTabs; schreibe, erwarte ich, dass MeineCompo.Tabs auf das gleiche Objekt zeigt, wie TempTabs, und keine Kopie erhält.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  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
 
#10

Re: TStrings

  Alt 11. Okt 2003, 20:13
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]
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:02 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