2017-07-22 73 views
-1

我的問題是如何在項目中使用像下面這樣的單元組件。 我安裝了以下組件,但我不能再使用它了。 我做的所有事情是:1-創建一個包2-添加單元到包3-右鍵單擊包名稱在其選項板中選擇構建,然後在下一步中安裝4-下一步我去組件菜單,我選擇安裝組件,然後在下一頁中選擇單元和存在的軟件包,我添加軟件包名稱並單擊完成。 聽起來,所有的東西都很好,但我無法調用它,安裝後它不會出現在工具托盤中。安裝單一類型的組件

基本上我總是有問題,安裝和使用的部件是這樣的...

unit U_Usb; 

interface 

uses 
Windows, Messages, SysUtils, Classes, Forms; 

type 

PDevBroadcastHdr = ^DEV_BROADCAST_HDR; 
DEV_BROADCAST_HDR = packed record 
dbch_size: DWORD; 
dbch_devicetype: DWORD; 
dbch_reserved: DWORD; 
end; 

PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE; 
DEV_BROADCAST_DEVICEINTERFACE = record 
dbcc_size: DWORD; 
dbcc_devicetype: DWORD; 
dbcc_reserved: DWORD; 
    dbcc_classguid: TGUID; 
    dbcc_name: short; 
end; 

const 
    GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}'; 
    DBT_DEVICEARRIVAL = $8000; // system detected a new device 
    DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone 
    DBT_DEVTYP_DEVICEINTERFACE = $00000005; // device interface class 

type 

TComponentUSB = class(TComponent) 
    private 
    FWindowHandle: HWND; 
    FOnUSBArrival: TNotifyEvent; 
    FOnUSBRemove: TNotifyEvent; 
    procedure WndProc(var Msg: TMessage); 
    function USBRegister: Boolean; 
    protected 
    procedure WMDeviceChange(var Msg: TMessage); dynamic; 
    public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    published 
    property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival; 
    property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove; 
    end; 

    implementation 

constructor TComponentUSB.Create(AOwner: TComponent); 
    begin 
    inherited Create(AOwner); 
    FWindowHandle := AllocateHWnd(WndProc); 
    USBRegister; 
    end; 

    destructor TComponentUSB.Destroy; 
    begin 
    DeallocateHWnd(FWindowHandle); 
    inherited Destroy; 
    end; 

procedure TComponentUSB.WndProc(var Msg: TMessage); 
    begin 
    if (Msg.Msg = WM_DEVICECHANGE) then 
     begin 
     try 
     WMDeviceChange(Msg); 
    except 
    Application.HandleException(Self); 
    end; 
    end 
    else 
    Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam); 
    end; 

    procedure TComponentUSB.WMDeviceChange(var Msg: TMessage); 
    var 
    devType: Integer; 
    Datos: PDevBroadcastHdr; 
    begin 
    if (Msg.wParam = DBT_DEVICEARRIVAL) or (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then 
    begin 
    Datos := PDevBroadcastHdr(Msg.lParam); 
    devType := Datos^.dbch_devicetype; 
    if devType = DBT_DEVTYP_DEVICEINTERFACE then 
    begin // USB Device 
    if Msg.wParam = DBT_DEVICEARRIVAL then 
    begin 
     if Assigned(FOnUSBArrival) then 
     FOnUSBArrival(Self); 
     end 
     else 
     begin 
    if Assigned(FOnUSBRemove) then 
     FOnUSBRemove(Self); 
    end; 
    end; 
    end; 
    end; 

    function TComponentUSB.USBRegister: Boolean; 
    var 
     dbi: DEV_BROADCAST_DEVICEINTERFACE; 
     Size: Integer; 
    r: Pointer; 
     begin 
    Result := False; 
    Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE); 
     ZeroMemory(@dbi, Size); 
     dbi.dbcc_size := Size; 
     dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE; 
    dbi.dbcc_reserved := 0; 
    dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE; 
    dbi.dbcc_name := 0; 

    r := RegisterDeviceNotification(FWindowHandle, @dbi, 
     DEVICE_NOTIFY_WINDOW_HANDLE 
    ); 
     if Assigned(r) then Result := True; 
    end; 

    end. 
+0

我沒有在任何地方看到你的'Register'程序。這是發佈組件的要求。 FWIW,安裝組件與單元級別無關。您可以在一個單元中安裝10個組件。但是你需要一個'Register'程序來調用'RegisterComponents'來實際告訴IDE你想要做什麼。否則,你所做的只是編譯代碼。 –

+0

我不熟悉你想要的東西。我必須添加哪些程序以及必須在哪裏指定它? –

+0

@ M.MARAMI:如果這是現有組件的代碼,我假設有第二個單元用於註冊組件。它應該有一個註冊程序。是這樣嗎?如果沒有,[這裏是如何編寫組件並註冊它](http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Component_Writer%27s_Guide_Index)。 –

回答

2

你擁有的單位不具有Register程序。這是能夠將組件安裝到IDE中的要求。

當您安裝軟件包時,在軟件包「安裝」時,接口中找到Register過程的任何單元將調用此過程Register。在那裏,然後你打電話RegisterComponents實際將組件安裝到IDE中。

它應該是這個樣子:

... 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('My Components', [TComponentUSB]); 
end; 

... 

請記住,Register過程並不一定需要在同一單元。具有許多組件的包裝的正常設計是在設計時間包裝中僅有一個單元,其具有唯一的Register程序。其餘的具有實際組件的單元可能會成爲設計時所需的獨立運行時包的一部分。

此外,您可以在一個單元中安裝多個組件。只有在您撥打RegisterComponents的人員纔會安裝到您的IDE中。

不要忘了還要在IDE的庫路徑中包含本機的位置。

+0

謝謝。當然,我會在今天閱讀文檔。 –

相關問題