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.293
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 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
  #8  
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 20:14:05.


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