[Lazarus] sqlite3connection events

Mattias Gärtner nc-gaertnma at netcologne.de
Thu Sep 10 12:18:42 CEST 2009


Zitat von Andrea Mauri <andrea.mauri.75 at gmail.com>:

> Dear Mattias,
> thanks, now it works.
> May I ask you what was the problem? I would like to contribute as  
> much as possible in this project, more I understand more I can help.

I will try to explain:

property AfterConnect : TNotifyEvent read FAfterConnect write SetAfterConnect;

The write method is defined as:

procedure TCustomConnection.SetAfterConnect(const AValue: TNotifyEvent);
begin
   if FAfterConnect=AValue then exit;
   FAfterConnect:=AValue;
end;

The problem is that TNotifyEvent is a special "record" of two  
pointers: Data and Code. At runtime Data is the instance (the Self  
pointer) and Code is the address of the procedure. At designtime there  
is no address. Therefore the IDE creates a special fake event, with  
Data an unique ID and Code=nil.

The comparison "FAfterConnect=AValue" only compares code, not data.  
Probably it is for Delphi compatibility. Although I wonder, why this  
happen under mode objfpc. IMHO this feature is inconsistent and almost  
useless.

Because at designtime the code is always nil, FAfterConnect=AValue is  
always true. I worked around this by first assigning Code=1 and then  
Code=nil.

But there is still a bug in the TCustomConnection, because when you  
switch the event to the method of the same class, but another  
instance, TCustomConnection will ignore this.

I think, it would be better if FPC changes the comparison in mode objfpc.

Mattias






More information about the Lazarus mailing list