Ich habe ein Frame mit einer Listbox und einem Label entworfen. Im OnClick der Listbox wird einfach der angeklickte Eintrag der Caption des Labels zugewiesen. Dies Frame packe ich in die Vorlagen.
Dann ziehe ich das Frame auf eine Form. Auf der Form gibt es ein Edit-Feld. Nun möchte ich, dass beim Klick auf die Listbox weiterhin die Caption des Labels im Frame und auch die Text-Property des Edit-Feldes den angeklickten Eintrag zugewiesen bekommt.
Also eigentlich alles ganz einfach.
Wenn ich nun im OnClick-Event der Listbox im Frame auf der Form 'inherited' und dann die Zuweisung auf die Text-Property erstelle, wird die Zuweisung auf die Caption des Labels im Frame nicht mehr ausgeführt. Wenn ich dann das OnClick in der Form wieder entferne, wird gar nichts mehr ausgeführt. In der
DFM habe ich dann gefunden, dass da 'OnClick = nil' erscheint.
Ich hatte angenommen, dass auch die Events vererbt werden oder verstehe ich da etwas völlig falsch?
Inherited ruft immer die Methode der Klasse auf, von der die aktuelle Klasse abgeleitet ist. In Deinem Fall ist das TForm (bzw. im Frame wäre es TFrame). Damit ist Dir nicht geholfen.
Du kannst aber aus dem OnClick-Event der Form den des Frames aufrufen:
Delphi-Quellcode:
procedure TMyForm.MyListboxClick(Sender: TObject);
begin
MyFrame.MyListboxClick(Sender);
// anderer Code hier
end;
Alternativ kann Dein Frame auch einen OnListboxClick Event exportieren und diesem kannst Du eine Methode der Form zuweisen:
Delphi-Quellcode:
type
TMyFrame = class(TFrame)
// [...]
private
FOnListboxClick: TNotifyEvent;
public
property OnListboxClick: TNotifyEvent read FOnListboxClick write OnListboxClick;
end;
// [...]
procedure TMyFrame.MyListboxClick(Sender: TObject);
begin
if Assigned(FOnListboxClick) then begin
FOnListboxClick(Sender);
// oder, alternativ:
// FOnListboxClick(Self);
end;
end;
// [...]
type
TMyForm = class(FForm)
private
// Sender ist entweder die Listbox oder der Frame,
// je nachdem was oben uebergeben wurde
procedure OnListboxClick(Sender: TObject);
public
constructor Create(Owner: TComponent); override;
end;
// [...]
constructor TMyForm.Create(Owner: TComponent);
begin
inherited
MyFrame.OnListboxClick := OnListboxClick;
end;
procedure TMyForm.OnListboxClick(Sender: TObject);
var
Idx: Integer;
begin
// Hier kann mittels Sender auf die Listbox oder
// auf den Frame zugegriffen werden.
// Oder, wenn das zu kompliziert ist, auch mittels
Idx := MyFrame.TheListbox.ItemIndex;
if Idx <> -1 then begin
MyEdit.Text := MyFrame.TheListbox.Items[Idx];
end;
end;
(Code ungetestet.)