我有一個表單,然後我有一個'TPageControl'對象(名爲'MyPages')和一個'TButton'對象(名爲'MyButton')在它上面設計時間。 然後我有一個名爲'TTab'的新類,它擴展了'TTabSheet'。 'TTab'類有一個'TButton'對象作爲其成員變量之一,如下所示。如何將消息從對象傳遞到Free Pascal中的另一個對象
class TTab = class(TTabSheet)
private
m_btnCloseTab: TButton;
end;
當我點擊「爲myButton」,它會創建一個新的「TTAB」對象,初始化標籤(如實例化「m_btnCloseTab」),並在運行時添加到「MyPages」。
Procedure TForm1.MyButtonClick(Sender:TObject);
var
newTab: TTab;
newCaption: AnsiString;
begin
newCaption:= 'Tab' + IntToStr(count); //count is a global var
inc(count);
newTab:= TTab.Create(nil);
newTab.Init(newCaption);
newTab.Parent(MyPages);
end;
這就是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並將Tab作爲其所有者(mbtn_CloseTab:= TButton.Create(self),而不是... Create(nil)),那麼該按鈕會隨選項卡一起自動銷燬。另外,TTab應該有一個Notification方法,當它的一個子節點被銷燬並且你可以使用它來設置mbtn_CloseTab爲零時,它會被調用:這樣可以避免Tab在按鈕被銷燬之前調用按鈕的析構函數一些原因。 –
謝謝您的評論(我認爲沒有人再使用Free Pascal),但它對實際結果沒有影響。 通過使用create(nil),我必須在析構函數中釋放m_btnCloseTab。通過使用Create(Self),TTab類的析構函數會自動執行它。 什麼是通知方法?我如何實現一個?我認爲這是我需要做的事情,有點像C#中的Delegate函數。欣賞它,如果你能指向我的教程或文檔如何做到這一點。 –
你錯了。訪問Lazarus論壇,查看活躍的Pascal社區。 –