1

C++ Builder 6 で小さなプログラムを書いてみました (理由は聞かないでください。これは研究所の宿題です)。そのため、フォームのサイズを変更するときに、私のプログラムは button1 を非表示にする必要があります。しかし、ウィンドウが作成された後にサイズ変更イベントが発生します。これは、プログラムを開始した後、button1 が既に非表示になっていることを意味します。

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

さまざまなサイズ変更イベントを使用しようとしましたが、うまくいきません。私が間違っていることは何ですか?

PS。私の悪い英語でごめんなさい。

4

1 に答える 1

4

何も問題はありません。フォームは作成中に実際にサイズ変更されます。そのため、イベントが発生します。これに対処するには多くの方法があります。

  1. OnResize変数を使用して、フォームの準備が整うまで最初のイベントを無視します。

    private:
        bool fReady;
    

    void __fastcall TForm1::FormResize(TObject *Sender)
    {
        if (!fReady)
            fReady = true;
        else
            Button1->Visible = false;
    }
    
  2. フォームの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;
    }
    

ほんの数例を挙げると。

于 2013-09-26T00:29:34.177 に答える