Autor Beitrag
MoreThanWords
Hält's aus hier
Beiträge: 16



BeitragVerfasst: Fr 20.02.04 10:05 
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.

ausblenden 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 user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt

_________________
Mit dem PC kann man Probleme lösen, die man ohne nicht hätte.
Brainiac
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure Edit1Exit(Sender: TObject); // darauf steht Button1.OnClick am Anfang.
begin                                           
   ShowMessage('OnExit');  //wieso stand hier eigentlich inherited??
end

procedure Edit1ExitErweitert(Sender: TObject); 
begin 
   Edit1Exit(Sender);          
   ShowMessage('Zusätzlich');  
end

procedure ErweiterungVonEditxxxExit; 
begin 
   Button1.OnClick:= Edit1ExitErweitert; 
end;
MoreThanWords Threadstarter
Hält's aus hier
Beiträge: 16



BeitragVerfasst: 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....

ausblenden 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,
ausblenden 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 user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt

_________________
Mit dem PC kann man Probleme lösen, die man ohne nicht hätte.