Delphi/C++ Builder XE 8 你应该知道的一些东西

1、FireMonkey

  • 在创建子视图时,主视图所有的控件必需已经命名,如果你的控件没有命名,XE8 会弹出下面的错误:

Cannot inherit from form ‘FormName”. It contains a component with a blank name property.

解决办法是将主视图中所有的控件命好名。

  • iOS 应用在使用 Running without Debugging 模式在设备上运行后,可能没有正确的关闭或重新打开
    • 解决办法:在设备上的话,手动强制结束应用;在模拟器上的话,在 PAServer 中输入 r 重置状态;
  • TWebBrowser 在某些平台上可能不支持某些链接行为,例如 Target 设置为Target  “_blank” 或 “_search”
    • Android 和 iOS 平台:应用程序打开一个同样的TWebBrowse窗口;
    • Windows 平台:应用程序打开一个目标网页的新IE窗口;
    • Mac OS X 平台:点击没有任何效果;

2、C++ Builder

  •  Mac OS X 应用可能在发生 OS 异常时挂起
    • 解决办法:重启PAServer,如果还行不行,重启IDE试试;
  • 在 iOS 应用中 DWORD 和 ULONG 重复声明的问题
    • OS X 头文件 “iodbcunix.h” 和 “sqltypes.h” 声明了这两个类型,而 C++Builder 的 sysmac.h 也声明了它。解决办法是在 iOS 编译配置里定义条件编译选项:_DWORD_DEFINED; _ULONG_DEFINED
  • DUnit
    • 需要在Project -> Options -> C++ Linker 中设置 Link with the Delphi Runtime Library (rtl package and cp32mt.lib/cp32mti.lib) 选项为true;
    • 在 OS X  应用中,发布 bplDUnitXRuntime22.dylib 运行时间包;
  • 使用一个 C++ Builder 组件包时不会自动导入依赖关系,会报告找不到 xxx.obj
    • 解决办法:手动在项目管理器的 Require 里增加依赖的包
  • DirectX 头文件:丢失 d3d.h 等文件
  • BCC 64:事件中结构体或5-8个字节的集合作为值参传递不再有效。
    • 如果要编译 32 位和 64 位版本时,手动条件编译吧
#ifndef _WIN64
typedef void __fastcall (__closure *TContextPopupEvent)(System::TObject* Sender, const System::Types::TPoint &MousePos, bool &Handled);
#else /* _WIN64 */
typedef void __fastcall (__closure *TContextPopupEvent)(System::TObject* Sender, System::Types::TPoint MousePos, bool &Handled);
#endif /* _WIN64 */
  •  在使用接口做为参数时,不能手动将 IDE 生成的事件函数指定给事件
    • 因为两者的声明不一样(男人哭吧哭吧不是罪),看例子,这个是通过 Delphi 单元生成的接口类型定义:
typedef void __fastcall (__closure *TFDConnectionRecoverEvent)(System::TObject* ASender,
  const Firedac::Stan::Intf::_di_IFDStanObject AInitiator, // <<< ***
  System::Sysutils::Exception* AException,
  Firedac::Phys::Intf::TFDPhysConnectionRecoverAction &AAction);

下面是 IDE 生成的事件响应函数定义:

void __fastcall TForm1::FDConnection1Recover(TObject *ASender,
          const IFDStanObject *AInitiator, // <<< ***
          Exception *AException,
          TFDPhysConnectionRecoverAction &AAction)

而解决的办法就是:将 IDE 生成的事件响应函数修改后动态关联。

3、Delphi

  • Android 和 iOS 程序使得 AtomicCmpExchange 函数可能造成程序挂起
    • 将相应的内容移入到一个单独的单元,然后使用 {$D-} 编译选项来禁止相关的调试信息

4、IDE

  • iOS 应用的 CFBundleIdentifier 设置可能会丢失;
  • 在多设备窗体设计器,只能从主视图删除一个组件;
  • 重命名 iOS 工程可能在运行或高度时失败
    • 进 Project -> Deployment 选择 Revert To Default
  • Windows Server 2008 上移动设备设置向导内容被阻止
    • 点击添加按钮添加例外
  •  版本信息不会从 All Platforms 继承,为每一个平台单独设置;

5、数据库

  • 在 64 位 Windows 平台上编译包含 TClientDataSet 的应用时可能出现下面的错误:
[DCC Error] E2597 C:\Users\Public\Documents\Embarcadero\Studio\16.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: error: cannot find -lgnustl_static

解决办法是在 SDK Manager 中修改 Android NDK library path 为:

C:\Users\<user>\Documents\Embarcadero\Studio\16.0\CatalogRepository\AndroidSDK-24.0.2\ndk\sources\cxx-stl\gnu-libstdc++\4.8\libs\armeabi-v7a
  •  在 C++ Builder 64位程序中使用 FireDAC DataSnap 驱动需要带运行时包DataSnapClient;
  • 在 Data Explorer 或 FDExplorer 中添加一个新的连接时,遇到 “Can’t modify file” 错误,下载 FDFixIni  运行并修复它;
  • Interbase 的问题(略过吧,估计用的人很少)

6、Box2D

  • Delphi 中默认没有提供相应的 DCU 文件,所以在 Project -> Options -> Delphi Compiler 中添加搜索路径 ${BDS)\source\FlatBox2D

7、GetIt

  • 不支持 UNC 路径,要使用 UNC 路径的话,映射成一个网络驱动器;

8、IME

  • Windows 8 将 IME 的支持模式从每个线程改为了每个用户,所以,如果需要你需要自己调用 API 去更改输入法状态。
分享到: