Einzelnen Beitrag anzeigen

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