【发布时间】:2020-11-20 01:21:03
【问题描述】:
我在运行时创建了一个 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 这样的可视化组件?
【问题讨论】:
-
感谢提醒(已更新)。我做了你的建议,见下文,但我得到了相同的访问冲突.. if Assigned(CanvassGrid) 然后开始 FreeAndNil(CanvassGrid);结束;
-
您必须使用全局变量来存储网格,以便在调用此方法之间保留其地址。那就是问题所在。 (目前
TGrid1(对象实例变量的名字很奇怪,因为它以T开头!)是一个非托管类型的局部变量,所以在方法的开头它是未初始化的。因此,它是一个随机指针!)然后你应该做MyGrid.Free,或者——甚至更好——FreeAndNil(MyGrid)。不需要if Assigned(...),因为Free会自行检查。 -
完美!我使用了全局变量,如果分配则删除,现在它可以工作了!请发布您的答案并将其标记为已回答。非常感谢。
标签: delphi firemonkey tcomponent