Autor Beitrag
Nostromo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33
Erhaltene Danke: 1

Win 7 Pro 64bit, Win XP SP3
Delphi 7 Ent
BeitragVerfasst: Di 24.06.08 23:06 
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:
ausblenden 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: Di 24.06.08 23:31 
Ruf in MeinMouseMove einfach die andere procedure auf.
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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ß...

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
nagel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: Di 24.06.08 23:34 
Hm dann hab ich's wohl falsch verstanden.
Nostromo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33
Erhaltene Danke: 1

Win 7 Pro 64bit, Win XP SP3
Delphi 7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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?

ausblenden 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)

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Zuletzt bearbeitet von Tilman am Mi 25.06.08 02:02, insgesamt 2-mal bearbeitet
Nostromo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33
Erhaltene Danke: 1

Win 7 Pro 64bit, Win XP SP3
Delphi 7 Ent
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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 :)

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)