AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Setter einer TStrings-Property wird nicht aufgerufen
Thema durchsuchen
Ansicht
Themen-Optionen

Setter einer TStrings-Property wird nicht aufgerufen

Ein Thema von Ares · begonnen am 28. Mai 2010 · letzter Beitrag vom 28. Mai 2010
Antwort Antwort
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#1

Setter einer TStrings-Property wird nicht aufgerufen

  Alt 28. Mai 2010, 07:26
Hallo!

Ich bastle gerade an einer eigenen Komponente. Diese soll unter anderem eine TStrings-Property haben die über einen Setter zugewiesen wird. Der Setter ist notwendig, da bei der Zuweisung noch einige zusätzlich Aktionen ausgeführt werden müssen.

Das ganze Funktioniert prima, nur wenn die Komponente beim Programmstart erzeugt wird, wird der Setter nicht aufgerufen. Der Property wird zwar korrekt ihr Inhalt zugewiesen, nur geschieht dies hinter den Kulissen und nicht über den Setter.

Delphi-Quellcode:
  TItemPanel = class(TCustomPanel)
  private
    FItems: TStrings;
    FCounter: Integer;

    procedure SetItems(const Value: TStrings);
    procedure ClickHandler(Sender: TObject);
    procedure SetCounter(const Value: Integer);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Items: TStrings read FItems write SetItems;
    property Counter: Integer read FCounter write SetCounter;
  end;


...

{ TItemPanel }
constructor TItemPanel.Create(AOwner: TComponent);
begin
  inherited;

  FItems := TStringList.Create;
  FItems.Add('Item1');
  FItems.Add('Item2');

  OnClick := ClickHandler;
end;

procedure TItemPanel.SetCounter(const Value: Integer);
begin
  FCounter := Value;
  ShowMessage(IntToStr(Value));
end;

procedure TItemPanel.SetItems(const Value: TStrings);
begin
  FItems.Assign(Value);
  ShowMessage(Value.Text);
end;

procedure TItemPanel.ClickHandler(Sender: TObject);
begin
  ShowMessage(FItems.Text);
end;

Das ist eine einfache Panel Komponente mit den Eigenschaften Counter (Integer) und Items (TStings). Beide Eigenschaften werden über einen Setter zugewiesen der neben der Zuweisung auch direkt den Inhalt in einer Meldung ausgibt.

Die Setter funktionieren prima während des Entwurfs, oder wenn ich zur Laufzeit Werte zuweise. Bei der Formularerzeugung wird SetCounter aufgerufen und die zugehörige Meldung angezeigt. Die Meldung aus SetItems erscheint jedoch nicht. Ein Klick auf das Panel zeigt jedoch, dass Items korrekt zugewiesen wurde.

Wo genau liegt hier mein Fehler? Ist das Problem, dass Counter ein einfacher Werttyp ist und Items ein Objekt? Wie werden die Daten zu Items zugewiesen wenn nicht über den Setter?

Die zusätzlichen Aktionen im Setter sind für meine Komponente wichtig. Kann man also irgendwie erreichen, dass der Setter auch für Items ausgeführt wird?

Besten Dank!
Ares
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Setter einer TStrings-Property wird nicht aufgerufen

  Alt 28. Mai 2010, 07:35
Die Setter werden von der Persistenzschicht des Fromulars nicht verwendet, da davon ausgegangen wird, dass die in die DFM geschriebenen Werte korrekt sind
Markus Kinzler
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#3

Re: Setter einer TStrings-Property wird nicht aufgerufen

  Alt 28. Mai 2010, 07:38
Ok, vielen Dank für den Hinweis. Gibt es einen Grund, weshalb der der Integer-Setter verwendet wird, der TStrings-Setter aber nicht?

Der Sinn eines Setter ist es ja nicht nur zu prüfen ob die Daten korrekt sind, sondern eben auch ggf. zusätzliche Aktionen auszuführen (neu zeichnen, etc.). Gibt es also irgendeinen Weg den Setter dennoch zu verwenden? Bzw. gibt es erprobte Lösung für dieses Problem?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Setter einer TStrings-Property wird nicht aufgerufen

  Alt 28. Mai 2010, 07:42
Nein, Setter werden schon verwendet (die sogenannte Persistenzschicht weiß ja garnicht was hinter
einem Setter steht, also ob und welches Feld damit verbunden ist und kann somit nichts direkt setzen),
aber bei TStrings wird über den Getter an das Objekt rangegangen und dieses direkt angesprochen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#5

Re: Setter einer TStrings-Property wird nicht aufgerufen

  Alt 28. Mai 2010, 08:49
Wenn du das OnChange-Event von FItems verwendest, solltest du schon etwas davon mitkriegen. Du kannst dann über csLoading in ComponentState feststellen, in welchem Kontext der Event ausgelöst wurde.
Uwe Raabe
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Setter einer TStrings-Property wird nicht aufgerufen

  Alt 28. Mai 2010, 15:59
Dein Setter wird nur verwendet wenn dem Property ein TStrings-Objekt zugewiesen wird.
Beim Erzeugen deiner Klasse wird vermutlich nur TItemPanel.Items.LoadFromStream aufgerufen.
  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 00:12 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