Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-05-2006
Avatar de Pascalizado
Pascalizado Pascalizado is offline
Miembro
 
Registrado: abr 2006
Ubicación: Buenos Aires, Argentina
Posts: 163
Poder: 19
Pascalizado Va por buen camino
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.
__________________
Pascalizado
-----------------------------
"Ser una pluma y por el viento dejarse llevar hasta donde nunca nadie pudo llegar..."
Responder Con Cita
  #2  
Antiguo 09-05-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 09-05-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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;
Responder Con Cita
  #4  
Antiguo 09-05-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 09-05-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #6  
Antiguo 09-05-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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 , 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
Responder Con Cita
  #7  
Antiguo 09-05-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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.

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

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
Responder Con Cita
  #8  
Antiguo 09-05-2006
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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!! ) [ ... ] // 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
Responder Con Cita
  #9  
Antiguo 09-05-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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

// Saludos
Responder Con Cita
  #10  
Antiguo 09-05-2006
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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

// Saludos
JA...JA...JA...JA...JA...JA...
Responder Con Cita
  #11  
Antiguo 10-05-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #12  
Antiguo 11-05-2006
Avatar de Pascalizado
Pascalizado Pascalizado is offline
Miembro
 
Registrado: abr 2006
Ubicación: Buenos Aires, Argentina
Posts: 163
Poder: 19
Pascalizado Va por buen camino
Gracias

Muchas gracias, por su ayuda!!!
__________________
Pascalizado
-----------------------------
"Ser una pluma y por el viento dejarse llevar hasta donde nunca nadie pudo llegar..."
Responder Con Cita
  #13  
Antiguo 11-05-2006
Avatar de Pascalizado
Pascalizado Pascalizado is offline
Miembro
 
Registrado: abr 2006
Ubicación: Buenos Aires, Argentina
Posts: 163
Poder: 19
Pascalizado Va por buen camino
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
__________________
Pascalizado
-----------------------------
"Ser una pluma y por el viento dejarse llevar hasta donde nunca nadie pudo llegar..."

Última edición por Pascalizado fecha: 11-05-2006 a las 13:46:18.
Responder Con Cita
  #14  
Antiguo 22-05-2011
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 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
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Detectar la Unidad de CD Tonio Varios 13 04-03-2013 22:49:01
unidad A joHn je@N API de Windows 4 25-06-2005 02:31:09
Compilar una Unidad Esau Varios 3 12-09-2004 19:48:03
Detección de navegador WEB aerosB4 Internet 5 08-03-2004 17:27:10
Detección de Carga de un programa craven Varios 3 24-11-2003 16:10:46


La franja horaria es GMT +2. Ahora son las 08:35:51.


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
Copyright 1996-2007 Club Delphi