【问题标题】:Code behaves differently in Android and Windows代码在 Android 和 Windows 中的行为不同
【发布时间】: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


【解决方案1】:

此代码在所有平台上都是错误的。

Image.Bitmap.Create (w, h);

在已经构造的实例上运行构造函数。你不想那样做。您可能会在某些平台上侥幸逃脱,但它永远不会正确。

像这样设置位图尺寸:

Image.Bitmap.SetSize(w, h);    

您可能也想在位图上调用 Clear。

【讨论】:

  • 据我所知,这不是错误。 “当使用对象引用(而不是类引用)调用构造函数时,它不会创建对象。而是构造函数对指定的对象进行操作,只执行构造函数实现中的语句,然后返回一个引用物体。” --docwiki.embarcadero.com/RADStudio/XE5/en/Methods
  • @Inspired 不,这是一个错误。 FMX TBitmap 不支持此类使用。语言允许它,但类必须支持它。但事实并非如此。而且我有理由确定语言功能没有被弃用。
  • 我从 embaradero 帮助中获得了此代码(不,找不到返回 url)。它仍然适用于 Windows 7。无论如何我尝试声明 bitmap:tbitmap,执行 tbitmap.create 并将其分配给 timage,结果相同:适用于 windows,而不适用于 android。如果仍然认为是错误的,那么什么是正确的?
  • @David,它有效!由于我之前尝试过 SetSize ,导致分段错误,所以我起初没有注意您的回答。经过一些实验,我发现 SetSize after BeginScene 会导致段错误,before 就像我现在所做的一样。 Bitmap.Clear 在 Windows 上不是必需的,但在 Android 上是必需的。感谢您的提示。我从 Embarcadero 示例代码中复制了我的代码,请参阅:docwiki.embarcadero.com/CodeExamples/XE5/en/…,然后查找 FormCreate。在那里你会找到 Bitmap.Create。
  • Emba 代码示例的质量非常差。我认为它们是由实习生写的,没有任何经验的人检查它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多