Обнаружение, если форма данного типа уже открыта в приложении Firemonkey

Я пытаюсь найти способ узнать, открыт ли данный тип формы в моем приложении, прежде чем открывать новый. Причина этого в том, что в приложении есть определенные формы, которые имеют смысл открывать только один экземпляр за раз, но я бы не стал делать их строго модальными.

Чтобы решить эту проблему, я реализовал следующий метод, который перебирает 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 в какой бы форме я ни прошел.

Есть ли способ, которым я могу изменить свою логику, чтобы успешно определить, существует ли уже форма определенного типа в приложении? Есть ли лучший подход к этой проблеме, на которую я должен обратить внимание?

0

Решение

Вы используете жесткий бросок, который не учитывает реальный тип объекта. Вот почему актерский состав всегда успешен (когда это действительно не так). Чтобы проверить, принадлежит ли объект определенному типу, вам нужно использовать 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();
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector