![]() |
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) |
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
|
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... |
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?
|
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. |
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. |
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 |
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: |
AW: Zugriff auf Ereignisse in vererbter Form
Zitat:
|
AW: Zugriff auf Ereignisse in vererbter Form
Zitat:
|
AW: Zugriff auf Ereignisse in vererbter Form
Sry, den Post hab ich glatt übersehen.
|
AW: Zugriff auf Ereignisse in vererbter Form
Zitat:
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! |
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. |
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:
Diese Zeile kannst Du dann einfach Löschen
object MyInheritedButton
OnClick = Nil ... |
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