通过包含表单的按钮在运行时删除选项卡

时间:2012-12-11 18:53:51

标签: delphi lazarus

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

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。

我该如何解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分: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段以后的建议仅适用于按钮是正在释放的控件的子项的情况。

答案 1 :(得分: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;

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

如何释放/删除选项卡式

短而简单

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;