簡體   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