首页 > 解决方案 > 从滚动列表中删除动态创建的面板

问题描述

希望我能正确地表达这一点。我有TScrollBox一个表格。我正在将另一个表单的实例添加到我正在添加到的动态创建的面板中TScrollBox,这是我用来添加它的代码。

procedure TSettings.AddWFOnclick(Sender: TObject);
var
    dlg : TWFDetail;
    panel: TPanel;
    i    : Integer;
begin
    panel := TPanel.Create(self);

    dlg := TWFDetail.Create(self);

    panel.Parent := WFList;
    panel.clientheight := dlg.height;
    panel.align := alTop;
    panel.Top := 330;
    panel.Left := 0;

    dlg.Parent := panel;
    dlg.align := alClient;

    dlg.visible := True;

    dlg.Show;

end;

上面的作品很好地添加了我的表单和面板。如此处所示: 添加面板工作

当我尝试关闭 dlg 并移除面板时会出现此问题。我没有任何示例代码。我已经尝试了十几种不同的方法,但似乎无法弄清楚。我正在通过单击红色 X 的关闭调用来关闭表单,然后面板仍然存在。在这里看到: 问题

我需要能够移除空白面板并将所有内容向上移动。由于面板是动态创建的,因此我似乎无法理解它。

育儿结构是TScrollBox>>TPanelMyForm

任何帮助,将不胜感激。

标签: delphidelphi-10-seattle

解决方案


您可以使用TNorifyEventTWFDetail表单。定义它:

property OnCloseForm:TNotifyEvent read FOnCloseForm write FOnCloseForm;

当您关闭表单时,如果已分配,则触发该事件:

  Self.Close;

  if Assigned(OnCloseForm) then
    OnCloseForm(Self);

创建表单时,分配OnCloseForm事件:

...
dlg.OnCloseForm := CloseForm;
...

并定义一个简单的CloseForm过程来释放用于包含表单的面板:

var
  pnl:TPanel;
begin
  if (Sender is TWFDetail) then begin
    if TWFDetail(Sender).Parent is TPanel then begin
      pnl := TPanel(TWFDetail(Sender).Parent);
      pnl.Free;
    end;
  end;
end;

还有其他一些方法可以做到这一点,但这工作正常。

在此处输入图像描述


推荐阅读