我在运行时创建标签,如下所示:
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。
我该如何解决这个问题?
谢谢!
答案 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)
我不喜欢事情变得复杂
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;