TCategoryPanelGroup,删除面板

时间:2013-12-27 23:38:57

标签: delphi tlist

使用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?

3 个答案:

答案 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;