2017-10-10 86 views
3

我已经写了一些组件为IDE自定义组件,他们都看起来像这样:Delphi不能拖放

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我有这样的组件:

enter image description here

如果我改变的平台(比如机器人)我得到这个

enter image description here

我在做什么错?我进入了IDE> Tools> Options> Library,并且为每个平台添加了IDE可以在其中找到.pas的路径。任何想法?

奇怪的是,在FMX下,如果我想用我的组件创建一个Android应用程序,我必须将平台更改为win32,然后拖放组件,然后切换回Android。该组件在Android上的效果也非常好。

+0

Mybe你的意思是'TLang'组件 – Sami

+0

将数字类实现为非可视化组件仍然是一个巨大的错误。通过从'TObject'派生来解决所有的问题。 –

+2

您是否正在使用[Views](http://docwiki.embarcadero.com/RADStudio/en/Using_FireMonkey_Views)?你是否将组件拖放到主视图或Android视图上?此外,您应该使用['ComponentPlatforms'](http://docwiki.embarcadero.com/Libraries/en/System.Classes.ComponentPlatformsAttribute)属性标记组件,以便IDE知道组件实际支持哪个平台。 –

回答

5

你只需要包括System.Classes(你已经从我可以看到它),然后将USURE使用这个属性:

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

这样,你就可以将它从组件拖放即使您切换到Android,IDE也可以查看。基本上你的代码很好,它可以与VCL和FMX一起工作,但是通过这个属性,你可以告诉IDE该组件与你指定的平台兼容。

ComponentPlatformsAttribute为组件构建者提供了更具体的 控制暴露的组件。

要解决该问题,您应该:

  1. 打开你的组件的项目
  2. 右键单击项目经理组件>点击卸载
  3. 添加您的类定义
  4. 上面的属性
  5. 保存全部,编译,构建和安装。

你可以找到更多的参数传递给属性的构造函数中,我发现他们在System.Classes PAS文件:

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)]。它似乎有效,但我不会使用它,我宁愿一个接一个地宣布平台,即使它可能很乏味!