Einzelnen Beitrag anzeigen

Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Frames, Events und Tücken

  Alt 29. Okt 2018, 11:33
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.)
Thomas Mueller
  Mit Zitat antworten Zitat