0

当我尝试将控件添加到TTabSheet运行时已经存在的控件时,这些控件在添加OnShowTTabSheet.

重现步骤:

  1. 在设计器中添加TPageControlaTForm
  2. TTabSheet在设计器中为此添加 3 个对象TPageControl
  3. 设置第一个TTabSheet活动(在设计时)。
  4. 运行以下代码:

头文件:

#ifndef Unit1H
#define Unit1H

#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // Von der IDE verwaltete Komponenten
    TPageControl *PageControl1;
    TTabSheet *TabSheet1;
    TTabSheet *TabSheet2;
    TTabSheet *TabSheet3;
    TButton *Button1;
    void __fastcall TabSheet1Show(TObject *Sender);
private:    // Benutzer-Deklarationen
    TButton *ButtonConstructor;
    TButton *ButtonOnTabShow;
public:     // Benutzer-Deklarationen
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

源文件:

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    // Adding a TButton in the Form's constructor works

    TTabSheet *ts = this->TabSheet1;

    if (!this->ButtonConstructor)
    {
        ButtonConstructor = new TButton( ts );
        ButtonConstructor->Name = "ButtonConstructor";
        ButtonConstructor->Caption = "Construct";
        ButtonConstructor->Parent = ts;
    }


}
//---------------------------------------------------------------------------
void __fastcall TForm1::TabSheet1Show(TObject *Sender)
{
    // Adding a TButton in the OnShow Event of TTabSheet does NOT work:
    // The button stays invisible

    TTabSheet *ts = dynamic_cast< TTabSheet * >( Sender );
    // TTabSheet *ts = this->ButtonOnTabShow;   // does not make any difference

    if (!this->ButtonOnTabShow)
    {
        ButtonOnTabShow = new TButton( ts );
        ButtonOnTabShow->Name = "ButtonOnTabShow";
        ButtonOnTabShow->Caption = "Show";
        ButtonOnTabShow->Parent = ts;
        // Button should be placed below the other
        ButtonOnTabShow->Top = ButtonConstructor->Top + ButtonConstructor->Height + 2;
    }

    // The following 2 lines would make the Button visible
    // PageControl1->ActivePageIndex = 1;
    // PageControl1->ActivePageIndex = 0;
}

结果是:

  • ButtonConstructor可见
  • ButtonOnTabShow不可见

如果您单击TabSheet2然后返回到TabSheet1ButtonOnTabShow也将可见。

这是一个无法解决的错误,还是我错过了什么?

4

1 回答 1

0

我不确定它究竟为什么会发生,但我可以重现它。它可能与TPageControl管理其TTabSheet对象的可见性的方式有关(因为 Win32 API 没有选项卡表的概念。TTabSheet完全是 VCL 发明,以简化选项卡式内容的管理)。但是,使用此代码很容易解决:

#define WM_ENSUREBUTTONSHOWN (WM_APP+1)

void __fastcall TForm1::TabSheet1Show(TObject *Sender)
{
    // ...

    if (!this->ButtonOnTabShow)
    {
        ButtonOnTabShow = new TButton( ts );
        // ...
        PostMessage(Handle, WM_ENSUREBUTTONSHOWN, 0, 0);
    }
}

void __fastcall TForm1::WndProc(TMessage &Message)
{
    TForm::WndProc(Message);
    if ((Message.Msg == WM_ENSUREBUTTONSHOWN) && (this->ButtonOnTabShow))
    {
        this->ButtonOnTabShow->Hide();
        this->ButtonOnTabShow->Show();
    }
}

或者:

#define WM_REFRESHTABSHEET (WM_APP+1)

void __fastcall TForm1::TabSheet1Show(TObject *Sender)
{
    // ...

    if (!this->ButtonOnTabShow)
    {
        ButtonOnTabShow = new TButton( ts );
        // ...
        PostMessage(Handle, WM_REFRESHTABSHEET, 0, 0);
    }
}

void __fastcall TForm1::WndProc(TMessage &Message)
{
    TForm::WndProc(Message);
    if ((Message.Msg == WM_REFRESHTABSHEET) && (this->TabSheet1->Visible))
    {
        this->TabSheet1->Hide();
        this->TabSheet1->Show();
    }
}
于 2017-03-07T19:03:50.747 回答