我創建了一個簡單的FireMonkey截屏獲取在Android和Windows ..正常工作:Delphi Firemonkey TControl.MakeScreenshot可以在一個線程中工作嗎?
procedure Capture;
var
B : TBitmap;
begin
try
B := Layout1.MakeScreenshot;
try
B.SaveToFile(..somefilepath.png);
finally
B.Free;
end;
except
on E:Exception do
ShowMessage(E.Message);
end;
end;
末;
當我將它移動到如下所示的線程時,它在Windows中正常工作,但在Android中,我從MakeScreenshot調用中獲得異常'位圖太大'。在線程中使用MakeScreenshot是否需要額外的步驟?
procedure ScreenCaptureUsingThread;
begin
TThread.CreateAnonymousThread(
procedure()
var
B : TBitmap;
begin
try
B := Layout1.MakeScreenshot;
try
B.SaveToFile('...somefilepath.png');
finally
B.Free;
end;
except
on E:Exception do
TThread.Synchronize(nil,
procedure()
begin
ShowMessage(E.Message);
end);
end).Start;
end;
後來增加。基於通過入佛門爵士和塞巴斯蒂安ž建議,這解決了這個問題,並允許使用一個線程:
procedure Capture;
begin
TThread.CreateAnonymousThread(
procedure()
var
S : string;
B : TBitmap;
begin
try
// Make a file name and path for the screen shot
S := '...SomePathAndFilename.png';
try
// Take the screenshot
TThread.Synchronize(nil,
procedure()
begin
B := Layout1.MakeScreenshot;
// Show an animation to indicate success
SomeAnimation.Start;
end);
B.SaveToFile(S);
finally
B.Free;
end;
except
on E:Exception do
begin
TThread.Synchronize(nil,
procedure()
begin
ShowMessage(E.Message);
end);
end;
end;
end).Start;
end;
你不應該一起使用* Delphi *,'TThread'和'TBitmap'(你只會面對錯誤)...並且你必須在主線程上下文中訪問UI控件,否則你只會產生一個隨機骰子的應用程序(可能工作與否) –