【问题标题】:Handle not Allocated on setting form property on Android in Delphi XE7在 Delphi XE7 的 Android 上设置表单属性时未分配句柄
【发布时间】:2015-02-20 10:54:50
【问题描述】:

我在打开在 XE7 中创建的新表单时遇到问题。我在 Samsung Galaxt tab2 上打开表单没有问题,但是当我想在 Sony Xperia ZR 上打开它时,我得到一个 Handle not Allocated 异常。

代码如下:

procedure TfrmNocoreDKS.actOpenDocumentExecute(Sender: TObject);
var
  frmDKSDocument: TfrmDKSDocument;
begin
  frmDKSDocument := TfrmDKSDocument.Create(nil);
  frmDKSDocument.ScaleBy := fScaleBy; 
  frmDKSDocument.UseAantal := fUseAantal;
  frmDKSDocument.DocumentId := TButton(Sender).Tag;
  frmDKSDocument.LoadDocument;
  frmDKSDocument.SetDocumentStatus := SetDocumentStatus;
  frmDKSDocument.Allowresize := True;
  frmDKSDocument.Show;
  frmDKSDocument.FillSigns;
end;

下面的代码显示了属性和 setter 的声明:

TfrmDksDocument = class(TForm)
private
  fScaleBy:Single;
public
  property ScaleBy:Single read fScaleBy write SetScaleBy;

procedure TfrmDksDocument.SetScaleBy(const Value: Single);
begin
  fScaleBy := Value;
  sgnController.ScaleBy := fScaleBy; //sgnController is a Custom Image component
  sgnController.setbitmap; //Here I get the exception
  sgnCustomer.ScaleBy := fScaleBy; //sgnCustomeris a Custom Image component
  sgnCustomer.setbitmap;
end;

SetBitmap 方法的代码:

procedure TisImage64.SetBitmap;
begin
  {$IFDEF WIN32}
  if not fBitmapCreated then
  Begin
    self.Bitmap := TBitMap.Create;
    self.Bitmap.SetSize(integer(trunc(Self.Size.Width)), integer(trunc(Self.Size.Height)));
    fBitmapCreated := True;
    self.clear;
  End;
  {$ENDIF}
  {$IFDEF ANDROID}
    self.Bitmap := MultiResBitMap.Add.Bitmap; //.Add.Bitmap;
    self.Bitmap.SetSize(integer(trunc(Self.Size.Width*fScaleBy)), integer(trunc(Self.Size.Height*fScaleBy)));
    fBitmapCreated := True;
    self.Clear;
  {$ENDIF}
  {$IFDEF IOS}
    self.Bitmap := MultiResBitMap.Add.Bitmap; //.Add.Bitmap;
    self.Bitmap.SetSize(integer(trunc(Self.Size.Width*fScaleBy)), integer(trunc(Self.Size.Height*fScaleBy)));
    fBitmapCreated := True;
    self.Clear;
  {$ENDIF}
end;

有人知道解决方案吗?

【问题讨论】:

  • 我认为这需要更多信息。 .ScaleBy 是 VCL 表单中的一种方法,但它不作为 FMX 表单上的属性存在,因此它是您添加的。它的声明是什么?它真的是财产吗?它有二传手吗? fScaleBy 是什么?它是一个有返回值的方法吗?如果是这样,它的实现是什么?如果不是,它在哪里以及如何定义?您确定这是导致异常的行吗?引发异常时,指令指针通常会向前移动 - 您是否单步执行 TfrmDKSDocument 构造函数以确保不存在异常?
  • 包含调用堆栈也会很有帮助。
  • 好的...那么 setter 中的哪一行引发了异常?如果您还没有这样做,您可以在fScaleBy := Value; 上设置断点并使用F7 单步执行。 sgnControllersgnCustomer 是什么?如果在那里抛出异常,它们的ScaleBy 属性是否有设置器?如果是这样,他们的代码是什么样的? setbitmap 是做什么的?向下钻取,直到找到导致问题的确切行 - 同样,调用堆栈会立即告诉我们。
  • 一个无效的句柄让我怀疑对 .setbitmap 的调用 - 试图绘制到一个无效的上下文,等等......但是,如果你进行一些调试并报告回来会容易得多。
  • 很高兴成为你的橡皮鸭。 en.wikipedia.org/wiki/Rubber_duck_debugging ;)

标签: android forms delphi firemonkey delphi-xe7


【解决方案1】:

2 个图像组件的大小设置不正确

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多