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;

フォームのキャプションは、自動作成されたタブシート キャプションに自動的に使用されます。

タブ付きフォームを解放/削除する方法

短くてシンプル

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 に答える