Hallo erstmal
Ich bin dabei eine Komponente zu schreiben, die zwei Events beinhaltet, nämlich
OnUSBStickPluggedIn
und
OnUSBStickPluggedOut
Zuerst habe ich ein Testprogramm geschrieben welches sich der Methode bedient, die auch
hier im Forum zu finden ist. Das klappt auch wunderbar! Nur wenn ich das auf eine Komponente übertrage, dann wird nicht in die Prozedur reingesprungen. Woran kann das liegen? Gibts es da noch etwas das man beachten muss wenn man Windows Messages mit eigenen Kompos benutzt?
Hier mal der (abgespeckte) Code meiner Komponente:
Delphi-Quellcode:
//...
type
TUSBStickEvent = procedure(const ADrive: Char) of object;
TUSBHandler = class(TComponent)
private
//...
FOnPluggedIn: TUSBStickEvent;
FOnPluggedOut: TUSBStickEvent;
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
published
property OnPluggedIn: TUSBStickEvent read FOnPluggedIn write FOnPluggedIn;
property OnPluggedOut: TUSBStickEvent read FOnPluggedOut write FOnPluggedOut;
//...
end;
procedure Register;
implementation
{ TUSBHandler }
//...
constructor TUSBHandler.Create(AOwner: TComponent);
begin
inherited;
//...
end;
//...
procedure TUSBHandler.WMDeviceChange(var Msg: TMessage);
type
PDevBroadcastHdr = ^TDevBroadcastHdr;
TDevBroadcastHdr = packed record
dbcd_size,
dbcd_devicetype,
dbcd_reserved: DWORD;
end;
PDevBroadcastVolume = ^TDevBroadcastVolume;
TDevBroadcastVolume = packed record
dbcv_size,
dbcv_devicetype,
dbcv_reserved,
dbcv_unitmask: DWORD;
dbcv_flags: Word;
end;
var ChangedDrive: Char;
begin
//hier kommt er nie an!
case Msg.wParam of
$8000:
if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = $0002 then
begin
//Vorher Laufwerkbuchstaben ermitteln...
if Assigned(FOnPluggedIn)
then
OnPluggedIn(ChangedDrive);
end;
$8004:
if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = $0002 then
begin
//Vorher Laufwerkbuchstaben ermitteln...
if Assigned(FOnPluggedIn)
then
OnPluggedIn(ChangedDrive);
end;
end;
end;
procedure Register;
begin
RegisterComponents('USB Tools', [TUSBHandler]);
end;
end.
Vielleicht ist es ja nur ein blöder Denkfehler aber ich sitz jetzt seit Stunden da dran
Wenn jemand eine Idee hat, nur zu!
Vielen Dank,
Gruß Ritsch!