PDA

Ver la Versión Completa : Detección de una unidad removible


Pascalizado
09-05-2006, 18:10:15
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 (http://www.swissdelphicenter.ch/en/showcode.php?id=92); 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:

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.


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 (http://romansg.net), 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
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


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


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
[ ... ] 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
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
Muchas gracias, por su ayuda!!!

Pascalizado
11-05-2006, 13:42:07
En mi página (http://romansg.net), 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
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.


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.

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.