[Lazarus] Application.QueueAsyncCall and "conversion between ordinals and pointers is not portable"

Luca Olivetti luca at wetron.es
Mon Nov 29 18:29:00 CET 2021

El 29/11/21 a les 17:54, Mattias Gaertner via lazarus ha escrit:
> On Fri, 26 Nov 2021 13:15:07 +0100
> Luca Olivetti via lazarus <lazarus at lists.lazarus-ide.org> wrote:
>> Hello,
>> Application.QueueAsyncCall is defined as
>> procedure Application.QueueAsyncCall(const AMethod:TDataEvent; Data:
>> PtrInt);
>> When I want to pass a string or a big structure as "Data", I create a
>> pointer and use that, casting it as PtrInt, then I use and free it in
>> the Async Method., e.g.
>> procedure TServerThread.Log(const msg:string);
>> var
>>     s: PString;
>> begin
>>     new(s);
>>     s^:=msg;
>>     Application.QueueAsyncCall(@MainForm.LogServer, ptrint(s));
>> end;
>> procedure TMainForm.LogServer(data: ptrint);
>> var s:PString;
>> begin
>>     ptruint(s):=data; //ptrint here gives a warning "use an unsigned
>> type" LogMemo.Lines.Add(s^);
>>     Dispose(s);
>> end;
>> But that gives a hint "conversion between ordinals and pointers is
>> not portable". The suggestion I found is to use {%H-} to silence that
>> hint (which I did), but is there a better way?
>> Why Data is defined as PtrInt and not pointer?
> Sometimes you need an integer, sometimes a pointer, and afair at the
> time when it was added the compiler did not warn typecasting PtrInt to
> Pointer.

True. I checked and now it even gives an hint for an integer typecasted 
to a pointer, so defining it as a pointer would not solve the problem if 
you need to pass a bare integer as data :-(

Luca Olivetti
Wetron Automation Technology http://www.wetron.es/
Tel. +34 93 5883004 (Ext.3010)  Fax +34 93 5883007

More information about the lazarus mailing list