Thema: Delphi Methodenaufrufe intern

Einzelnen Beitrag anzeigen

Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#3

Re: Methodenaufrufe intern

  Alt 10. Jun 2006, 19:22
Hi Dax,

ASM .. hmmm .. muss das sein ?
Dein Code funktioniert leider nicht und es kommt eine Access Violation.
Der Else zweig geht gar nicht zu kompilieren, @_1 wäre unbekannt.
Der Self parameter soll nicht verwendet werden sondern aus der Variablen MEthod extrahiert.
Jetzt hab ich es mal probiert so probiert.

Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TEvent = procedure of Object;
  TIrgendeinEvent = procedure(Sender : TObject; MeineZahl : Integer) of object;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure Aufruf(Sender : TObject);
    procedure Aufruf2(Sender : TObject; MeineZahl : Integer);
  public
  end;

var
  Form1: TForm1;
  procedure ZwischenAufruf(Method : TMethod; args: array of const);

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
    NotifyEvent : TNotifyEvent;
    IrgendeinEvent : TIrgendeinEvent;
begin
  NotifyEvent := self.Aufruf;
  IrgendeinEvent := self.aufruf2;

  zwischenAufruf(TMethod(NotifyEvent), [self]);
  zwischenAufruf(TMethod(IrgendeinEvent), [self, 95]);
end;

//==============================================================================

procedure ZwischenAufruf(Method : TMethod; args: array of const);
var i: Integer; p: Pointer;
    self : Pointer;
begin
  p := Method.Code;
  self := Method.Data;
  i := Length(args);
  case i of
    0: asm
         push p
         mov eax, Self
         call [esp]
         pop p
       end;
    1: asm
         push p
         mov eax, Self
         mov edx, [edx]
         mov edx, [edx]
         call [esp]
         pop p
       end;
    2: asm
         push p
         mov eax, Self
         mov edx, [edx]
         mov ecx, [edx+4]
         mov edx, [edx]
         call [esp]
         pop p
       end;
    else
      asm
// mov eax, args
// mov eax, [eax]
// mov ecx, [eax-4]
// mov edx, [edx]
// @_l:
// push [edx+ecx*4]
// cmp ecx, 2
// jnz @_1
//
// mov ecx, [edx+4]
// mov edx, [edx]
// call p
      end
  end;

end; // ZwischenAufruf (TForm1)


//==============================================================================

procedure TForm1.Aufruf(Sender : TObject);
begin
    TForm1(Sender).Caption := 'Erfolgreich';
end; // Aufruf (TForm1)

//==============================================================================

procedure TForm1.Aufruf2(Sender : TObject; MeineZahl : Integer);
var form : TForm1;
begin
  self.Caption := 'Self hat funktioniert';
  form := TForm1(Sender);
  form.Caption := form.Caption + ' Sender hat funktioniert';
  form.caption:= form.caption + ' Integer ist gekommen: ' + IntToStr(MeineZahl);
end; // Aufruf2 (TForm1)

end.
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat