[Lazarus] How to hide pop-up menu before taking a screen snapshot?

Bo Berglund bo.berglund at gmail.com
Fri Feb 12 11:16:16 CET 2021


On Fri, 12 Feb 2021 00:25:17 -0300, Flávio Etrusco via lazarus
<lazarus at lists.lazarus-ide.org> wrote:

>Menu handling in Windows is fully synchronous (in the main thread) so
>you should use QueueAsyncCall:
>https://wiki.freepascal.org/Asynchronous_Calls
>
>Best regards,
>Flávio

I tried modifying my menuclick event as follows:


procedure TfrmMain.miCopyImageClick(Sender : TObject);
begin
  //Sleep(300);
  //CopyScreenRect;
  Application.QueueAsyncCall(@CopyScreenRect);
end;

But now I get a compiler error:

formmain.pas(149,46) Error: Wrong number of parameters specified for call to
"QueueAsyncCall"

It seems like the call you suggested does not work if you do not supply some
kind of data too, but I don't have any call data in this case...

>From the page you referenced:

procedure QueueAsyncCall(AMethod: TDataEvent; Data: PtrInt);

Note that my menu event handler does not use any data, so what to do in this
case?
I tried adding a bogus extra argument as zero but that just changed to a
different error message...

Application.QueueAsyncCall(@CopyScreenRect, 0);

formmain.pas(149,45) Error: Incompatible type for arg no. 1: Got "<procedure
variable type of procedure of object;Register>", expected "<procedure variable
type of procedure(Int64) of object;Register>"

Copyscreenrect looks like this if that matters:

procedure TfrmMain.CopyScreenRect;
var
  MyCapture : TBgraBitmap;
  Clip: TRect;
begin
  try
    Clip := Bounds(Self.Left, Self.Top, Self.Width, Self.Height);
    Self.Visible := false;
    MyCapture := TBgraBitmap.Create();
    try
      MyCapture.TakeScreenShot(Clip);
      Self.Visible := true;
      Clipboard.Assign(MyCapture.Bitmap);
    finally
      MyCapture.Free;
    end;
  except
    on E: exception do
      Clipboard.AsText := E.Message;
  end;
end;


-- 
Bo Berglund
Developer in Sweden



More information about the lazarus mailing list