Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   cambiar Chequed de Item determinado en CheckListBox (https://www.clubdelphi.com/foros/showthread.php?t=76884)

lmpadron 01-12-2011 23:11:06

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

ecfisa 01-12-2011 23:49:36

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.

lmpadron 02-12-2011 17:08:35

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

ecfisa 02-12-2011 19:55:29

Hola Impadron.

Realmente no había entendido bién lo que estabas buscando hacer, ahora creo que sí... :rolleyes:
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. :)


La franja horaria es GMT +2. Ahora son las 07:37:42.

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