Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zugriff auf Ereignisse in vererbter Form (https://www.delphipraxis.net/161600-zugriff-auf-ereignisse-vererbter-form.html)

yogie 11. Jul 2011 20:01

Delphi-Version: 5

Zugriff auf Ereignisse in vererbter Form
 
Guten Abend zusammen,

ich glaube ich habe gerade ein Brett vor dem Kopf.:?:
Für ein größeres Projekt möchte ich eine Basis-Form anlegen und diese dann als
Vorfahre für mehrer gleichartige (GUI) Formulare verwenden.

1. Vererbung über Eintrag im Quelltext
TForm1 = class(TFrmVorfahre) …. Geht, Form1 hat das Aussehen von FrmVorfahre
2. Verwendung von Frames …. Geht auch s.o.

Nun zum Problem : In Vorfahre ist z.B. ein ButtonOnClick definiert. Da passieren
dann allgemeine Dinge, die immer an dieser Stelle gebraucht werden.

Wie komme ich in der abgeleiteten Form an das ButtonOnClick aus der Vorfahre Form?

Für Sachen die die Form selber betreffen geht das natürlich, da kann ich z.B.

procedure TForm1.FormCreate(Sender: TObject);
begin
inherited;
// was spezielles ausführen
end;

schreiben und die Aktionen aud der Vorfahre Form werden ausgeführt.
(Delphi7 prof., WIN XP)

DeddyH 11. Jul 2011 20:04

AW: Zugriff auf Ereignisse in vererbter Form
 
Ich bin nicht sicher, ob ich Dich richtig verstanden habe, aber geht es evtl. mit
Delphi-Quellcode:
inherited Button.OnClick
:?:

Ralf Kaiser 11. Jul 2011 20:09

AW: Zugriff auf Ereignisse in vererbter Form
 
Das geht genauso wie beim z.B. FormCreate!

Wenn du im abgeleiteten Formular einen Eventhandler anlegst (also Doppelklick in z.B. OnClick im Objektinspektor) dann fügt Delphi als erste Zeile des Eventhandlers auch ein "inherited" hinzu. Dieses sorgt dafür, dass der Code aus dem Vorfahren-Eventhandler ausgeführt wird.

Nicht ganz sicher bin ich mir im Moment, ob das bei Delphi 5 (steht ja in deinem Profil) auch schon so war aber ich kann mir eigentlich nicht vorstellen, dass D5 das nicht machte...

Edit: Wo war denn jetzt der rote Kasten? Da holt man sich nen Kaffee und jemand ist schneller...

DeddyH 11. Jul 2011 20:11

AW: Zugriff auf Ereignisse in vererbter Form
 
Das automatische Einfügen von "inherited" geschieht aber IIRC nur bei virtuellen Methoden, oder irre ich mich da gerade?

yogie 11. Jul 2011 20:58

AW: Zugriff auf Ereignisse in vererbter Form
 
erst mal danke für die Tips...

@Ralf : Das Problem ist, daß ich kein OnClick anlegen kann,
weil lich in meiner abgeleiteten Form zur Entwursfzeit den
Button (oder was auch immer) garnicht sehe. Da ist einfach
nur ein leeres Formuar, erst zu Lauzeit wir der Inhalt des
Vorfahr-Formulars angezeigt.

himitsu 12. Jul 2011 02:19

AW: Zugriff auf Ereignisse in vererbter Form
 
Wenn im vorfahren Button.OnClick (mit Punkt, also das Ereignis) belegt ist, dann kann man es im Nachfahren nicht überschreiben, es sei den man merkt sich den vorhergehenden wert in einer eigenen Variable und fuft darüber die alte Methode, in seiner überschriebenen Version auf.

Ansonsten sollte die Methode hinter OnClick einfach nur .Click heißen, virtuell sein und sich somit überschreiben lassen.

Stevie 12. Jul 2011 03:36

AW: Zugriff auf Ereignisse in vererbter Form
 
Liste der Anhänge anzeigen (Anzahl: 1)
Methoden müssen nicht virtual sein, damit man sie in einer abgeleiteten Klasse überschreiben kann. Bei nicht virtuellen Methoden hat man nur keine Polymorphie.

Siehe angehangenes Beispiel

yogie 12. Jul 2011 06:26

AW: Zugriff auf Ereignisse in vererbter Form
 
erstmalmal danke für die Antworten.

@Stevie : Das Beispiel hat bei mir das Brett vor dem Kopf
beseitigt. Jetzt klappt alles wie es soll. Es funktioniert
auch bei der Verwendung von Frames.

Ich wünsche allen einen produktiven Arbeitstag:wink:

DeddyH 12. Jul 2011 07:08

AW: Zugriff auf Ereignisse in vererbter Form
 
Zitat:

Zitat von Stevie (Beitrag 1111248)
Methoden müssen nicht virtual sein, damit man sie in einer abgeleiteten Klasse überschreiben kann.

Das hat ja auch niemand behauptet, falls Du auf meinen Post anspielen solltest. Ich habe lediglich gesagt, dass IIRC die IDE das "inherited" nur bei virtuellen Methoden automatisch einfügt.

Stevie 12. Jul 2011 07:55

AW: Zugriff auf Ereignisse in vererbter Form
 
Zitat:

Zitat von DeddyH (Beitrag 1111252)
Zitat:

Zitat von Stevie (Beitrag 1111248)
Methoden müssen nicht virtual sein, damit man sie in einer abgeleiteten Klasse überschreiben kann.

Das hat ja auch niemand behauptet, falls Du auf meinen Post anspielen solltest. Ich habe lediglich gesagt, dass IIRC die IDE das "inherited" nur bei virtuellen Methoden automatisch einfügt.

Hab Himis Post aber so verstanden.

DeddyH 12. Jul 2011 07:56

AW: Zugriff auf Ereignisse in vererbter Form
 
Sry, den Post hab ich glatt übersehen.

Ralf Kaiser 12. Jul 2011 07:57

AW: Zugriff auf Ereignisse in vererbter Form
 
Zitat:

Zitat von yogie (Beitrag 11112249)
@Ralf : Das Problem ist, daß ich kein OnClick anlegen kann,
weil lich in meiner abgeleiteten Form zur Entwursfzeit den
Button (oder was auch immer) garnicht sehe. Da ist einfach
nur ein leeres Formuar, erst zu Lauzeit wir der Inhalt des
Vorfahr-Formulars angezeigt.

Dann stimmt definitiv mit der abgeleiteten DFM-Datei etwas nicht!

Schau dir mal die Formulardatei als Text an (rechte Maustaste im Forumlardesigner, dann "Als Text anzeigen").

Als erstes Schlüsselwort muss bei einem abgeleiteten Formular dort "inherited" stehen. Wenn dort "object" steht dann kann Delphi nicht "wissen", dass es ein abgeleitetes Formular ist und zeigt ein leeres Fenster an.

Ersetze in dem Fall "object" durch "inherited" und schalte wieder auf die normale Formularansicht und Delphi wird dir den Inhalt des vorfahren anzeigen. Auch mit den Events müsste es dann klappen!

yogie 12. Jul 2011 20:30

AW: Zugriff auf Ereignisse in vererbter Form
 
@ Ralf :
Die Form war zur Entwurfszeit definitiv leer, erst zur Laufzeit
waren die Controls der Vorfahr-Form sichtbar.

Ich bin jetz nicht mehr im Dienst, werde aber morgen dem
Hinweis nochmal nachgehen.

Ich habe jetzt mit einem Frame gearbeitet und es läuft
eigentlcih so wie ich es brauche.

FredlFesl 13. Jul 2011 06:05

AW: Zugriff auf Ereignisse in vererbter Form
 
Du kannst Formulare genauso simpel ableiten wie Frames. Nur 'per Hand', so wie Du es gemacht hast, würde ich es nicht machen.
In der Delphi-IDE gehst Du auf 'Neue Hinzufügen->Weitere' (oder Datei->Neu->Weitere) und dann im Dialog auf 'vererbbare Elemente'. Dann wählst du das Basisformular aus, fertig.

Zur Laufzeit siehst Du dann schon das Basisformular komplett, kannst individuelle Anpassungen vornehmen etc. Das Überschreiben des Events eines im Elternformular eingeführten Controls geht auch intuitiv (wie bereits erwähnt): Beim Klick in den Eventhandler erzeugt Delphi den Event-Stub mit einer Zeile 'Inherited'.

Doch Vorsicht! Wenn du mit den Events der vererbten Controls spielst, passiert es sehr schnell, das Delphi den Eventhandler auf NIL setzt, sodaß später noch nicht einmal der Original-Event aufgerufen wird. Daher mein Tipp: Funktioniert etwas im abgeleiteten Formular nicht mehr, dann schau Dir die DFM an. Dann steht da bestimmt soetwas wie
Code:
object MyInheritedButton
  OnClick = Nil
...
Diese Zeile kannst Du dann einfach Löschen


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz