Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - dynamisch Events bzw. Prozeduren erweitern
MoreThanWords - Fr 20.02.04 10:05
Titel: dynamisch Events bzw. Prozeduren erweitern
Hallo zuasmmen
Ich habe ein kleines Problem wird zwar nicht ganz einfach zu erklären sein aber ich versuch es mal.
An einem Ereignis hängt i.d.R eine Prozedure.
Ich möchte diese Procedure nun zu Laufzeit von außen also von einer fremden Klasse aus erweitern.
Hier nun etwas Quellcode um besser zu verdeutlichen was ich meine. Dieser funktioniert so leider nicht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure Edit1Exit(Sender: TObject); begin inherited; ShowMessage('OnExit'); end;
procedure Zusaetzlich; begin ShowMessage('Zusätzlich'); end;
procedure ErweiterungVonEditxxxExit; var tneHelp : TNotifyEvent; procedure newProcedure; begin tneHelp(Edit2); Zusaetzlich; end; begin tneHelp:= Edit1.OnExit; Button1.OnClick:= newProcedure; end; |
- Das Ereignis Edit1onExit soll zur Laufzeit um die Prozedure Zusaetzlich erweitert werden
- Die Erweiterung soll in der Procedure ErweiterungVonEditxxxExit erfolgen
- Dazu wird das NotifyEvent in einer Hilfsvariablen gespeichert
- Diese soll in der Procedure newProcedure + zusaetzlich ablaufen
- Welche wieder Button1.OnClick zugewiesen werden soll
Vielen Dank schon mal
Moderiert von
Peter Lustig: Code- durch Delphi-Tags ersetzt
Delete - Fr 20.02.04 16:39
NewProcedure ist aber leider kein TNotifyEvent, denn dessen Definition lautet:
TNotifyEvent = Procedure(Sender:TObject) of Object;
Proceduren, die du zuweisen kannst, müssen erstens zu einer Klasse gehören und zweitens einen Parameter vom Typ TObject haben.
Dein zweiter Fehler ist, dass du versuchst, einer Lokalen Variablen in ErweiterungVonEditxxxExit einen permanenten Wert zuzuwseisen, doch der geht garantiert mit dem Beenden der Prozedur verloren, da der betreffende Speicher nur während des Aufrufes reserviert bleibt.
Ich würde es so machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure Edit1Exit(Sender: TObject); begin ShowMessage('OnExit'); end;
procedure Edit1ExitErweitert(Sender: TObject); begin Edit1Exit(Sender); ShowMessage('Zusätzlich'); end;
procedure ErweiterungVonEditxxxExit; begin Button1.OnClick:= Edit1ExitErweitert; end; |
MoreThanWords - Mo 23.02.04 10:25
Danke,
das hat soweit schonmal funktioniert.
Nun hätte ich noch eine kleine Frage, gibt es ein Sprachkostrukt für Proceduren, dass so ähnlich funktioniert wie FindComponent bei Objekten.
Also das ich für das OnExit auch dynamisch andere Events verwenden kann beispielsweise das Ereigniss onEnter....
Delphi-Quelltext
1:
| (FindComponent('Edit1') as TEdit).OnExit:= Edit1ExitErweitert; |
Ich möchte die Komponente und Prozedure, die ersetzt wird aus einer Datenbank herauslesen.
Ich kann zwar dies zwar auch mit einer If Abfrage tun,
Delphi-Quelltext
1: 2: 3:
| if event = 'onExit' then (FindComponent('Edit1') as TEdit).OnExit:= Edit1ExitErweitert else if event = 'onEnter' then (FindComponent('Edit1') as TEdit).OnEnter:= Edit1ExitErweitert ....; |
aber eine einzeilige Funktion wäre doch viel schöner als 20-30 Zeilen (unnötiger) Quelltext.
Merci
Moderiert von
Peter Lustig: Code- durch Delphi-Tags ersetzt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!