退出后的C ++ Builder onResize事件

时间:2010-06-22 20:19:37

标签: c++ c++builder

我在C ++ Builder 6中编写了一些程序(不要问我为什么) 在formResize事件发生后,我对on-form组件执行一些操作 但它发生在我关闭我的程序后,看起来就像删除的表单上的所有组件,所以我有异常,一切都崩溃。
有我的代码:

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

我该怎么办?

3 个答案:

答案 0 :(得分:2)

您可以检查以确保没有删除对象:

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

但是,假设您在删除指针时总是将指针设置回NULL。

更新:

或者你可以这样做:

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

答案 1 :(得分: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 :(得分:2)

更简洁的方法是根本不调整底层Graphic本身的大小,而是使用TImage的Stretch属性让它简单地调整Graphic的显示大小。但是如果你必须调整实际的Graphic大小,那么你应该使用TImage的OnResize事件而不是TForm的OnResize事件,然后使用TImage的Anchors属性让VCL自动调整TImage的大小。