2010-06-22 89 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的大小。