【发布时间】:2019-04-26 04:30:34
【问题描述】:
我正在尝试使用 OnPaint 方法绘制一个简单的图像。代码编译得很好,但是当应用程序启动时,它显示“Object lock notowned”错误并且没有其他任何事情发生。你能告诉我我犯了什么错误吗?该代码显示了我正在使用的 OnPaint 事件。谢谢大家的帮助。
procedure TTabbedForm.Image1Paint(Sender: TObject; Canvas: TCanvas;
const ARect: TRectF);
var
p1, p2, p3, p4, p5, p6: TPointF;
prst1: TRectF;
i :Integer;
begin
Image1.Bitmap.Canvas.Stroke.Color := TAlphaColors.Black;
Image1.Bitmap.Canvas.Stroke.Thickness := 3;
p1 := TPointF.Create(PX, PY);
Image1.Bitmap.Canvas.BeginScene;
with TabbedForm do begin
for i := 0 to 360 do
if (i mod 15)=0 then
begin
p2 := TPointF.Create(Round(PX+PP*sin(i*pi/180)), Round(PY+PP*cos(i*pi/180)));
Image1.Bitmap.Canvas.DrawLine(p1, p2, 100);
end;
for i := 0 to PP do
if (i mod 20)=0 then
begin
prst1 := TRectF.Create(PX+i,PY+i,PX-i,PY-i);
Image1.Bitmap.Canvas.DrawEllipse(prst1, 100);
end;
for i := 0 to 400 do
if (i mod 20)=0 then
begin
p3 := TPointF.Create(i,2*PP);
p4 := TPointF.Create(i,2*PP+2*PP);
Image1.Bitmap.Canvas.DrawLine(p3, p4, 100);
end;
for i := 0 to 400 do
if (i mod 20)=0 then
begin
p5 := TPointF.Create(0,2*PP+i);
p6 := TPointF.Create(2*PP+2*PP,2*PP+i);
Image1.Bitmap.Canvas.DrawLine(p5, p6, 100);
end;
Image1.Bitmap.Canvas.EndScene;
end;
end;
【问题讨论】:
-
你知道这段代码有异常吗?调试器是否停在那里(哪一行)?当你注释掉这段代码时,你仍然得到错误吗?我可能会将该错误与多线程、TTask、互斥锁相关联,但与绘画无关……
-
我对 FMX 图形还不是很熟悉,但我想您可能想阅读docwiki.embarcadero.com/Libraries/Tokyo/en/…。它有一些有趣的注释,包括“注意在 OnPaint 事件处理程序中调用 BeginScene 无效。”。还有 BeginScene 返回一个布尔值的事实,你应该只在它返回 true 时绘制(并且在这种情况下只调用 EndScene!)......我认为最后一个可能是你的问题的原因。
-
另外,TImage 用于显示预生成或预加载的位图。对于直接在控件上绘图,TPaintBox 是更好的选择。我认为在其绘图处理程序中更改图像的位图可能会产生各种负面影响。请参阅docs “与显示存储在文件中的图片的 TImage 不同,TPaintBox 需要应用程序直接在画布上绘制图像。使用 OnPaint 事件处理程序在绘制框的 FMX.Graphics 上进行绘制。 TCanvas,画框的绘制面。”
-
我无法重现该错误。请提供minimal reproducible example。将您的代码减少到仍然会导致错误的最低限度。
-
我已投票关闭此问题,因为您未能提供@TomBrunberg 要求的 MCVE。
标签: delphi firemonkey