| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
nuno Cmdr

Registrado: 10 Feb 2003Mensajes: 143Ubicación: Córdoba - Argentina
|
Publicado: Dom 28 Dic, 2003 11:10 pm Asunto: como hacer para que se actualice un driveList????? |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 29 Dic, 2003 2:12 am Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 29 Dic, 2003 7:19 am Asunto: |
|
|
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.. _________________
 |
|
| Volver arriba |
|
 |
nuno Cmdr

Registrado: 10 Feb 2003Mensajes: 143Ubicación: Córdoba - Argentina
|
Publicado: Mar 06 Ene, 2004 3:55 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Sab 11 Jun, 2016 3:44 pm Asunto: Seleccionar la unidad USB insertada |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 12 Jun, 2016 12:36 am Asunto: Re: Seleccionar la unidad USB insertada |
|
|
| 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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Jue 16 Jun, 2016 3:38 pm Asunto: Para Leo |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 17 Jun, 2016 4:06 pm Asunto: Leo |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 17 Jun, 2016 4:21 pm Asunto: Re: Leo |
|
|
| 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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 17 Jun, 2016 4:51 pm Asunto: Leo |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 17 Jun, 2016 5:24 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 17 Jun, 2016 5:32 pm Asunto: Cuanta paciencia |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 17 Jun, 2016 8:06 pm Asunto: Leo todo correcto de este modo |
|
|
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 |
|
 |
|