Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#1

In das Event einer Komponente einhacken.

  Alt 1. Apr 2015, 12:29
Hier ein kleines Beispiel: ich möchte meiner Klasse eine Komponente zuweisen und mit ihr arbeiten. Es soll eine Klasse bleiben, keine neue Komponente. Nun kam ich auf die Idee, dass ich noch mehr machen könnte und auch auf Ereignisse der Komponente reagieren könnte. Hier das Ergebnis meiner vorläufigen Überlegung in einer Beispielklasse:
Delphi-Quellcode:
type
  TIrgendwas = class
  private
    FPanel: TPanel;
    FPanelOnClick: TNotifyEvent;
    procedure PanelClick(Sender: TObject);
  public
    constructor Create(APanel: TPanel);
    destructor Destroy; override;
  end;

procedure TIrgendwas.PanelClick(Sender: TObject);
begin
  //Beispiel für irgendeine Aktion
  FPanel.Color := RGB(Random(256), Random(256), Random(256));

  //Hier den Klick an Panel weitergeben
  FPanel.OnClick := FPanelOnClick; //Zuerst alten Zustand herstellen, sonst Schleife
  FPanel.OnClick(Sender); //Originalereignis ausführen
  FPanel.OnClick := PanelClick; //Wieder auf eigene Prozedur umleiten
end;

constructor TIrgendwas.Create(APanel: TPanel);
begin
  FPanel := APanel;

  FPanelOnClick := FPanel.OnClick; //Alten Zustand merken
  FPanel.OnClick := PanelClick; //Auf eigene Prozedur umleiten
end;

destructor TIrgendwas.Destroy;
begin
  FPanel.OnClick := FPanelOnClick;
end;


var
  Irgendwas: TIrgendwas;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Irgendwas := TIrgendwas.Create(Panel1);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Irgendwas.Free;
end;

procedure TForm1.Panel1Click(Sender: TObject);
begin
  ShowMessage('Und weiter mit PanelClick.');
end;
Zuerst das Positive: es funktioniert (zumindest zum Teil), es gefällt mir aber nicht. Das sieht mir zu sehr gebastelt aus. Außerdem, wenn einer Panel1 zwischendurch von Hand den OnClick neu zuweist, ist die ganze Anpassung in der Klasse Geschichte. Letztendlich funktioniert das ganze nur, ist aber keine wirkliche Lösung.

Gibt es eine elegantere Methode sich in ein Ereignis einzuklinken? Ich will das Ereignis nicht übernehmen, ich will mich nur einhacken. Am besten bevor die eigentliche Prozedur ausgeführt wird, damit ich einige Manipulationen ausführen kann.

Geändert von Popov ( 1. Apr 2015 um 12:31 Uhr)
  Mit Zitat antworten Zitat