Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Detección de una unidad removible (https://www.clubdelphi.com/foros/showthread.php?t=31486)

Pascalizado 09-05-2006 18:10:15

Detección de una unidad removible
 
Estoy tratando de programar un programita que detecte cuando una unidad removible , como por ejemplo un reproductor de mp3, se conecta y actualize determinados archivos segun los atributos del mismo y lo que quiero saber es como es el procedimiento para que detectecte la unidad removible.
muchas gracias.

Neftali [Germán.Estévez] 09-05-2006 18:19:48

Si sólo quieres saber el tipo de una Unidad, puedes utilizar éste código; Si necesitas más información puedes utilizar el componente TDiskInfo que puedes encontrar en mi página.

seoane 09-05-2006 18:44:35

Puedes interceptar el mensage WM_DEVICECHANGE que se produce cuando se inserta un disco. Entonces comprobamos que unidades son "removibles" y hacemos lo que queramos, en tu caso actualizar los archivos.

Algo como esto:
Código Delphi [-]
type
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure WMDEVICECHANGE(var Msg: TMessage); message WM_DEVICECHANGE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  DBT_DEVICEARRIVAL = $8000;

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
      // Aqui usamos la letra para lo que queramos
      ShowMessage('Este es un disco removible '+Letra+':\');
    end;
  end;
  inherited;
end;

seoane 09-05-2006 19:08:10

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 :)

roman 09-05-2006 19:33:27

En mi página, en la sección de componentes, está TCDChange, que sirve para detectar la inserción o extracción de un CD. Básicamente maneja el mensaje WM_DEVICECHANGE que menciona seoane. Me parece que una muy sencilla modificación te serviría para detectar cuando se inserte o extraiga la unidad.

Supongo que puede combinarse con el código de seoane par detectar si tal unidad es removible, aunque me queda la duda de si es realmente necesario: si estoy insertando una unidad, ¿no se supone entonces que será removible?

// Saludos

seoane 09-05-2006 20:30:43

Lo de comprobar si es "removible" es para diferenciar si lo que se inserto es un CD o un mp3. Pero estuve echandole un vistazo a tu componente, y aunque tarde un rato en comprender como una misma estrcutura podia ser un DevBroadcastHeader y un DevBroadcastVolume :o , he de reconocer que tu forma de hacerlo es mucho mas elegante.

PD: La palabra "removible" me hace doler los oidos, habiendo palabras como extraible en castellano no se porque nos empeñamos en utilizar esas traducciones tan malas

roman 09-05-2006 20:41:32

Cita:

Empezado por seoane
tarde un rato en comprender como una misma estrcutura podia ser un DevBroadcastHeader y un DevBroadcastVolume

Ya ves que incluso el C más puro tiene herencia. :D

Cita:

Empezado por seoane
he de reconocer que tu forma de hacerlo es mucho mas elegante.

De hecho no es mi forma. Tal como ahí menciono, es básicamente una traducción a delphi de un ejemplo de Microsoft en C (¡Que los linuxeros me perdonen!! :eek:)

Cita:

Empezado por seoane
PD: La palabra "removible" me hace doler los oidos, habiendo palabras como extraible en castellano no se porque nos empeñamos en utilizar esas traducciones tan malas

Lamento mucho lo de tus oídos. De verdad pensé que existía la palabra. Ahora que sé que no es así, prometo no volver a usarla. :)

// Saludos

Casimiro Notevi 09-05-2006 22:41:25

Cita:

Empezado por roman
[ ... ] De hecho no es mi forma. Tal como ahí menciono, es básicamente una traducción a delphi de un ejemplo de Microsoft en C (¡Que los linuxeros me perdonen!! :eek:) [ ... ] // Saludos

Tendrás que rezar 2 padres nuestros y 1 ave maría... ... ... ¡¡¡me he pasado!!!, mejor lo dejas, creo que es una penitencia demasiado dura :p

roman 09-05-2006 22:52:55

Bill Gates que estás en los Redmonds,
Santificado sea tu monopolio.
Venga a nosostros tu Windows,
Hágase tu voluntad asi en Intel como en Motorola.
El DOS nuestro de cada día dánosle hoy...
Y perdónanos nuestros errores así como nosotros perdonamos tus bugs
y líbranos del Linux.

Bill Gates que estás en los Redmonds,
Santificado sea tu monopolio.
Venga a nosostros tu Windows,
Hágase tu voluntad asi en Intel como en Motorola.
El DOS nuestro de cada día dánosle hoy...
Y perdónanos nuestros errores así como nosotros perdonamos tus bugs
y líbranos del Linux.

Te debo el ave maría :rolleyes:

// Saludos

Casimiro Notevi 09-05-2006 23:35:32

Cita:

Empezado por roman
Bill Gates que estás en los Redmonds,
Santificado sea tu monopolio.
Venga a nosostros tu Windows,
Hágase tu voluntad asi en Intel como en Motorola.
El DOS nuestro de cada día dánosle hoy...
Y perdónanos nuestros errores así como nosotros perdonamos tus bugs
y líbranos del Linux.

Bill Gates que estás en los Redmonds,
Santificado sea tu monopolio.
Venga a nosostros tu Windows,
Hágase tu voluntad asi en Intel como en Motorola.
El DOS nuestro de cada día dánosle hoy...
Y perdónanos nuestros errores así como nosotros perdonamos tus bugs
y líbranos del Linux.

Te debo el ave maría :rolleyes:

// Saludos

JA...JA...JA...JA...JA...JA... :D :D :D

Lepe 10-05-2006 09:32:23

En españa al menos "removible" viene de remover (dar vueltas, agitar, mezclar varios líquidos), si se desea hacer lo mismo con un mp3.... nadie lo impide ;)

En ingles "remove" es quitar, creo que de ahí parte la "mala traducción".

Saludos

Pascalizado 11-05-2006 12:07:28

Gracias
 
Muchas gracias, por su ayuda!!!

Pascalizado 11-05-2006 13:42:07

Cita:

Empezado por roman
En mi página, en la sección de componentes, está TCDChange, que sirve para detectar la inserción o extracción de un CD. Básicamente maneja el mensaje WM_DEVICECHANGE que menciona seoane. Me parece que una muy sencilla modificación te serviría para detectar cuando se inserte o extraiga la unidad.

Supongo que puede combinarse con el código de seoane par detectar si tal unidad es removible, aunque me queda la duda de si es realmente necesario: si estoy insertando una unidad, ¿no se supone entonces que será removible?

// Saludos

Estuve tratando de descargar tu componenten, el UIapp y la descarga no esta disponible igualmente estuve mirando el codigo que mostras en el apunte

santiago14 22-05-2011 18:54:51

Cita:

Empezado por seoane (Mensaje 136075)
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.


La franja horaria es GMT +2. Ahora son las 14:34:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi