2010-06-22 96 views
2

我在C++ Builder 6中編寫了一些程序(別問我爲什麼)。
在formResize事件發生後,我會對錶單組件執行一些操作。
但是,當我關閉我的程序後,它看起來像刪除表單上的所有組件,所以我有異常,一切都崩潰了。
有我的代碼:退出後的C++ Builder onResize事件

void __fastcall TForm3::FormResize(TObject *Sender) 
{ 
    Image1->Picture->Graphic->Width = Image1->Width; 
    Image1->Picture->Graphic->Height = Image1->Height;  
} 

我能做些什麼呢?

回答

2

你可以檢查,以確保對象沒有被刪除:

void __fastcall TForm3::FormResize(TObject *Sender) 
{ 
    if (Image1) { 
     Image1->Picture->Graphic->Width = Image1->Width; 
     Image1->Picture->Graphic->Height = Image1->Height; 
    } 
} 

但是,假設你總是組指針回空當你刪除它們。

UPDATE:

或者你可以這樣做:

void __fastcall TForm3::FormResize(TObject *Sender) 
{ 
    if (this->Visible) { 
     Image1->Picture->Graphic->Width = Image1->Width; 
     Image1->Picture->Graphic->Height = Image1->Height; 
    } 
} 
+0

構建器會自動刪除Image1和其他組件,並且它們的指針似乎不會設置爲NULL。 – Andrew 2010-06-22 20:25:59

+0

謝謝,這是有效的 – Andrew 2010-06-22 21:06:13

2

那麼後期除了可能的答案列表中,該組件舉行國集,這包含有關組件的信息(鼓)當前狀態。當表單被釋放時,狀態集包括csDestroying狀態。因此,在您的調整大小事件中,您可以包含此檢查。

void __fastcall TForm3::FormResize(TObject *Sender) 
{ 
    if (!ComponentState.Contains(csDestroying)) { 
     Image1->Picture->Graphic->Width = Image1->Width; 
     Image1->Picture->Graphic->Height = Image1->Height; 
    } 
} 

這將確保您的調整大小代碼僅在窗體未被釋放時發生。這是否比robinjam建議的方法更合適,取決於你自己決定。然而,我最喜歡這種方法,因爲它看起來更像是「正確」的做法。如果在未來版本的VCL庫中visible參數尚未設置爲false,會發生什麼情況。

但是這取決於你,我已經添加它來提供不同的替代方案。

2

更簡潔的方法是根本不調整底層圖形本身的大小,而是使用TImage的Stretch屬性讓它簡單地調整Graphic的顯示大小。但是,如果您必須調整實際圖形的大小,那麼您應該使用TImage的OnResize事件而不是TForm的OnResize事件,然後使用TImage的Anchors屬性讓VCL自動爲您調整TImage的大小。