[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