[英]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 中,您同時編寫TTeeGrid
和TTGrid
。)
然后你可以做
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.