【问题标题】:Delphi cannot drag and drop custom componentsDelphi无法拖放自定义组件
【发布时间】:2018-03-22 08:04:07
【问题描述】:

我已经为 IDE 编写了一些组件,它们看起来都是这样的:

unit xxx;

interface

uses
 System.Classes, System.SysUtils;

type
 TMyClass = class(TComponent)
  //code...
 end;

implementation

end.

这样我可以在 VCL 和 FMX 上使用它们;换句话说,我可以制作一个 VCL win 程序和一个使用我的组件的 FMX And​​roid 应用程序。你看不到的代码是类的实现,但这并不重要。

  1. 当我开始一个 VCL 项目时,我可以拖放我的组件并使用它们。
  2. 当我启动 FMX win32 项目时,我可以拖放我的组件并使用它们。如果我将平台切换到 Android,组件仍然存在,我可以成功编译。顺便说一句,我无法拖放组件。为什么?

在第 2 点中,我的意思是在 FMX win32 下我有这样的组件:

如果我改变平台(比如 android)我会得到这个

我做错了什么?我进入了 IDE > Tools > Options > Library 并为每个平台添加了 IDE 可以在其中找到带有源代码的 .pas 的路径。有什么想法吗?

奇怪的是,在 FMX 下,如果我想用我的组件创建一个 Android 应用程序,我必须将平台更改为 win32,拖放组件,然后再改回 Android。该组件在 android 上也能很好地工作。

【问题讨论】:

  • 我的意思是TLang组件
  • 将数值类实现为非可视组件仍然是一个巨大的错误。通过从TObject 派生来解决您的所有问题。
  • 你在使用Views吗?您是将组件放到主视图还是 Android 视图上?此外,您应该使用 ComponentPlatforms 属性标记您的组件,以便 IDE 知道您的组件实际支持的平台。

标签: delphi


【解决方案1】:

你只需要包含System.Classes(我可以看到你已经拥有它),然后一定要使用这个属性:

type
 [ComponentPlatformsAttribute(pidWin32 or pidAndroid)]
 TTestComponent = class(TComponent)
  //...  
 end;

通过这种方式,即使您已切换到 Android,也可以将组件从 IDE 拖放到视图中。基本上你的代码很好,它可以与 VCL 和 FMX 一起使用,但是你告诉 IDE 该组件与你指定的平台兼容。

ComponentPlatformsAttribute 让组件构建者更加具体 控制暴露的组件。

要解决问题,您应该:

  1. 打开组件的项目
  2. 在项目管理器中右键组件>点击卸载
  3. 在类定义上方添加属性
  4. 全部保存、编译、构建和安装。

你可以找到更多参数传递给属性的构造函数,我在System.Classespas文件中找到了它们:

  pidWin32        = $0001;
  pidWin64        = $0002;
  pidOSX32        = $0004;
  pidiOSSimulator = $0008;
  pidAndroid      = $0010;
  pidLinux32      = $0020;
  pidiOSDevice32  = $0040;
  pidiOSDevice    = pidiOSDevice32;// deprecated 'Use pidiOSDevice32';
  pidLinux64      = $0080;

  pidWinNX32      = $0100;
  pidWinIoT32     = $0200; // Embedded IoT (Internet of Things) Windows w/ Intel Galileo
  pidiOSDevice64  = $0400;
  pidWinARM       = $0800;
  pidOSX64        = $1000;
  pidOSXNX64      = pidOSX64 deprecated 'Use pidOSX64';
  pidLinux32Arm   = $2000;
  pidLinux64Arm   = $4000;
  pidAndroid64    = $8000;

here 有一个答案,如果您想包含每个平台,这可能会有所帮助,您可以将 0 传递给属性的构造函数,例如 [ComponentPlatformsAttribute(0)]。好像行得通但我不会用,我更喜欢一一声明平台,即使它可能很乏味!

【讨论】:

    猜你喜欢
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2013-12-08
    • 2015-03-08
    • 2019-06-10
    相关资源
    最近更新 更多