【发布时间】: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单步执行。sgnController和sgnCustomer是什么?如果在那里抛出异常,它们的ScaleBy属性是否有设置器?如果是这样,他们的代码是什么样的?setbitmap是做什么的?向下钻取,直到找到导致问题的确切行 - 同样,调用堆栈会立即告诉我们。 -
一个无效的句柄让我怀疑对
.setbitmap的调用 - 试图绘制到一个无效的上下文,等等......但是,如果你进行一些调试并报告回来会容易得多。 -
很高兴成为你的橡皮鸭。 en.wikipedia.org/wiki/Rubber_duck_debugging ;)
标签: android forms delphi firemonkey delphi-xe7