【发布时间】:2013-09-29 14:13:37
【问题描述】:
我尝试在位图上绘图。这在 Windows 中运行良好,但在 Android 中会产生分段错误(无论如何,这就是 Delphi 所说的,我只是在 Android 上没有看到任何反应)。我有一个移动项目,表单只包含一个 TToolbar、TSpeedButton、两个 TLabels 和一个 TImage。 TSpeedButton 点击只有一个事件处理程序。
当我注释掉注释下方的所有内容时,代码在 Android 中运行良好。当我尝试使用调试器时,代码可以正常工作到程序结束。没有看到绘图或分段错误。当我让它运行时出现故障。
我做错了什么?
procedure TForm2.Button_DrawClick (Sender: TObject);
var rct: TRectF;
h, w: Int32;
begin
h := Trunc (Image.Height);
w := Trunc (Image.Width);
Label_Height.Text := IntToStr (h);
Label_Width .Text := IntToStr (w);
rct := TRectF.Create(20, 20, w - 20, h - 20);
// can be commented out below //
Image.Bitmap.Create (w, h);
if Image.Bitmap.Canvas.BeginScene then
try
Image.Bitmap.Canvas.Stroke.Color := $FF0000FF;
Image.Bitmap.Canvas.StrokeThickness := 3;
Image.Bitmap.Canvas.DrawEllipse (rct, 20);
Image.Bitmap.Canvas.Stroke.Color := $FF00FF00;
Image.Bitmap.Canvas.DrawRect(rct, 0, 0, AllCorners, 40);
finally
Image.Bitmap.Canvas.EndScene;
end; // try..finally
end; // Button_DrawClick //
【问题讨论】:
-
Image.Bitmap.Create (w, h);在我看来不合适。Create是一个构造函数,它不应仅用于初始化现有对象。可能 Android 的 VM 将此视为新对象的构造,然后执行垃圾回收。尝试改用Image.Bitmap.SetSize(w, h)。 -
@alex,你可以用 xe5。
标签: android delphi graphics bitmap delphi-xe5