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

Mattias Gaertner nc-gaertnma at netcologne.de
Mon Nov 29 17:54:16 CET 2021


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.

Mattias


> 
> Bye



More information about the lazarus mailing list