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

---Moderiert von user profile iconNarses: 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

user profile iconNostromo 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 :)