2017-10-10 50 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)]。它似乎有效,但我不會使用它,我寧願一個接一個地宣佈平臺,即使它可能很乏味!