Консультация № 55405
14.09.2006, 10:54
0.00 руб.
0 3 1
Добрый день, уважаемые!
Вопрос у меня такой:
Есть ComboBox со списком дисков (A:\, C:\ и т.д.).
Список дисков формирую с помощью компонента TDiskInfo.

DiskInfo.GetDriveList(DriveBox.Items);.

Подскажите, пожалуйста, Как при подключении и отключении
флэшки обновлять список дисков?

Обсуждение

Неизвестный
14.09.2006, 12:02
общий
это ответ
Здравствуйте, Савенко Вадим Иванович!
Отлавливайте сообщение WM_DEVICECHANGE.


Приложение:
type TForm1 = class(TForm) Button1: TButton; label1: TLabel; private procedure WMDeviceChange(var Msg: TMessage); message WM_DeviceChange; { Private declarations } public { Public declarations } end;... const DBT_DeviceArrival = $8000; DBT_DeviceRemoveComplete = $8004; DBTF_Media = $0001; DBT_DevTyp_Volume = $0002; type PDevBroadcastHdr = ^TDevBroadcastHdr; TDevBroadcastHdr = packed record dbcd_size: DWORD; dbcd_devicetype: DWORD; dbcd_reserved: DWORD; end; type PDevBroadcastVolume = ^TDevBroadcastVolume; TDevBroadcastVolume = packed record dbcv_size: DWORD; dbcv_devicetype: DWORD; dbcv_reserved: DWORD; dbcv_unitmask: DWORD; dbcv_flags: Word; end;function GetDrive(pDBVol: PDevBroadcastVolume): string; var i: Byte; Maske: DWORD; begin if (pDBVol^.dbcv_flags and DBTF_Media) = DBTF_Media then begin Maske := pDBVol^.dbcv_unitmask; for i := 0 to 25 do begin if (Maske and 1) = 1 then Result := Char(i + Ord(‘A‘)) + ‘:‘; Maske := Maske shr 1; end; end; end; procedure TForm1.WMDeviceChange(var Msg: TMessage); var Drive: string; begin case Msg.wParam of DBT_DeviceArrival: if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then begin Drive := GetDrive(PDevBroadcastVolume(Msg.lParam)); label1.Caption := ‘Inserted in Drive ‘ + Drive; end; DBT_DeviceRemoveComplete: if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then begin Drive := GetDrive(PDevBroadcastVolume(Msg.lParam)); label1.Caption := ‘Removed from Drive ‘ + Drive; end; end; end;
Неизвестный
14.09.2006, 13:02
общий
to nOname:Неплохо, спасибо! А я со всякими USB-компонентами возился и не получилось ничего :(Кстати, Ваш код букву диска не определяет - пришлось немного подправить.function GetDrive(pDBVol: PDevBroadcastVolume): string; var i: Byte; Maske: DWORD; begin if (pDBVol^.dbcv_flags and DBTF_Media) <> DBTF_Media then begin Maske:= pDBVol^.dbcv_unitmask; for i:= 0 to 25 do begin if (Maske and 1) = 1 then Result:= Char(i + Ord(‘A‘)) + ‘:‘; Maske:= Maske shr 1; end; end; end;Вот так гораздо лучше. Спасибо!
Неизвестный
14.09.2006, 23:32
общий
if (pDBVol^.dbcv_flags and DBTF_Media) <> DBTF_Media thenлучше if (pDBVol^.dbcv_flags and DBTF_Media)=0 then
Форма ответа