[Lazarus] Check if an abstract method is implemented or not

Michael Van Canneyt michael at freepascal.org
Thu Jan 24 09:31:04 CET 2013



On Thu, 24 Jan 2013, xrfang wrote:

> Hi All,
> I wrote a TPainter abstract class, and a TPaintRect class.  In the TPaintRect class I have this code:
> 
> procedure TPaintRect.OnMouseEnter(Sender: TObject);
> var
>   i: Integer;
>   p: TPainter;
> begin
>   for i := 0 to painters.Count - 1 do begin
>     p := TPainter(painters.Objects[i]);
>     try
>       p.OnMouseEnter(Sender);
>     except on EAbstractError do ; end;
>   end;
>   if Assigned(FOnMouseEnter) then FOnMouseEnter(Sender);
> end;
> 
> While running in IDE, the program will crash because OnMouseEnter is abstract.
> 
> My problems are:
> 
> 1) As I already wrapped it with try-except, I hope it won't trigger IDE exception. But even I turn off "Notify on Lazarus Exception" in debugger options it
> still pops up, and the popup said RunError(211), NOT EAbstractError.  The program runs well outside of IDE.
> 
> 2) Is there a way to detect if an abstract method is implemented or not, without trying to call it and try...except?

The following will do it:

uses sysutils;

Type
   TParent = Class
     Procedure MyMethod; virtual; abstract;
   end;

   TChild = class(TParent)
   end;

var
   C : TParent;

begin
   c:=TChild.Create;
   If TMethod(@C.MyMethod).Code=Pointer(@system.AbstractError) then
     Writeln('Not implemented')
   else
     Writeln('Implemented')
end.

When run, it will print 'Not implemented'.

But you should not instantiate objects with abstract methods to begin with.

The compiler warns you if you do.
(compile the above program with warnings/hints to see it)

Michael.


More information about the Lazarus mailing list