0

TForms (またはおそらく TFrames ですが、今のところ TForms) を含む多数の TTabSheets を持つ TPageControl があります。

タブが表示されたら、TForm または TFrame が前面に表示されたことを通知したいと思います。私はそれを行うものを見つけることができません。

イベントでActive TTabSheet を取得できることがわかっているOnChangeので、このクラスを TForm に追加しようとしました。

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

this で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

私は次のコードを使用しました:

  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 に答える
0

インターフェイスとして正しく使用するには、 (または)iTabから派生するか、または順序付けする必要があります。コンパイラの警告は、Delphi スタイル (別名派生) オブジェクトからインターフェイスを抽出するために使用できることを示唆しています。代わりに使用します。IUnknownIInterfaceinterface_castTObjectTObject::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 に答える