You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从TScrollBox中移除动态创建的TPanel组件?

Removing Dynamically Created TPanels from TScrollBox in Delphi

First, let's tweak your creation code to simplify cleanup and avoid memory leaks: set the TPanel as the owner of your TWFDetail form. This way, destroying the panel will automatically take care of destroying the form too. Here's the adjusted creation code:

procedure TSettings.AddWFOnclick(Sender: TObject);
var
  dlg : TWFDetail;
  panel: TPanel;
  btnRemove: TButton; // Add a remove button for each panel
begin
  panel := TPanel.Create(self);
  panel.Parent := WFList;
  panel.ClientHeight := 330; // Match your desired height
  panel.Align := alTop;
  panel.Margins.Top := 5; // Optional: add spacing between panels

  // Create the form with the panel as its owner
  dlg := TWFDetail.Create(panel);
  dlg.Parent := panel; // Attach the form to the panel
  dlg.Align := alClient; // Make the form fill the panel
  dlg.BorderStyle := bsNone; // Remove the form's title bar (since it's inside a panel)

  // Add a remove button to the panel
  btnRemove := TButton.Create(panel);
  btnRemove.Parent := panel;
  btnRemove.Caption := 'Remove';
  btnRemove.Align := alRight;
  btnRemove.Width := 75;
  btnRemove.OnClick := RemovePanelClick;
end;

Removing a Single Panel

Add a click handler for the remove button that safely destroys the panel and its contained form:

procedure TSettings.RemovePanelClick(Sender: TObject);
var
  targetPanel: TPanel;
begin
  // Get the panel reference from the button's parent
  targetPanel := TPanel(TButton(Sender).Parent);
  
  // Detach the panel from the scrollbox first
  targetPanel.Parent := nil;
  // Destroy the panel (this automatically destroys the TWFDetail form too)
  targetPanel.Free;
end;

Removing All Panels at Once

If you need to clear all panels from the scrollbox, loop through the controls backwards (to avoid index issues as controls are removed):

procedure TSettings.RemoveAllPanels(Sender: TObject);
var
  i: Integer;
  currentControl: TControl;
begin
  for i := WFList.ControlCount - 1 downto 0 do
  begin
    currentControl := WFList.Controls[i];
    if currentControl is TPanel then
    begin
      currentControl.Parent := nil;
      currentControl.Free;
    end;
  end;
end;

Key Tips

  • Ownership is Critical: By making the panel the form's owner, you eliminate the need to manually track and destroy the TWFDetail instance—Freeing the panel handles it all.
  • Loop Backwards: When removing multiple controls from a parent, iterating from last to first prevents skipping items (since removing a control reduces the ControlCount).
  • Detach Before Destroy: Setting Parent := nil removes the panel from the scrollbox's visual tree before destruction, avoiding UI glitches.

内容的提问来源于stack exchange,提问作者James West

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:35:52