0

我有一个 TPageControl,其中包含许多 TTabSheets,其中包含 TForms(或者可能是 TFrames,但现在是 TForms)。

当一个选项卡进入视图时,我希望通知 TForm 或 TFrame 它已经出现在前面。我找不到任何可以做到这一点的东西。

我知道我可以在OnChange事件中获得 Active TTabSheet,所以我尝试将此类添加到 TForm:

struct iTab
{
    virtual void DoIt( void ) = 0;
};

与这个在OnChange

  ICPTab *tab = dynamic_cast<ICPTab *>( sheet->Controls[ 0 ] );

认为我可以使用 RTTI 来获取iTab指针并DoIt()从中调用我得到警告:

[BCC32 Warning] Unit1.h(18): W8130 Interface 'IPTab' does not derive from IUnknown. (Interfaces should derive from IUnknown) 
[BCC32 Warning] MainWindow.cpp(612): W8131 Casting Delphi style class 'TControl' to an interface. Use 'System::interface_cast<ICPTab>(cls)' instead

我对获取所有 IUnknown 不感兴趣,以便表单可以使用接口。

我可以使用以下方法获取 TFrame 或 TForm 指针:

  TForm *tab = dynamic_cast<TForm *>( sheet->Controls[ 0 ] );

但不能用这个指针调用非 TForm 方法。调用Activate()方法可以吗?

那么如何通知它现在显示的 TForm 或 TFrame 呢?

4

2 回答 2

0

您必须iTabIUnknown(或IInterface)派生或订购才能正确地将其用作接口。编译器警告甚至暗示您可以使用interface_cast从 Delphi 样式(又名TObject派生)对象中提取接口。或者TObject::GetInterface()改为使用。

否则,如果您只想调用自定义 TForm 类的方法,则只需将子控件指针从 TTabSheet 类型转换为实际的 TForm 派生类:

TMyForm *tab = dynamic_cast<TMyForm *>( sheet->Controls[ 0 ] );
if( tab != NULL ) tab->DoSomething();

或者:

static_cast<TMyForm *>( sheet->Controls[ 0 ] )->DoSomething();
于 2011-02-16T01:21:56.717 回答
0

我使用以下代码:

  void __fastcall TgMainWindow::mPageControlChange( TObject* Sender )
  {
     NOT_USED( Sender );
     TTabSheet* sheet = mPageControl->ActivePage;

     if ( sheet->ControlCount > 0 )
     {
        // form or frame, we will attempt to call the OnActivate method
        TForm* form = dynamic_cast<TForm *>( sheet->Controls[ 0 ] );

        if ( form == NULL )
        {
           ShowMessageDlg( this, L"Programming Error: Initial child on tabsheet must be a TForm", mtError, TMsgDlgButtons( ) << mbOK );
        }
        else
        {
           if ( form->OnActivate != NULL )
           {
              form->OnActivate( this );
           }
           else
           {
              ShowMessageDlg( this, L"Programming Error: From must have an OnActivate event", mtError, TMsgDlgButtons( ) << mbOK );
           }
        }
     }
  }

由于标签页上的表单从来没有调用过它的 OnActivate 方法,所以它工作得很好。

注意:方法示例不完整,没有调用 OnDeactivate

于 2011-02-16T22:27:25.420 回答