Ver Mensaje Individual
  #14  
Antiguo 22-05-2011
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Reputación: 21
santiago14 Va por buen camino
Smile

Cita:
Empezado por seoane Ver Mensaje
Al codigo anterior todavia le podemos dar otra vuelta de tuerca, si tenemos una lista de las unidades que hay en cada momento sera muy sencillo saber cual es la que se acaba de insertar.

Código Delphi [-]
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    Lista: set of Char;
    procedure CrearLista;
    procedure WMDEVICECHANGE(var Msg: TMessage); message WM_DEVICECHANGE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  DBT_DEVICEARRIVAL = $8000;

procedure TForm1.CrearLista;
var
  Letra: Char;
begin
  Lista:= [];
  for Letra:= 'C' to 'Z' do
    if GetDriveType(Pchar(Letra+':\')) = DRIVE_REMOVABLE  then
      Lista:= Lista + [Letra];
end;

procedure TForm1.WMDEVICECHANGE(var Msg: TMessage);
var
  Letra: Char;
begin
  if Msg.WParam = DBT_DEVICEARRIVAL  then
  begin
    for Letra:= 'C' to 'Z' do
      if GetDriveType(Pchar(Letra+':\')) = DRIVE_REMOVABLE  then
      begin
        if not (Letra in Lista) then
        begin
          ShowMessage('Este es un disco removible '+Letra+':\');
        end;
      end;
  end;
  CrearLista;
  inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CrearLista;
end;

Perdon por poner dos respuestas, pero se me van ocurrinedo ideas sobre la marcha
Varios años después le podemos dar una vuelta mas a la tuerca, en realidad una pequeña corrección.
Así como estaba el evento TForm1.WMDEVICECHANGE, no mostraba nada cuando se insertaba un disp. USB, con este pequeñísimo arreglito va mejor.
Pongo en rojo las modificaciones.
Ah, para que fuera mas gráfico, le puse un listbox donde aparecen y desaparecen las unidades USB.
Código Delphi [-]
type
  TForm1 = class(TForm)
    lst1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    Lista: set of Char;
    procedure CrearLista;
    procedure WMDEVICECHANGE(var Msg: TMessage); message WM_DEVICECHANGE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  DBT_DEVICEARRIVAL = $8000;
  DBT_DEVICEREMOVAL = $8004;     // El dispositivo sale

procedure TForm1.CrearLista;
var
  Letra: Char;
begin
  Lista:= [];
  lst1.Clear;
  for Letra:= 'C' to 'Z' do
  begin
    if GetDriveType(Pchar(Letra+':\')) = DRIVE_REMOVABLE  then
    begin
      Lista:= Lista + [Letra];
      lst1.Items.Add(Letra + ':\');
    end;
  end;
end;

procedure TForm1.WMDEVICECHANGE(var Msg: TMessage);
var
  Letra: Char;
begin
  if Msg.WParam = DBT_DEVICEARRIVAL  then
  begin
    for Letra:= 'C' to 'Z' do
    begin
      if GetDriveType(Pchar(Letra + ':\')) = DRIVE_REMOVABLE  then
      begin
        if not (Letra in Lista) then
        begin
          ShowMessage('Este es un disco removible ' + Letra + ':\');
        end;
      end;
    end;
    CrearLista;
  end;
  if Msg.WParam = DBT_DEVICEREMOVAL then
  begin
    CrearLista;
  end;
  //CrearLista;
  inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CrearLista;
end;

end.
Gracias. Este código, junto con otros que encontré me sirvieron de mucho.

Saludos.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.

Última edición por santiago14 fecha: 22-05-2011 a las 19:00:12.
Responder Con Cita