私はフォームを持っていて、 'MyPages'という名前の 'TPageControl'オブジェクトと 'MyButton'という名前の 'TButton'オブジェクトを持っていますその上にデザイン時間。 次に、 'TTabSheet'を拡張する 'TTab'という新しいクラスがあります。 'TTab'クラスには、以下のようなメンバ変数の1つとして 'TButton'オブジェクトがあります。私は「MyButtonという」をクリックすると Free Pascalのオブジェクトから別のオブジェクトにメッセージを渡すには
class TTab = class(TTabSheet)
private
m_btnCloseTab: TButton;
end;
は、それはタブのinit(「m_btnCloseTab」をインスタンス化するように)、新しい「TTAB」オブジェクトを作成し、
実行時で「MyPages」にそれを追加します。
これは、TTab.Init(newCaption:AnsiString)プロシージャの外観です。
Procedure TTab.Init(newCaption: AnsiString);
begin
Self.Caption:= newCaption;
m_btnCloseTab:= TButton.Create(nil);
with m_btnCloseTab do begin
Parent:= Self;
Left:= 10;
Top:= 10;
Caption:= 'Close Tab';
Visible:= True;
OnClick:= @closeTab;
end;
end;
新しいタブが追加されました。閉じるボタンは、各タブにも表示されます。
各タブの[m_btnCloseTab]をクリックして、特定のタブを閉じるにはどうすればよいですか?
以下のようにTTabのデストラクタを(TTabSheetのデストラクタをオーバーライドして)定義すると、私は外部から呼び出すことができます。
Destructor TTab.Destroy;
begin
if m_btnCloseTab <> nil then begin
m_btnCloseTab.Destroy;
m_btnCloseTab:= nil;
end;
inherited;
end;
しかし、私は、タブ内からデストラクタを呼び出すことはできません(まあ、できます)。私がそれを行うと、m_btnCloseTabオブジェクトが例外を返すように解放することはできません。これは、まだイベントハンドラであるためです。私がそれを解放しなければ、タブはきれいに閉じますが、メモリがリークします(私たちはm_btnCloseTabを解放しなかったので)。
デストラクタを 'TTab'の外部から呼び出すことができるようにイベントをトリガーする必要があると思います。私はそれをする方法を知らない。
ご協力いただければ幸いです。
ありがとうございました。
すべてを正しく理解しているかどうかはわかりません。しかし、mbtnCloseTabを所有者(mbtn_CloseTab:= TButton.Create(self)、Create(nil)ではなく)で作成すると、ボタンはタブとともに自動的に破棄されます。また、TTabには、子プロセスが破棄され、mbtn_CloseTabをnilに設定できる通知メソッドが必要です。何らかの理由で。 –
コメントをいただきありがとうございます(私はもう誰もFree Pascalを使用していないと考えていました)が、実際の結果には違いはありません。 create(nil)を使うと、m_btnCloseTabをデストラクタ内で自分で解放する必要があります。 Create(Self)を使うと、TTabクラスのデストラクタが自動的に行います。 通知方法とは何ですか?私はどのように実装しますか?私が思うことは、私がする必要があることです.C#のデリゲート関数のようなものです。あなたがチュートリアルやそれを行う方法のドキュメントに私を指すことができればそれを感謝します。 –
あなたは間違っています。 Lazarusフォーラムにアクセスして、生きたパスカルのコミュニティを見てください。 –