ListBox1.Items.Add(GetDriveName(Letra + ':\'));
Pues este lo utilizo para que me muestre la unidad + su LABEL (con la manera que usted me sugirió)
Escrito 19 febrero 2012 - 06:41
ListBox1.Items.Add(GetDriveName(Letra + ':\'));
Escrito 19 febrero 2012 - 07:24
Esto no lo entiendo. El código, tal como está detecta la inserción y desinserción de un disco USB, además no da la letra de unidad sino el nombre que le asigna Windows además de la letra. GetDriveName devuelve el nombre que le da Windows a una unidad mas su letra.Funciona todo muy bien..... solo que sigue sin actualizarse el label cuando le cambio de nombre
a la unidad X:\
Escrito 21 febrero 2012 - 12:51
Escrito 21 febrero 2012 - 04:53
monchito_elroro no incomodas, tranquilo. El problema está en que si to te explicas de forma clara no se entiende la duda y es imposible responder adecuadamente.
Bien ahora entiendo que lo que haces es cambiar la etiqueta de volumen a tu unidad y que ese cambio no se actualiza.
Con el sistema que has elegido para detectar la inserción de unidad, el cambio en su etiqueta de volumen desde el explorador no va ha ser comunicado por el mensaje WM_DEVICECHANGE y por lo tanto no lo puedes manejar.
Con el sistema que te propuse en un principio para monitorizar el Shell, si puedes detectarlo, simplemente como un cambio de nombre de carpeta SHCNE_RENAMEFOLDER. Ahora depende de tu necesidad de detectar el cambio de etiqueta de volumen para cambiar toda tu implementación a monitor de shell, monitorizar sólo cambios de nombre o no hacer nada mas.
Una solución de compromiso, para no cambiar todo el código es registrar sólo el mensaje SHCNE_RENAMEFOLDER, pero personalmente me parece un poco chapuza.
No he experimentado con Lazarus para monitorizar el Shell. Muy posiblemente esos mensajes no los reciba Lazarus y se tengan que trampear con un subclassing, pero como eso ya lo tienes implementado, no es difícil.
Saludos.
Escrito 21 febrero 2012 - 08:18
Label1.Caption:= GetDriveName('C:\');
Label1.Caption:= ('C:\')+GetDriveName;
Escrito 22 febrero 2012 - 06:37
function ReveseDrive(S: String): String; begin Result:= Copy(S, pos('(', S), length(S))+ ' ' + Copy(S, 0, pos('(', S)-1); end;
Escrito 22 febrero 2012 - 12:48
Escrito 22 febrero 2012 - 12:52
Gracias escafandra por la ayuda.... creo que este serà el final del post..... cualquier otra consulta les estarè comunicando....... gracias amigos...
![]()
Escrito 22 febrero 2012 - 06:17
Escrito 23 febrero 2012 - 01:19
Si cambias el nombre, no esperes que se actualice hasta que no provoques la llamada a CrearLista.
Escrito 24 agosto 2012 - 01:55
/ Component to detect when usb devices are connected or disconnected // using RegisterDeviceNotification 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. ejemplo: procedure TForm1.USB_In(Sender: TObject); begin label1.Caption:='USB Inserted'; end; procedure TForm1.USB_Out(Sender: TObject); begin label1.Caption:='USB Removed'; end; procedure TForm1.FormCreate(Sender: TObject); begin usb:=TComponentUSB.Create(self); usb.OnUSBArrival := USB_In; usb.OnUSBRemove := USB_Out; end; procedure TForm1.FormDestroy(Sender: TObject); begin USB.Free; end;
Escrito 24 agosto 2012 - 02:24
Escrito 24 agosto 2012 - 02:44
Para los que preguntaban lo del USB aqui les dejo un codigo que encontre que se evitan el timer o el ciclo...
Escrito 25 agosto 2012 - 06:34