C ++ Builder событие onResize после выхода - PullRequest
2 голосов
/ 23 июня 2010

Я написал какую-то программу на C ++ Builder 6 (не спрашивайте меня, почему).
Я делаю некоторые действия с компонентами на форме после того, как происходит событие formResize.
Но это происходит сразу после закрытия моей программы,и выглядит как все компоненты в форме, где удалены, поэтому у меня есть исключение, и все вылетает.
Вот мой код:

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

Что я могу сделать с этим?

Ответы [ 3 ]

2 голосов
/ 26 июня 2010

Что ж, запоздалое добавление к списку возможных ответов, компоненты содержат набор состояний, в котором хранится информация о текущем состоянии компонентов (барабанов).Когда форма освобождается, набор состояний включает в себя состояние csDestroying.Таким образом, в ваше событие изменения размера вы можете включить проверку для этого.

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

Это будет гарантировать, что ваш код изменения размера происходит только тогда, когда форма не освобождается.Является ли этот подход более подходящим, чем предложенный Робинджамом, решать вам.Однако мне больше нравится этот подход, так как он больше похож на «правильный» способ сделать это.Что произойдет, если в будущей версии библиотеки VCL для параметра visible еще не установлено значение false.

Но это зависит от вас, я добавил его, чтобы в любом случае предоставить другую альтернативу.

2 голосов
/ 07 июля 2010

Более чистый подход заключается в том, чтобы вообще не изменять размер самого графического объекта, а использовать свойство Stretch TImage, чтобы вместо этого просто изменить размер отображения графического объекта. Но если вам нужно изменить размер фактической графики, то вы должны использовать событие OnResize TImage вместо события OnResize TForm, а затем использовать свойство Anchors TImage, чтобы позволить VCL автоматически изменять размер TImage для вас.

2 голосов
/ 23 июня 2010

Вы можете убедиться, что объекты не были удалены:

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;
    } 
}
...