Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-12-2011
Avatar de lmpadron
lmpadron lmpadron is offline
Miembro
 
Registrado: feb 2009
Ubicación: Habana, Cuba
Posts: 204
Poder: 16
lmpadron Va por buen camino
cambiar Chequed de Item determinado en CheckListBox

Hola amigos

Recientemente tube una dificultad y la pregunté aquí pero como indica nuestra guía de estilo ... solo una pregunta por hilo ... les relaciono mi siguiente pregunta en este hilo !!!

En el hilo anterior me explicaron como obtener el valor del Item seleccionado en un CheckListBox ... gracias !!!

Esto me permite saber que selecciona el usuario y asi guardarlo en un DBEdit, bien ahora el problema es el siguiente, cuando el usuario no esta insertando datos en la BD, o sea, cuando esta moviendose en la base de datos (ADOQuery1AfterScroll) quisiera que se visualizara en el CheckListBox cuando los campos estan seleccionado. Como este componente no es de tipo DB entonces lo que se me ocurre es atrapar los valores que estan en la BD en algun otro componente o variable (en este caso para tratar de hacerlo use un Combobox)

Código:
ComboBox1->Items->Clear();
ComboBox1->Items->Delimiter = '-';
ComboBox1->Items->DelimitedText = ADOQuery1->FieldByName("norma")->Text;
de esta menera en los Item del Combobox tengo los valores que fueron seleccionados por el usuario y almacenados en la base de datos, ahora lo que quiero hacer es comprobar cuales son de los que estoy listando en el CheckListBox para después ponerlos en Chequed

Este es el código que uso, aqui hago un ciclo pasando por el CheckListBox y al pasar por cada uno de sus Items paso con otro ciclo por todos los Items del ComboBox y con una condición compruebo (o al menos trato jejeje de comprobar) si son iguales iguales, para en caso de serlo entonces chequearlo.

Por supuesto no funciona !!!

Código:
                for(int i = 0; i < CheckListBox1->Count; i++)
                {
                  for(int o = 0; o < ComboBox1->Items->Count; o++)
                  {
                    if (ComboBox1->Items[o].Text == CheckListBox1->Items->Strings[i])
                      CheckListBox1->Checked[i] == true;
                  }
                }
Sin embargo me da un error terrible

Código:
---------------------------
Debugger Exception Notification
---------------------------
Project VB.exe raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------
En particular esto sucede en la instrucción IF.

Mis preguntas en concreto son... como puedo hacer que los Items que tengo en el Combo se seleccionen en el CheckListBox y si puedo usar algún otro tipo de variable para no poner un combo

Gracias de antemano
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código.


Cuando miras fijamente al abismo, este te devuelve la mirada


oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_
oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_
oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_
oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_
oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_
ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_
________________________________________________________________________________

Última edición por lmpadron fecha: 01-12-2011 a las 23:17:11.
Responder Con Cita
  #2  
Antiguo 01-12-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Impadron.

Si no te entendí mál, podrías hacer:
Código:
...
{
TCheckListBox *CLB = static_cast<TCheckListBox*>(CheckListBox1);
TComboBox *CB = static_cast<TComboBox*>(ComboBox1);
int ix;

 for(int i = 0; i < CB->Items->Count; i++){
   ix = CLB->Items->IndexOf(CB->Items->Strings[i]);
   CLB->Checked[ix] = ix != -1;
 }
}
Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 02-12-2011
Avatar de lmpadron
lmpadron lmpadron is offline
Miembro
 
Registrado: feb 2009
Ubicación: Habana, Cuba
Posts: 204
Poder: 16
lmpadron Va por buen camino
Hola

la solución del amigo ecfisa dio este error

Código:
---------------------------
Debugger Exception Notification
---------------------------
Project VB.exe raised exception class EListError with message 'List index out of bounds (-1)'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------
el erro no debía estar en el código así que estaba en el momento en que se ejecutaba el código así que agregue un IF para que me comprobara si estaba activa la forma previendo que se ejecutara al momento de la creación de los componentes y ... solucionado !!!

El combo me carga el primer item en blanco al parecer el delimitador al ser pasado recoje el primer elemento y lo pasa en blanco (nulo) así que lo elimino con esta instrucción.
Código:
ComboBox1->Items->Delete(0);

les dejo el código de la forma en que quedo
Código:
if (Form5->Active == true)
        {
                int c;
                if (DBEdit1->Text != "")
                {

                        ComboBox1->Items->Clear();
                        ComboBox1->Items->Delimiter = '-';
                        ComboBox1->Items->DelimitedText = ADOQuery1->FieldByName("norma")->Text;
                        ComboBox1->Items->Delete(0);

                        TCheckListBox *CLB = static_cast<TCheckListBox*>(CheckListBox1);
                        TComboBox *CB = static_cast<TComboBox*>(ComboBox1);
                        int ix;

                        for(int i = 0; i < CB->Items->Count; i++)
                        {
                                ix = CLB->Items->IndexOf(CB->Items->Strings[i]);
                                CLB->Checked[ix] = ix != -1;
                        }
                }
        }
Gracias por la ayuda
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código.


Cuando miras fijamente al abismo, este te devuelve la mirada


oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_
oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_
oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_
oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_
oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_
ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_
________________________________________________________________________________
Responder Con Cita
  #4  
Antiguo 02-12-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Impadron.

Realmente no había entendido bién lo que estabas buscando hacer, ahora creo que sí...
A ver si estoy en lo cierto, a medida que te desplazas por la tabla los items del CheckListBox deben poner su propiedad Checked a true o false según existan o nó en el campo "norma".

De ser así se puede simplificar a una sola función:
Código:
void __fastcall TForm1::ADOQuery1AfterScroll(TDataSet *DataSet)
{
TStringList *TS= new TStringList;
  __try {
    TS->Delimiter = '-';
    TS->DelimitedText = ADOQuery1->FieldByName("norma")->Text;
    for(int i = 0; i < CheckListBox1->Count; i++){
      CheckListBox1->Checked[i] = TS->IndexOf(CheckListBox1->Items->Strings[i]) != -1;
    }
  }
  __finally {
    delete(TS);
  }
}
Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 03-12-2011 a las 17:49:48. Razón: corregir identación
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
saber Item seleccionado en CheckListBox lmpadron C++ Builder 10 01-12-2011 16:11:31
Acción al hacer clic un determinado item de un TTreeview namtaxonlabs OOP 6 29-08-2010 10:31:54
Ocultar item en CheckListBox dgcn OOP 4 26-07-2008 00:07:15
Cambiar la fuente a un solo Item de un TreeView! fide API de Windows 2 03-02-2008 09:00:40
Cambiar el color al Scroll de un CheckListBox lu9eui Varios 2 23-07-2007 01:06:19


La franja horaria es GMT +2. Ahora son las 23:08:15.


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