FireMonkey安卓iOS开发:运行时创建与销毁TGrid
问题分析与解决方案
哥们,你的代码问题根源很明显——你在按钮点击事件里把TGrid1声明成了局部变量,每次触发点击事件时,这个变量都是全新的,根本找不到之前创建的那个TTGrid实例!所以Assigned(TGrid1)永远是false,之前创建的Grid一直留在内存里没被销毁,多次点击后内存泄漏堆积,自然会卡顿,后来出现的访问违规也是因为野指针或者重复创建的组件冲突导致的。
下面给你两种可行的解决思路:
方案一:用窗体成员变量管理Grid实例(最直接的修复)
首先,你需要把Grid的引用从局部变量改成窗体的成员变量,这样每次点击都能访问到上一次创建的实例:
- 打开窗体的类声明(一般在
.pas文件的TformMain类里),在private区块添加成员变量:
private FGrid1: TTGrid; // 用来保存Grid的全局引用
- 修改按钮点击事件的代码:
procedure TformMain.AddItemRefreshClick(Sender: TObject); begin // 先销毁已存在的Grid实例 if Assigned(FGrid1) then begin FGrid1.DisposeOf; // FMX环境用这个,VCL环境换成FGrid1.Free; FGrid1 := nil; // 置空避免野指针 end; // 创建新的Grid FGrid1 := TTGrid.Create(formMain); with FGrid1 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;
这样每次点击按钮时,都会先检查是否有已存在的Grid,销毁后再创建新的,不会再出现内存泄漏的问题。
方案二:避免销毁重建,直接更新数据(更高效)
如果你的需求只是更新Grid里的内容,而不是改变Grid的结构(比如列数、样式),其实完全没必要销毁重建组件——直接清空现有数据,重新添加新项就行,这样性能更好,也不会有内存问题。举个简单例子:
procedure TformMain.AddItemRefreshClick(Sender: TObject); begin // 如果Grid还没创建,先初始化 if not Assigned(FGrid1) then begin FGrid1 := TTGrid.Create(formMain); // 这里写你的Grid初始化代码,和之前一样 end; // 清空现有数据 FGrid1.ClearAll; // 添加新项的逻辑,比如: FGrid1.AddColumn('列1'); FGrid1.AddRow(['新内容1']); // ... 其他添加逻辑 end;
这个方案更推荐,因为频繁创建销毁可视化组件本身就会消耗性能,能复用就尽量复用。
内容的提问来源于stack exchange,提问作者RickyBelmont
相关产品推荐
相关产品推荐

