[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