Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

como hacer para que se actualice un driveList?????

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: como hacer para que se actualice un driveList????? Responder citando

mi problema es el siguiente: estoy haciendo un escaneador de discos y cuando el programa esta activo e introusco un cd el drivelist no se refresca por lo cual no me aparece el nombre del CD, como puedo hacer para que se refresque

desde ya muchas gracias
Atte. nuno
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Te refieres al TDriveComboBox ?? Si es así prueba poniendo lo siguiente en la parte privada de la clase del Form donde este el TDriveComboBox (DriveComboBox1):
Código:
private:   // User declarations

    MESSAGE void __fastcall WmDeviceChange(TMessage& msg)
    {
        class TDriveComboBoxX : public TDriveComboBox
        {
        public:
            void __fastcall Actualizar()
            {
                char unidad = Drive;
                BuildList();
                Drive = unidad;
            };
        };

        static_cast<TDriveComboBoxX*>(DriveComboBox1)->Actualizar();
    }
    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_DEVICECHANGE, TMessage, WmDeviceChange)
    END_MESSAGE_MAP(TForm)


Si te refieres a otro componente pon el nombre de la clase completo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Esto es mera chapuza, y por casualidad me salió, despues lo vi en otro lado, para delphi, y funciona, solo has lo siguiente.. de haber detectado la introduccion del cd

Código:

// para abrir el cuadro de dialogo, "conectar a una unidad de red"
    WNetConnectionDialog(Application->Handle,1);
    DriveComboBox1->TextCase= DriveComboBox1->TextCase;

yo lo utilizo cuando mi aplicacion habre el cuadro de Conectar a unidad de REd, para refrescar el contenido, del DriverCombo y ver que unidad ya esta en la lista... realizo la segunda linea de codigo.. esta esta en un boton que habre el cuadro de dialogo..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

muchas gracias a los 2 por responder
PD: Leo el codigo tuyo anda pero me tira un error cuando abro la lectora de CD me dice algo como que la cadena char es de 624 y se espraba una de 620
de todas maneras gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Seleccionar la unidad USB insertada Responder citando

Leo si añadimos esta Linea se selecciona en el DriveComboBox la unidad USB recién insertada y si no es o no esta preparada se secciona la unidad C.
Corrígeme si me equivoco:
Código:

private:   // User declarations

    MESSAGE void __fastcall WmDeviceChange(TMessage& msg)
    {
        class TDriveComboBoxX : public TDriveComboBox
        {
        public:
            void __fastcall Actualizar()
            {
                char unidad = Drive;
                BuildList();
                Drive = unidad;
            };
        };

        static_cast<TDriveComboBoxX>(DriveComboBox1)->Actualizar();
       //Linea añadida
       static_cast<TDriveComboBoxX>(DriveComboBox1)->ItemIndex = static_cast<TDriveComboBoxX>(DriveComboBox1)->Items->Count -1;
 


    }
    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_DEVICECHANGE, TMessage, WmDeviceChange)
    END_MESSAGE_MAP(TForm)


y luego en el evento Change:
Código:

   String sUnidad = Format("%s:\\", ARRAYOFCONST((DriveComboBox1->Drive)));
    TDriveComboBox *dcb = dynamic_cast<TDriveComboBox>(Sender);
    bool fRet = GetVolumeInformation(sUnidad.w_str(), NULL, 0, NULL, NULL, NULL, NULL, 0);
    if(!fRet)// En caso de error
    {
        // Muestra tu mensaje de error
        ShowMessage("Unidad de Disco o PenDrive no preparada.\n"
        "Se volverá a la unidad del Disco C",'!');
        DriveComboBox1->Drive = 'C';
    }

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Re: Seleccionar la unidad USB insertada Responder citando

JesúsGandia escribió:
Leo si añadimos esta Linea se selecciona en el DriveComboBox la unidad USB recién insertada y si no es o no esta preparada se secciona la unidad C.
Corrígeme si me equivoco:

Funcionaría siempre que la unidad que se introduzca sea la última letra, si ya existiese una unidad con una letra alfabéticamente por debajo no funcionaría.

Si lo que necesitas es que se seleccione en el combo la letra de la última unidad introducida podrías hacer algo así:
Código:

// Añadimos la cabecera:  #include <Dbt.h>
private:   // User declarations

    //!! Añadimos la cabecera:  #include <Dbt.h>

    MESSAGE void __fastcall WmDeviceChange(TMessage& msg)
    {
        class TDriveComboBoxX : public TDriveComboBox
        {
        public:
            void __fastcall Actualizar(char dev = 0)
            {
                char unidad = Drive;
                BuildList();
                Drive = dev ? dev : unidad;
                if (ItemIndex < 0)
                    ItemIndex = 0;
            };
        };

        if (msg.WParam == DBT_DEVICEARRIVAL)
        {
            PDEV_BROADCAST_HDR dbh = (PDEV_BROADCAST_HDR)msg.LParam;
            if (dbh->dbch_devicetype == DBT_DEVTYP_VOLUME)
            {
                PDEV_BROADCAST_VOLUME dbv = (PDEV_BROADCAST_VOLUME)dbh;
                char ud = FirstDriveFromMask(dbv->dbcv_unitmask);
                static_cast<TDriveComboBoxX*>(DriveComboBox1)->Actualizar(ud);
            }
        }
        else if (msg.WParam == DBT_DEVICEREMOVECOMPLETE)
            static_cast<TDriveComboBoxX*>(DriveComboBox1)->Actualizar();
    }
    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_DEVICECHANGE, TMessage, WmDeviceChange)
    END_MESSAGE_MAP(TForm)


En el código se hace uso de la siguiente función sacada del propio ejemplo de la ayuda del API de Windows:
Código:

char FirstDriveFromMask(ULONG unitmask)
{
   char i;
   for (i = 0; i < 26; ++i) {
      if (unitmask & 0x1) break;
      unitmask = unitmask >> 1;
   }
   return(i + 'A');
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Para Leo Responder citando

Gracias Leo, lo voy a probar.
Dije eso porque aunque tengas unidades asignadas pero sin DISCO, Windows casi siempre que introduces alguna UNIDAD USB le asigna una letra libre que suele ser la siguiente a la última utilizada.
En todo caso está mucho mejor lo que has escrito, ya que el usuario puede crear o cambiar LETRAS de UNIDAD y entonces la UNIDAD USB introducida ya no sería la última.

Muchas gracias por tu aportación, lo voy a probar y si funciona...
por supuesto que utilizaré tu recomendación.

GRACIAS, GRACIAS...
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Leo Responder citando

Leo esta función es Void y no acepta parametros:
Cita:

static_cast<TDriveComboBoxX>(DriveComboBox1)->Actualizar(ud);

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Re: Leo Responder citando

JesúsGandia escribió:
Leo esta función es Void y no acepta parametros:
Cita:

static_cast<TDriveComboBoxX>(DriveComboBox1)->Actualizar(ud);


En la ultima versión esta declarada como:

Código:
void __fastcall Actualizar(char dev = 0)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Leo Responder citando

No tengo la última versión, tengo la versión 2010.
Lo he solucionado así:
Código:

static_cast<TDriveComboBoxX>(DriveComboBox1)->Actualizar();
static_cast<TDriveComboBoxX>(DriveComboBox1)->Drive = ud;


Por ese orden y si quito alguna de las 2 líneas, ya no funciona.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

No, me refería a que en la última versión que publique más arriba lo había declarado así. Normalmente pruebo todo como mínimo en un par de versiones (nuevas y viejas).

Acabo de probarlo en la versión 2010 y funciona tal cual lo he publicado copiar y pegar. De todas maneras, si te daba problemas y con el cambio que has hecho se ha solucionado, perfecto.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Cuanta paciencia Responder citando

ya... ya
Madre mía... cuanta paciencia... y que burro soy...
Ya me di cuenta y estaba corrigiendolo...
Perdona
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Leo todo correcto de este modo Responder citando

En el formulario tengo 2 TDriveComboBox y 2 TDirectoryListBox:
DCBCopia y DCBRestaura
DirCopia y DirRestaura

Tengo la propiedad DirList de los TDriveComboBox asignada a sus respectivos TDirectoryListBox asociados, es decir:
DCBCopia->DirList = DirCopia;
DCBRestaura->DirList = DirRestaura;

Los eventos OnChange de los TDriveComboBox ya no son necesarios.

Cuando inicio el formulario les asigno a cada TDirectoryListBox su correspondiente Ruta con TDirectoryListBox->Directory y guardo 2 variables para guardar la UNIDAD y la RUTA. Utilizo la mismas variables para los 2 grupos ya que tienen los mismos valores de UNIDAD y RUTA en un principio.
Luego he implementado esto:
Código:
    //*************************************************************************
   //INICIO. Para que se actualice las unidades de disco en el TDriveComboBox.
    wchar_t Unidad_Ant;//Para guardar valor anterior de Unidad
    String Ruta_Ant;//Para guardar valor anterior a Ruta de Carpeta
    MESSAGE void __fastcall WmDeviceChange(TMessage& msg)
    {
       class TDriveComboBoxX : public TDriveComboBox
        {
           public:
         void __fastcall Actualizar(wchar_t dev = 0)
            {
                wchar_t unidad = Drive;
                BuildList();
                Drive = dev ? dev : unidad;
                if(ItemIndex < 0)
                    ItemIndex = 0;
            };
        };

      if(msg.WParam == DBT_DEVICEARRIVAL)
        {
            PDEV_BROADCAST_HDR dbh = (PDEV_BROADCAST_HDR)msg.LParam;
            if(dbh->dbch_devicetype == DBT_DEVTYP_VOLUME)
            {//Si conecto una Unidad USB, actualizo y me muestro su carpeta RAIZ
                PDEV_BROADCAST_VOLUME dbv = (PDEV_BROADCAST_VOLUME)dbh;
                wchar_t ud = FirstDriveFromMask(dbv->dbcv_unitmask);
                static_cast<TDriveComboBoxX*>(DCBCopia)->Actualizar(ud);
                static_cast<TDriveComboBoxX*>(DCBRestaura)->Actualizar(ud);
            }
        }
        else
           if(msg.WParam == DBT_DEVICEREMOVECOMPLETE)
            {//Si desconexto la Unidad USB, vuelvo a los valores anteriores
                DCBCopia->Drive = Unidad_Ant;
                DirCopia->Directory = Ruta_Ant;
                DCBRestaura->Drive = Unidad_Ant;
                DirRestaura->Directory = Ruta_Ant;
            }
    }

    //Comprobar la Unidad USB introducida
    wchar_t FirstDriveFromMask(ULONG unitmask)
    {
       wchar_t i;
       for (i = 0; i < 26; ++i) {
          if (unitmask & 0x1) break;
          unitmask = unitmask >> 1;
       }
       return(i + L'A');
    }

    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_DEVICECHANGE, TMessage, WmDeviceChange)
    END_MESSAGE_MAP(TForm)
    //Fin. Para que se actualice las unidades de disco en el TDriveComboBox
    //*********************************************************************


y con ello funciona perfecto tanto cuando inserto una Unidad USB, la cual me interesa que apunte a la CARPETA RAIZ, como cuando desconecto o extraigo la Unidad USB, que vuelvo a la configuración original.

Muchas gracias por tu ayuda.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.