使用Delphi XE2,没有第三方组件/套件,没什么特别的。
在表单上有一个TCategoryPanelGroup(catPanGroup)。我可以轻松地添加尽可能多的TCategoryPanel:
procedure TSomeForm.PopulateGrp(Sender: TObject);
var catPanel: TCategoryPanel;
x: word;
begin
x := 0;
while x < 9 do
begin
catPanel := catPanGroup.CreatePanel(Self) as TCategoryPanel;
// Also tried the line below, using the panel group as the owner
// catPanel := catPanGroup.CreatePanel(catPanGroup) as TCategoryPanel;
//it also works without the following line
catPanel.PanelGroup := catPanGroup;
catPanel.Caption := 'and nothing else matters';
Inc(x);
end; //loop
end;
我不关心面板顺序,不关心(还)它看起来如何,我可以在这些面板中插入标签,文本框和按钮,它们可以正常工作,没有问题。我退出应用程序,没有(明显)泄漏。
然而,应用程序有点动态并需要删除一个面板,让我们说最后一个。所以,我的直接反应是:
var catPanel: TCategoryPanel;
begin
catPanel := catPanGroup.Panels[catPanGroup.Panels.Count - 1];
catPanGroup.Panels.Remove(catPanel);
end;
或者:
var catPanel: TCategoryPanel;
begin
catPanGroup.Panels.Delete(catPanGroup.Panels.Count - 1);
end;
偶:
var catPanel: TCategoryPanel;
begin
catPanel := catPanGroup.Panels[catPanGroup.Panels.Count - 1];
catPanGroup.Panels.Remove(catPanel);
catPanGroup.RemoveControl(catPanel);
//catPanel.PanelGroup := nil; <- can't do, it raises an exception
end;
当事情不起作用时我:
catPanGroup.Panels.Clear();
//and rebuild every single panel
那么¿错误是什么?在某些情况下没有错误,但是当我退出应用程序时,我总是得到一个异常(访问冲突)。 ¿也许来自我在TCategoryPanel中插入的控件?不,我仍然得到访问冲突而不在这些面板上创建任何控件。并且只有当我删除(或尝试删除)面板时才会弹出异常。不久将在XE3上尝试。
¿是否有人能够在运行时创建和删除TCategoryPanel?
答案 0 :(得分:2)
RemovePanel
方法是私有的,但您可以使用类帮助程序来访问此类过程。
试试这个
Type
TCategoryPanelGroupHelper = class helper for TCustomCategoryPanelGroup
public
procedure RemovePanel_(Panel: TCustomCategoryPanel);
end;
{ TCategoryPanelGroupHelper }
procedure TCategoryPanelGroupHelper.RemovePanel_(Panel: TCustomCategoryPanel);
begin
Self.RemovePanel(Panel);
end;
并使用如此
//This code will remove the first panel, be sure to check the bounds of the index passed.
catPanGroup.RemovePanel_(TCustomCategoryPanel(catPanGroup.Panels[0]));
答案 1 :(得分:1)
看起来好像虽然面板永远不会被删除。 VCL(TCustomCategoryPanelGroup.RemovePanel
)中的面板删除代码是私有的,只能从类别面板析构函数和为面板设置新的父面板组时调用。在后一种情况下,VCL确保新父项存在(不是nil),否则会引发异常。
下面是一个不是很好的解决方法,它创建了一个临时面板组来托管要删除的面板:
var
catPanel: TCategoryPanel;
dummy: TCategoryPanelGroup;
begin
catPanel := catPanGroup.Panels[catPanGroup.Panels.Count - 1];
dummy := TCategoryPanelGroup.Create(nil);
try
dummy.Visible := False;
dummy.Parent := Self;
catPanel.PanelGroup := dummy;
finally
dummy.Free;
end;
答案 2 :(得分:0)
这对我有用:
procedure zapPanels(sender : tobject);
var
idx : integer;
x : tCategoryPanel;
begin
for idx := ((sender as tCategoryPanelGroup).Panels.Count)-1 downto 0 do
begin
x := (sender as tCategoryPanelGroup).Panels.Items[idx];
x.Destroy;
end;
end;