Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Event Handler zuweisen aber vorhandene Events durchführen?
Nostromo - Di 24.06.08 23:06
Titel: Event Handler zuweisen aber vorhandene Events durchführen?
Ich habe eine Komponente mit einer OnMouseMove-Funktion.
Diese Funktion hat bereits Code der ausgeführt wird.
Jetzt möchte ich aus einem selbsterstellten Objekt auch diese Funktion
nutzen, ohne das die ursprünglichen Anweisungen verloren gehen.
Beispiel:
Hauptformular mit Grid-Funktion:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.GridMouseMove(Sender:TObject; X,Y :integer); begin lblTest.Caption := Format('X: %d, Y: %d',[X,Y]); end; |
Die folgende Funktion in meinem Objekt soll die obige Grid.OnMouseMove ergänzen:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TMeinObjekt.MeinMouseMove(Sender:TObject; X,Y : integer); begin self.X := X; self.Y := Y; end; |
Diese Funktion wird beim hinzufügen des Grids zu meinem Objekt dem Grid dann so zugewiesen:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TMeinObjekt.AddGrid(aGrid: TGrid); begin
aGrid.OnMouseMove := self.MeinMouseMove; end; |
Dabei wird natürlich die ursprüngliche Funktionalität von TForm1.GridMouseMove gelöscht, bzw. nicht mehr
ausgeführt. Wie kann ich es so zuweisen, daß sowohl meine Objektfuntion als auch die
Anweisungen aus TForm1.GridMouseMove ausgeführt werden?
Ich weiss, daß ich das schon mal programmiert habe, finde aber den Code nicht mehr.
Thanks
Jürgen
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
nagel - Di 24.06.08 23:31
Ruf in MeinMouseMove einfach die andere procedure auf.
Tilman - Di 24.06.08 23:31
ähm kann sein dass ich jetzt net ganz durchblicke, aber du müsstest beim ableiten inherited angeben soweit ich weiß...
nagel - Di 24.06.08 23:34
Hm dann hab ich's wohl falsch verstanden.
Nostromo - Mi 25.06.08 00:08
@nagel:
Das geht leider nicht. Dann erhält man einen Kreislauf ohne Ende.
Die Funktion ist ja gekapert. Rufe ich jetzt aus der gekaperten Funktion die gekaperte Funktion auf,
verzweigt Delphi wieder in die gekaperte Funktion, die wiederum die gekaperte Funktion aufruft.
:-)
@Tilman:
Ja, das klappt bei vererbten Objekten / Funktionen. Allerdings nicht in diesem Fall.
Da tut sich nämlich gar nix, da mein Objekt von der Klasse TObject ist und gar nix
mit dem TGrid zu tun hat.
:-(
Ich weiss noch das ich damals schon daran hart geknabert habe. Leider ist mir meine
damalige Code-Sammlung bei einem HD-Crash verlorengegangen. Es scheint das ich die
Komponente nämlich gar nicht mehr habe. Mist.
gruß
Jürgen
Tilman - Mi 25.06.08 00:12
hm ich blick immer noch net durch muss es mir gleich mal in ruhe anschauen, aber mit virtual und dynamic und so hat es nix zu tun oder?
// ach ne jetzt versteh ich, sry ^^
// edit vielleicht so?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| var a: TNotifyEvent;
procedure TForm1.Button1Click(Sender: TObject); begin showmessage('Hallo wie gehts'); end;
procedure TForm1.Button2Click(Sender: TObject); begin if assigned(a) then a(sender); Showmessage('Wat wer bist du denn'); end;
procedure TForm1.Button3Click(Sender: TObject); begin a := Button1.onClick; button1.OnClick := button2click; end; |
// edit: war noch ein kleiner Fehler am Ende, habs korrigiert falls nochmal jemand den Tipp braucht (da stand a := button1Click statt button1.onClick)
Nostromo - Mi 25.06.08 00:35
@Tilman:
Yiiiiha, den Kick hab ich gebraucht :-)
Nur etwas umgebaut. Der TNotifyEvent ist für Funktionen ohne Parameter gedacht. Man kann sich aber nen
eigenen Typ definieren, das fiel mir dann wieder ein.
Nämlich so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| type TMyEvent = procedure (Sender:TObject; Shift:TShiftState; X, Y : integer) of object; ...
TMyObject = class(TObject) protected FMyOnMouseMove : TMyEvent; ... ... procedure TMyObject.AddGrid(aGrid:TGrid); begin self.FMyOnMouseMove := aGrid.OnMouseMove; aGrid.OnMouseMove := self.GridMouseMove; end;
procedure TMyObject.GridMouseMove(...); begin if Assigned(self.FMyOnMouseMove) then self.FMyOnMouseMove(...); end; |
Vielen Dank für den tollen Tipp und...
gute Nacht noch :-)
gruß
Jürgen
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
---
Moderiert von
Narses: Beiträge zusammengefasst---
@Tilman:
Übrigens, wie krieg ich denn das Code-Highlighting auf dieser Website hin?
Kann dazu keinen Befehl finden :-(
Tilman - Mi 25.06.08 00:52
Nostromo hat folgendes geschrieben: |
@Tilman:
Übrigens, wie krieg ich denn das Code-Highlighting auf dieser Website hin?
Kann dazu keinen Befehl finden :-( |
Must auf "Bereiche klicken" und dann "Delphi" wählen und auf das kleine + klicken ;)
Schön dass ich dir helfen konnte :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!