Я только что попытался написать небольшую программу на C ++ Builder 6 (не спрашивайте меня почему, это просто домашняя работа в институте).
Итак, моя программа должна скрывать button1 при изменении размера формы.
Но событие resize возникает после того, как окно создано, это означает, что после запуска программы button1 уже невидим.
void __fastcall TForm1::FormResize(TObject *Sender)
{
Button1->Visible = false;
}
Я пытался использовать различные события изменения размера, но это тоже не работает.
Что я делаю не так?
PS. Извините за мой плохой английский.
Нет ничего плохого. Форма действительно изменяет размер во время ее создания, поэтому вы получаете событие. Есть много способов решить эту проблему:
используйте переменную, чтобы игнорировать первый OnResize
событие, пока форма не будет готова:
private:
bool fReady;
void __fastcall TForm1::FormResize(TObject *Sender)
{
if (!fReady)
fReady = true;
else
Button1->Visible = false;
}
использовать форму OnShow
Событие для отправки пользовательского сообщения о готовности формы:
private:
bool fReady;
protected:
virtual void __fastcall WndProc(TMessage &Message);
const UINT WM_READY = WM_APP + 100;
void __fastcall TForm1::WndProc(TMessage &Message)
{
if (Message.Msg == WM_READY)
fReady = true;
else
TForm::WndProc(Message);
}
void __fastcall TForm1::FormShow(TObject *Sender)
{
PostMessage(Handle, WM_READY, 0, 0);
}
void __fastcall TForm1::FormResize(TObject *Sender)
{
if (fReady)
Button1->Visible = false;
}
используйте короткий таймер вместо пользовательского сообщения:
private:
bool fReady;
void __fastcall TForm1::Timer1Timer(TMessage &Message)
{
Timer1->Enabled = false;
fReady = true;
}
void __fastcall TForm1::FormShow(TObject *Sender)
{
Timer1->Enabled = true;
}
void __fastcall TForm1::FormResize(TObject *Sender)
{
if (fReady)
Button1->Visible = false;
}
Просто назвать несколько.
Других решений пока нет …