从滚动列表中删除动态创建的面板

Remove a Dynamically Created Panel from Scroll List

希望我能正确表达这一点。我在表格上有一个 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 > TPanel > MyForm

如有任何帮助,我们将不胜感激。

您可以在 TWFDetail 表单上使用 TNorifyEvent。定义它:

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;

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