 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
shackletta Lt JG

Registrado: 01 Dic 2004Mensajes: 68
|
Publicado: Vie 03 Dic, 2004 11:45 am Asunto: Desactivar items en un ComboBox |
|
|
Hola a todos, es la primera vez que escribo un mensaje, pero llevo mucho tiempo leyendo las consultas del foro, y la verdad que me han ayudado muchísimo en el desarrollo de mi proyecto. Pero ahora tengo una duda que me lleva de cabeza durante unos días, veréis, en mi programa creo una ADOConnection a una BD Access (requisito de usuario), en esta BD puede haber varias tablas, pero siempre hay 4 que están. En una de las opciones del programa se me permite modificar algunas tablas de la BD (concretamente esas 4 fijas no se pueden tocar). Muestro los nombres de las tablas en un ComboBox, y lo que quiero es que esas 4 tablas fijas no aparezcan o aparezcan como inaccesibles. Lo que se me había ocurrido es lo siguiente:
void __fastcall TFormModConv::FormCreate(TObject *Sender)
{
TStrings *LI = new TStringList; // Lista con los nombres de todas las tablas
TStrings *LF = new TStringList; // Lista con los nombres de las tablas a mostrar
int i=-1; // Contador para el bucle for que recorre LI
int j=-1; // Indice para LF
AnsiString NombreTabla; // Para hacer comprobaciones en el if
// Cojo los nombres de las tablas de la BD, y los guardo en las
// 2 listas de Strings
DataModule1->ConexionBDlocal->GetTableNames(LI, false);
DataModule1->ConexionBDlocal->GetTableNames(LF, false);
// Elimino de la lista los items de las tablas que no me interesan para
// este caso. Voy recorriendo la lista de items y comparando en cada caso
// si se corresponde con el nombre de alguna de las tablas que no se
// deben mostrar.
for (i=0; i < LI->Count; i++)
{
NombreTabla = LI->Strings[i];
if (NombreTabla == "Titulaciones" || "Tipos de Convalidacion" || "Planes de Estudio" || "Alumnos")
{
// Si es alguna de las tablas prohibidas, busco que índice le corresponde
// en LF y elimino el item de la lista
j = -1;
j = LF->IndexOf(NombreTabla);
if (j != -1)
LF->Delete(j);
}
};
// Cargo la LF como la lista de items del DBComboBox1
ComboBox1->Items = LF;
}
Después, cuando se destruye el formulario (lo creo dinámicamente), libero la memoria empleada por LF y LI. El problema radica en que no pasa de i = 3, a veces no me muestra nada, y a veces sólo quita las 2 primeras tablas. He probado poniendo las condiciones anidadas e incluso haciéndolo al revés, o sea inicialmente LF vacía y si NombreTabla no es una tabla "prohibida" pues la añado a LF con LF->Append(NombreTabla), pero tampoco me funciona, alguien podría descifrar cuál es el error??, o hay alguna otra manera de desactivar los items del combobox?
Muchas gracias a todos....
 |
|
| Volver arriba |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Vie 03 Dic, 2004 9:06 pm Asunto: |
|
|
Hola, no se porque te pasa eso, pero podrias hacerlo de modo inverso que seria mas facil:
Tu haces:
Tus dos listas estan con los nombres de las tablas y de una de ellas vas eliminando las que no te interesan.
Podrias hacer:
Una lista con los nombres de las tablas.
La otra lista vacia.
Recorres la lista con las tablas y si no es una de esas 4 tablas, pues la añades a la otra lista. |
|
| Volver arriba |
|
 |
shackletta Lt JG

Registrado: 01 Dic 2004Mensajes: 68
|
Publicado: Sab 04 Dic, 2004 11:57 am Asunto: |
|
|
Ya probé a hacer eso también, volveré a hacer de nuevo la función, y probaré añadiendo los items con Add(), porque con Append() tampoco funcionaba bien.
Yo tampoco entiendo porque el for no pasa de i=3 porque el número de Strings de la lista es 5... A lo mejor podría probar con un while o un do-while, ahora vuelvo y os cuento.
Graciassss |
|
| Volver arriba |
|
 |
shackletta Lt JG

Registrado: 01 Dic 2004Mensajes: 68
|
Publicado: Sab 04 Dic, 2004 12:50 pm Asunto: |
|
|
Vale, ya he encontrado otra manera de hacerlo, y esta si que parece que funciona, aunque no me gusta mucho como está, intentaré mejorarla, he utilizado la función AnsiCompare, que me devuelve 0 si son iguales los 2 AnsiStrings:
void __fastcall TFormModConv::FormCreate(TObject *Sender)
{
TStrings *LI = new TStringList; // Lista con los nombres de todas las tablas
TStrings *LF = new TStringList; // Lista con los nombres de las tablas a mostrar
int i=-1; // Contador para el bucle for que recorre LI
AnsiString NombreTabla; // Para hacer comprobaciones en el if
// Cojo los nombres de las tablas de la BD, y los guardo en una
// lista de Strings, llamada LI.
DataModule1->ConexionBDlocal->GetTableNames(LI, false);
// Voy recorriendo la lista de items y comparando en cada caso
// si se corresponde con el nombre de alguna de las tablas que no se
// deben mostrar.
for (i=0; i < LI->Count; i++)
{
NombreTabla = LI->Strings[i];
int igualPlanes = NombreTabla.AnsiCompare("Planes");
int igualTit = NombreTabla.AnsiCompare("Titulaciones");
int igualAlu = NombreTabla.AnsiCompare("Alumnos");
int igualTipos = NombreTabla.AnsiCompare("Tipos");
// Si no es ninguna de estas tablas, la añadiré a LF, que será la que
// luego cargaré como items del ComboBox
if ((igualPlanes != 0) && (igualTit != 0) && (igualAlu != 0) && (igualTipos != 0))
LF->Add(NombreTabla);
};
// Cargo la LF como la lista de items del DBComboBox1
ComboBox1->Items = LF;
}
Si a alguien se le ocurre algo mejor que me lo comunique, porque yo creo que voy a pasar ya a otra parte de mi programa.
Un beso y gracias.  |
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Sab 04 Dic, 2004 11:54 pm Asunto: |
|
|
Se me ocurre algo (no se si es lo que necesitas), dle de alta a todas y luego elimnia las que no quieras con Delete _________________ Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc
http://www.touchsoftwares.com |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Jue 09 Dic, 2004 8:26 am Asunto: |
|
|
Hola.
Prueba a cambiar esto:
| Cita: | for (i=0; i < LI->Count; i++)
{
NombreTabla = LI->Strings[i];
if (NombreTabla == "Titulaciones" || "Tipos de Convalidacion" || "Planes de Estudio" || "Alumnos")
{
// Si es alguna de las tablas prohibidas, busco que índice le corresponde
// en LF y elimino el item de la lista
j = -1;
j = LF->IndexOf(NombreTabla);
if (j != -1)
LF->Delete(j);
}
}; |
Por esto: | Código: | for (i=0;i<LI->Count;i++){
NombreTabla=LI->Strings[i];
if(NombreTabla=="Titulaciones"||
NombreTabla=="Tipos de Convalidacion"||
NombreTabla=="Planes de Estudio"||
NombreTabla == "Alumnos"){
// Si es alguna de las tablas prohibidas, busco que índice le corresponde
// en LF y elimino el item de la lista
j=-1;
j=LF->IndexOf(NombreTabla);
if(j!=-1)
LF->Delete(j);
}
}; |
Un saludo _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
shackletta Lt JG

Registrado: 01 Dic 2004Mensajes: 68
|
Publicado: Jue 09 Dic, 2004 12:11 pm Asunto: |
|
|
Ya había probado a hacerlo así, de hecho la manera de evaluar la condición del bucle if que puse en el primer mensaje derivaba de la manera en Ceruleo me lo propone, pero creo que el problema no viene de ahí, sino de la comparación, no debe gustarle mucho comparar nombres de unas tablas de Access con el operador ==, al utilizar el AnsiCompare me funciona perfectamente le ponga lo que le ponga, lo que ocurre es que tengo que utilizar 4 variables AnsiString extra, pero tampoco es demasiado importante porque son locales y se destruirán cuando se cierre el formulario.
Un beso y muchas gracias por vuestro interés y vuestras respuestas. Voy a seguir con mi proyecto, aunque permaneceré por aquí ...  |
|
| Volver arriba |
|
 |
shackletta Lt JG

Registrado: 01 Dic 2004Mensajes: 68
|
Publicado: Jue 09 Dic, 2004 12:12 pm Asunto: |
|
|
Uy, quería decir 4 variables int y no 4 variables AnsiString... si es que no puede ser conmigo ...  |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|