AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frames, Events und Tücken

Ein Thema von ADelph · begonnen am 29. Okt 2018 · letzter Beitrag vom 29. Okt 2018
Antwort Antwort
ADelph

Registriert seit: 10. Aug 2009
91 Beiträge
 
Delphi 10.4 Sydney
 
#1

Frames, Events und Tücken

  Alt 29. Okt 2018, 09:36
Delphi-Version: XE7
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!
Wir versuchen in fehlerbehafteten Systemen mit fehlerhaften Entwicklungsumgebungen fehlerfreie Software zu erstellen - das kann nicht klappen
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#2

AW: Frames, Events und Tücken

  Alt 29. Okt 2018, 10:00
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
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

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

AW: Frames, Events und Tücken

  Alt 29. Okt 2018, 10: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
ADelph

Registriert seit: 10. Aug 2009
91 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Frames, Events und Tücken

  Alt 29. Okt 2018, 10:36
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
Wir versuchen in fehlerbehafteten Systemen mit fehlerhaften Entwicklungsumgebungen fehlerfreie Software zu erstellen - das kann nicht klappen
  Mit Zitat antworten Zitat
ADelph

Registriert seit: 10. Aug 2009
91 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Frames, Events und Tücken

  Alt 29. Okt 2018, 10:50
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...
Wir versuchen in fehlerbehafteten Systemen mit fehlerhaften Entwicklungsumgebungen fehlerfreie Software zu erstellen - das kann nicht klappen
  Mit Zitat antworten Zitat
ADelph

Registriert seit: 10. Aug 2009
91 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Frames, Events und Tücken

  Alt 29. Okt 2018, 10:52
Hi dummzeuch,

...danke für die 2. Anregung...lasse ich mir mal durch den Kopf gehen...!
Wir versuchen in fehlerbehafteten Systemen mit fehlerhaften Entwicklungsumgebungen fehlerfreie Software zu erstellen - das kann nicht klappen
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#7

AW: Frames, Events und Tücken

  Alt 29. Okt 2018, 12:23
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.008 Beiträge
 
Delphi 12 Athens
 
#8

AW: Frames, Events und Tücken

  Alt 29. Okt 2018, 13:28
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 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