2013-09-25 3 views
1

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

void __fastcall TForm1::FormResize(TObject *Sender) 
{ 
    Button1->Visible = false; 
} 

Я пробовал использовать различные события изменения размера, но это тоже не работает. Что я делаю неправильно?

PS. Извините за мой плохой английский.

+0

В вашем инструменте для создания форм проверьте значение по умолчанию кнопки. Вы можете отключить его. –

ответ

4

Нет ничего плохого. Форма действительно изменяет размер, пока она создается, поэтому вы получаете событие. Есть много способов, вы можете обратиться в этом:

  1. использовать переменный, чтобы игнорировать первое OnResize события, пока форма не будет готова:

    private: 
        bool fReady; 
    

    void __fastcall TForm1::FormResize(TObject *Sender) 
    { 
        if (!fReady) 
         fReady = true; 
        else 
         Button1->Visible = false; 
    } 
    
  2. использовать Form-х 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; 
    } 
    
  3. использовать короткий таймер вместо пользовательского сообщения:

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

Просто назвать несколько.

+0

Почему вы нажимаете сообщение, а не просто устанавливаете 'fReady = true;' в обработчике 'FormShow'? (NB. 'FReady' должен быть инициализирован в' false' в конструкторе). –

+1

Событие OnShow запускается до того, как форма фактически станет видимой на экране, поэтому сообщение является просто дополнительной задержкой, чтобы убедиться, что пользователь видит окно перед тем, как позволить скрыть эту кнопку. И переменная инициализируется значением false RTL в силу того факта, что она является членом класса Form, и все потомки TObject (которые 'TForm1') автоматически заполняют выделенную память нулями перед вызовом конструктора. –

+0

Это то, что мы должны полагаться на нуль-память при кодировании? –

Смежные вопросы