我在C ++ Builder 6中编写了一些程序(不要问我为什么)
在formResize事件发生后,我对on-form组件执行一些操作
但它发生在我关闭我的程序后,看起来就像删除的表单上的所有组件,所以我有异常,一切都崩溃。
有我的代码:
void __fastcall TForm3::FormResize(TObject *Sender)
{
Image1->Picture->Graphic->Width = Image1->Width;
Image1->Picture->Graphic->Height = Image1->Height;
}
我该怎么办?
答案 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的大小。