检测给定类型的表单是否已在 Firemonkey 应用程序中打开
Detecting if a form of a given type is already open in Firemonkey application
我试图想出一种方法来判断给定类型的表单是否在我的应用程序中打开,然后再打开一个新表单。 这样做的原因是,应用程序中的某些表单一次只打开一个实例才有意义,但我宁愿不使它们严格成为模态。
为了解决这个问题,我实现了以下方法,该方法遍历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
我传递的任何类型的形式。
有没有办法改变我的逻辑以成功检测应用程序中是否已存在某种类型的形式? 有没有更好的方法来解决这个问题,我应该看看?
您正在使用不考虑对象实际类型的硬转换。 这就是为什么演员总是成功(当它真的没有成功时)。若要测试对象是否属于特定类型,需要改用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();
相关文章:
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何从Windows应用程序输出到标准?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 检测给定类型的表单是否已在 Firemonkey 应用程序中打开
- Firemonkey:如何使用TScreen.Forms在应用程序中遍历所有表单