[lazarus] Multiplataform

michael at tfdec1.fys.kuleuven.ac.be michael at tfdec1.fys.kuleuven.ac.be
Wed Jun 30 17:25:57 EDT 1999




On Wed, 30 Jun 1999, Nicolas Aragon wrote:

> Hello,
> 
> >It should be fixed now. at least the test programs we got from you, and our
> >own, seem to work correctly. Get the latest version from CVS to test.
> 
> Are you sure? 
> 
> Having;
> 
> type
>   TProcedureOfObject = procedure of object;
> 
> Will this work?
> 
> procedure Blah( a: TProcedureOfObject );

Most definitely. : the following crucial test programs work:

--------------------8<-----------------------
{$MODE objfpc}

program procofobject_arg;
type
  TProcOfObject = procedure of object;
  TTestClass = class
    constructor Create;
    procedure SomeMethod;
  end;


procedure CrashProc(i1: Integer; method: TProcOfObject; i2: Integer);
begin
  WriteLn('i1 is :', i1);
  method;
  WriteLn('i2 is :', i2);
end;

constructor TTestClass.Create;
begin
  CrashProc(123, @SomeMethod, 456);
end;

procedure TTestClass.SomeMethod;
begin
  WriteLn('In SomeMethod');
end;

var
  instance: TTestClass;
begin
  instance := TTestClass.Create;
end.
--------------------8<-----------------------

Output is:

home: >ppc386 testpo
home: >testpo
i1 is :123
In SomeMethod
i2 is :456
home: >

And then the following program:

--------------------8<-----------------------
{$MODE objfpc}

program procofobject_arg;
type
  TProcOfObject = procedure of object;
  TTestClass = class
    constructor Create;
    procedure SomeMethod;
  end;

  TProcOfObjectInternal = packed record
    method: Pointer;
    obj: TObject;
  end;


constructor TTestClass.Create;
var
  method: TProcOfObject;
begin
  method := @Self.SomeMethod;
  WriteLn('In Constructor:');
  WriteLn('  Self = ', Integer(Self));
  WriteLn('  Method = ',
    longint(TProcOfObjectInternal(method).method), '/',
    longint(TProcOfObjectInternal(method).obj));
end;

procedure TTestClass.SomeMethod;
var
  method: TProcOfObject;
begin
  method := @SomeMethod;
  WriteLn('In SomeMethod:');
  WriteLn('  Self = ', Integer(Self));
  WriteLn('  Method = ',
    Longint(TProcOfObjectInternal(method).method), '/',
    Longint(TProcOfObjectInternal(method).obj));
end;

var
  instance: TTestClass;
  method: TProcOfObject;
begin
  instance := TTestClass.Create;

  method := @instance.SomeMethod;
  WriteLn;
  WriteLn('In main program:');
  WriteLn('  instance = ', Integer(instance));
  WriteLn('  Method = ',
    Longint(TProcOfObjectInternal(method).method), '/',
    Longint(TProcOfObjectInternal(method).obj));
  WriteLn;
  instance.SomeMethod;
end.
--------------------8<-----------------------

output is:

home: >ppc386 testp
home: >testp
In Constructor:
  Self = 134552384
  Method = 134544316/134552384

In main program:
  instance = 134552384
  Method = 134544316/134552384

In SomeMethod:
  Self = 134552384
  Method = 134544316/134552384
home: >

I hope this convinces everyone :-)

Michael.






More information about the Lazarus mailing list