0

新しいフォームを開く前に、アプリケーションで特定の種類のフォームが開いているかどうかを確認する方法を考え出そうとしています。この理由は、一度に 1 つのインスタンスを開くだけで意味のあるアプリケーションの特定のフォームがあるためですが、それらを厳密にモーダルにしたくないからです。

これを解決するために、次のメソッドを実装しました。これScreen->Formsは、提供されたフォームのタイプに各フォームを反復してキャストしようとします。キャストが作成されたかどうかを調べたところ、フォームのタイプがすでに開いていることがわかりました。

template <typename T>
bool __fastcall FormOfTypeExists( T * Form )
{
    for( int i = 0; i < Screen->FormCount; i++ )
    {
        T * CurrentForm = (T*)Screen->Forms[i];

         if( CurrentForm != 0 )
         {
             return true;
         }
    }

    return false;
};

次に、次のように、フォームを作成しようとしている場所でメソッドを呼び出します。

TFormA *Form;

if( FormOfTypeExists( Form ) )
{
    return;
}

Form = new TFormA( Owner );

Form->Show();

私が直面している問題は、渡したフォームの種類に関係なく 、常にTCommonCustomFormオブジェクトを正常にキャストできるように見えることです。Screen->Forms

特定のタイプのフォームがアプリケーションに既に存在するかどうかを正常に検出するようにロジックを変更する方法はありますか? 私が見なければならないこの問題へのより良いアプローチはありますか?

4

1 に答える 1

1

オブジェクトの実際の型を考慮しないハード キャストを使用しています。そのため、キャストは常に成功します (実際には成功しない場合)。オブジェクトが特定のタイプであるかどうかをテストするには、代わりに を使用する必要がありますdynamic_cast

また、変数を実際に使用していない場合は、変数を入力として渡さないでください。

代わりにこれを試してください:

template <typename T>
bool __fastcall FormOfTypeExists()
{
    for( int i = 0; i < Screen->FormCount; i++ )
    {
        T * CurrentForm = dynamic_cast<T*>(Screen->Forms[i]);
        if( CurrentForm != NULL )
        {
            return true;
        }
    }

    return false;
}

if( FormOfTypeExists<TFormA>() )
{
    return;
}

TFormA *Form = new TFormA( Owner );
Form->Show();
于 2016-03-09T23:37:57.103 に答える