Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Frames, Events und Tücken (https://www.delphipraxis.net/198376-frames-events-und-tuecken.html)

ADelph 29. Okt 2018 09:36

Delphi-Version: XE7

Frames, Events und Tücken
 
Moin,

vermutlich denke ich nicht genug OOP und komme daher nicht weiter...

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?

Ein Hinweis wäre super!

Rollo62 29. Okt 2018 10:00

AW: Frames, Events und Tücken
 
Ich will nicht pessimistisch klingen, aber wenn ich mit Frames arbeite dann versuche ich die möglichst vom ganzen Rest zu entkoppeln, auch vom Designer:
- Frames sind bei mir nur bequem editierbare, visuelle Container
- Ich habe meistens für den Zugriff eine Factory und ein Interface vorgesehen
- Ich benutze keine Frames direkt im UI-Designer (damit gab es bei mir zu viele Probleme)
- Ich kommuniziere mit Frames entweder über Interfaces oder Messages (TMessageManager)
- Die Frames erzeuge ich ausschliesslich per Runtime, und lege die in entsprechede Container (TPanel)

Es kann aber sein dass das Frame-System mittlerweile im Designer auch gut und stabil läuft.
Vielleicht gibt es hier ja auch andere mit positiven Erfahrungen.

Rollo

dummzeuch 29. Okt 2018 10:33

AW: Frames, Events und Tücken
 
Zitat:

Zitat von ADelph (Beitrag 1417008)
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.)

ADelph 29. Okt 2018 10:36

AW: Frames, Events und Tücken
 
Hi Rollo,

ja, ich habe auch etliche Probleme mit Frames und wollte sie eigentlich auch nur wegen der Wiederverwendbarkeit als Container verwenden. Aber ein bisschen Funktionalität - einfache Sachen - wollte ich da schon unterbringen - Standards eben - wie beschrieben (der geschilderte Fall ist für mich ein Beispiel).

Gerhard

ADelph 29. Okt 2018 10:50

AW: Frames, Events und Tücken
 
Hi dummzeuch,

ja, dass mit dem inherited ist mir auch schon aufgegangen...eben nicht tief genug gedacht.

Dass mit dem Aufruf des OnClick des Frames hatte ich auch schon 'im Spiel' - aber: was, wenn ich mehrere dieser Frames auf einer Form habe und ich z.B. beim Klick die Listbox-Einträge in eine Listbox auf der Form sammeln will, dann wäre da aber ein elendes gecaste notwendig, oder?

Ich glaube fast, Frames sind am Ende doch nicht ganz so praktisch, wie ich gehofft hatte...vielleicht steige ich besser auf z.B. 'Custom Container' um. Hatte ich schon mal verwendet, schien mir ganz sinnig zu sein. Allerdings möchte ich so weit wie möglich native Delphi 'Fähigkeiten' verwenden und nicht noch eine Komponentensammlung mehr - das wird beim Update auf neue Versionen von Delphi dann immer ein mühsames Spiel...es bleibt schwierig... :?

ADelph 29. Okt 2018 10:52

AW: Frames, Events und Tücken
 
Hi dummzeuch,

...danke für die 2. Anregung...lasse ich mir mal durch den Kopf gehen...!

Rollo62 29. Okt 2018 12:23

AW: Frames, Events und Tücken
 
Kennst du das TFrameStand Projekt ?
Das gibt es auch unter GetIt, aber ich weiss nicht ob das unter XE7 vorhanden ist.
Da werden ein paar schöne Möglichkeiten gezeigt, was man mit Frames machen kann.

Rollo

Uwe Raabe 29. Okt 2018 13:28

AW: Frames, Events und Tücken
 
Zitat:

Zitat von Rollo62 (Beitrag 1417030)
Kennst du das TFrameStand Projekt ?

Gibt's aber nur für FMX, obwohl aus der Frage nicht ganz klar wird, ob VCL- oder FMX-Frames gemeint sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 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