繁体   English   中英

如何在 Firemonkey 运行时创建和销毁 TGrid — Android 和 iOS App Dev

[英]How to Create and Destroy TGrid at Runtime in Firemonkey — Android and iOS App Dev

我在运行时创建了一个 TGrid。 该过程要求我应该在单击“添加项目并刷新”按钮重新创建之前销毁 TGrid。 我注意到,如果我在重新创建 TGrid 之前不销毁它,那么沉重的开销会导致我的应用程序在执行 8 次或更多次时冻结。

我尝试了以下代码但无济于事:

procedure TformMain.AddItemRefreshClick(Sender: TObject);
var
  TGrid1 : TTGrid;
begin
  if Assigned(TGrid1) then
  begin
    TGrid1.DisposeOf;
    {TGrid1.Free;    Tried this also but not working}
    {TGrid1 := nil;  Tried this also but not working}
  end;

  TGrid1 := TTGrid.Create(formMain);
  With TGrid1 do
  begin
    Parent := formMain;
    Align := TAlignLayout.Client;
    Margins.Top := 5;
    Margins.Left := 5;
    Margins.Right := 5;
    Margins.Bottom := 5;
    ScrollBars.Visible := True;
    Header.Format.Font.Size := 11;
    Cells.Format.Font.Size := 11;
    TabOrder := 0;
  end;
end;

我在地址处遇到访问冲突...听起来很糟糕!

有没有更简单的方法可以在运行时创建和销毁像 TGrid 这样的可视化组件?

您必须使用非局部变量来存储网格,以便在调用此方法之间保留其地址。

目前, TGrid1是一个局部变量。 这实质上意味着它是每次调用例程时创建的变量。 它的值不会在调用之间保存。 而在Delphi中,非托管类型的局部变量没有被初始化,所以这基本上是一个随机指针。 使用它是非常危险的! (并且Assigned不会帮助你,因为随机指针很可能是非零的,因为它是......好吧,随机的。)

(顺便说一句,变量名称TGrid1非常令人困惑,因为它以T开头。通常只有类型名称以T开头。)

因此,改为在您的表单 class 中添加一个私有字段:

  private
    FMyGrid: TGrid;

(我不知道 class 名称是:在您的 Q 中,您同时编写TTeeGridTTGrid 。)

然后你可以做

procedure TformMain.AddItemRefreshClick(Sender: TObject);
begin

  // Free old grid
  FreeAndNil(FMyGrid);

  // Create new grid
  FMyGrid := TGrid.Create(formMain);
  with FMyGrid do
  begin
    Parent := formMain;
    Align := TAlignLayout.Client;
    Margins.Top := 5;
    Margins.Left := 5;
    Margins.Right := 5;
    Margins.Bottom := 5;
    ScrollBars.Visible := True;
    Header.Format.Font.Size := 11;
    Cells.Format.Font.Size := 11;
    TabOrder := 0;
  end;

end;

FreeAndNil(FMyGrid)基本上执行FMyGrid.Free并将指针设置为nil ,这样在TGrid.Create构造函数应该引发异常的情况下,您不会得到一个悬空指针。

此外,不需要if Assigned(FMyGrid) then部分,因为FMyGrid.Free会进行检查。

另请注意, FMyGrid现在是 class 的成员,因此它从一开始就被初始化为nil

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM