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 

Desactivar items en un ComboBox

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Desactivar items en un ComboBox Responder citando

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....
Rolling Eyes
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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. Very Happy
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

En su día tuve un problema similar con un RadioGroup, y Leo me dio la solución. A lo mejor la puedes adaptar; está en Desactivar elementos de un RadioGroup
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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í ... Laughing
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Uy, quería decir 4 variables int y no 4 variables AnsiString... si es que no puede ser conmigo ... Embarassed
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
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.