1

我在运行时创建标签,如下所示:

procedure TForm1.ShowFormOnTab(pProcName:String);
var
  Newform: TForm;
  ClassToUse: TFormClass;

  NewTab: TTabSheet;
  FormName: String;

begin
  NewTab := TTabSheet.Create(PageControl1);
  NewTab.PageControl:= PageControl1;

  PageControl1.ActivePage :=  NewTab;

  if pProcName='ProcfrmSetupItemCategories' then
    ClassToUse := TfrmSetupItemCategories
  else if pProcName='ProcfrmZones' then
    ClassToUse := TfrmZones
  else
    ClassToUse := nil;
  if Assigned(ClassToUse) then
    begin
      NewForm := ClassTouse.Create(NewTab);
      NewTab.Caption := NewForm.Caption;
    end;

现在,选项卡正确显示,表格也显示在它们上面。我需要这样做,因为表单 + 选项卡是在运行时创建的。

但这是我的问题:表单上有一个关闭按钮,单击时会释放表单的资源。但我也希望在单击表单按钮时关闭 TAB。

我该如何解决这个问题?

谢谢!

4

2 回答 2

4

您可以简单地Free使用标签页。您不需要单独释放选项卡表的子项。只需Free在标签页上调用即可。

但是,如果该按钮位于正在释放的选项卡上,那将不起作用。无法从按钮的OnClick事件处理程序中释放按钮的父级。

解决方案是给自己发一条消息。该消息需要包含释放标签页所需的信息。通过发布消息,您允许OnClick事件处理程序在处理排队的消息之前运行完成。

const
  WM_FREECONTROL = WM_USER;
....
PostMessage(Self.Handle, WM_FREECONTROL, 0, LParam(TabSheet));

然后将消息的处理程序添加到表单:

procedure WMFreeControl(var Message: TMessage); message WM_FREECONTROL;

并像这样实现它:

procedure TForm1.WMFreeControl(var Message: TMessage);
begin
  TObject(Message.LParam).Free;
end;

现在,写了这个冗长的回复后,请明确第 2 段以后的建议仅适用于按钮是被释放控件的子控件的情况。

于 2012-12-11T18:58:23.733 回答
2

我不喜欢事情变得复杂

如何获取选项卡式表单 (PageControl)

TForm1 = class( TForm )
  PageControl1 : TPageControl;

  procedure NewTabbedForm;
end;

procedure TForm1.NewTabbedForm;
var
  LForm : TForm;
begin
  // Some code to get a new form instance into LForm

  LForm := TTabForm.Create( Self );

  // now the magic to put this form into PageControl as a TabSheet
  LForm.ManualDock( PageControl1, PageControl1, alClient );
  // Finally
  LForm.Show;
end;

表单的 Caption 将自动用于自动创建的 TabSheet Caption。

如何释放/删除选项卡式表单

简短而简单

TTabForm = class( TForm )
  Close_Button : TButton;
  procedure Close_ButtonClick( Sender : TObject );
end;

procedure TTabForm.Close_ButtonClick( Sender : TObject );
begin
  Self.Release;
end;

多一点点

TTabForm = class( TForm )
  Close_Button : TButton;
  procedure Close_ButtonClick( Sender : TObject );
  procedure FormClose( Sender : TObject; var Action : TCloseAction );
end;

procedure TTabForm.Close_ButtonClick( Sender : TObject );
begin
  Self.Close;
end;

procedure TTabForm.FormClose( Sender : TObject; var Action : TCloseAction );
begin
  Action := caFree;
end;
于 2012-12-12T00:07:15.273 回答