Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   saber Item seleccionado en CheckListBox (https://www.clubdelphi.com/foros/showthread.php?t=76851)

lmpadron 30-11-2011 21:04:39

saber Item seleccionado en CheckListBox
 
Hola amigos

Tengo una aplicación que se conecta a MySQL, en uno de los campos el usuario pude seleccionar una o mas opciones por lo que uso un CheckListBox donde cargo en la propiedad Items los valores de mi base de datos.
Mi problema es el siguiente.
Necesito saber que Item el usuario seleccionó para agregarlo al DBEdit hasta el momento he tratado pero nada ha funcionado adjunto algo del código que he utilizado pero repito no funciona

Código:

for (int i = 0; i < CheckListBox1->Items->Count - 1; i++)
      {
          if (CheckListBox1->State[i]/*[CheckListBox1->ItemIndex]*/ == cbChecked)
          {
                DBEdit1->Text = DBEdit1->Text + "-" + CheckListBox1->ItemIndex ;
          }
          else
          {
                DBEdit1->Text = DBEdit1->Text + "-" + CheckListBox1->ItemIndex;
          }
      }

la idea es realizar un ciclo desde el primer item hasta el ultimo y se verifique cuales están seleccionado y los agregue al DBEdit, esto debe suceder cuando el usuario de un click en el componente para seleccionar una de las opciones.

CODE]void __fastcall TForm5::CheckListBox1Click(TObject *Sender)[/code]

Con ese codigo que acabo de postear obtengo el ItemIndex pero me lo repite tantas veces como Items halla.

Por el momento tengo puesto 8 Items

Gracias de antemano

olbeup 30-11-2011 21:14:15

El CheckListBox tiene el "Checked[n]" que te devuelve un Boolean si está o no Marcado, bueno esto no es C++, pero creo que lo podras traducir.
Código Delphi [-]
...
var
  nI: Integer;
begin
  for nI := 0 to (CheckListBox1.Items.Count -1) do
    if CheckListBox1.Checked[nI] then
      ShowMessage(CheckListBox1.Items.Strings[nI]);
end;
¿Esto es lo que estas buscando?

Un saludo

ecfisa 30-11-2011 22:31:07

Hola Impadron.

No me queda muy en claro lo que buscas hacer, según esto:
Cita:

Necesito saber que Item el usuario seleccionó para agregarlo al DBEdit
Podria ser:
Código:

void __fastcall TForm1::CheckListBox1Click(TObject *Sender)
{
 if(CheckListBox1->Checked[CheckListBox1->ItemIndex])
  DBEdit1->Text = DBEdit1->Text +
    CheckListBox1->Items->Strings[CheckListBox1->ItemIndex];
}

Pero según esto:
Cita:

realizar un ciclo desde el primer item hasta el ultimo y se verifique cuales están seleccionado y los agregue al DBEdit
Sería como te comentaron arriba:
Código:

  for(int i=0; i < CheckListBox1->Count; i++)
  if(CheckListBox1->Checked[i])
    DBEdit1->Text = DBEdit1->Text + CheckListBox1->Items->Strings[i];
  /* Limpiar la selección una vez agregados */
  for(int i=0; i < CheckListBox1->Count; i++)
    CheckListBox1->Checked[i] = false;


Saludos.

olbeup 30-11-2011 22:40:10

Código Delphi [-]
  for(int i=0; i < CheckListBox1->Count -1; i++)
   if(CheckListBox1->Checked[i])
     DBEdit1->Text = DBEdit1->Text + CheckListBox1->Items->Strings[i];
  /* Limpiar la selección una vez agregados */
  for(int i=0; i < CheckListBox1->Count -1; i++)
    CheckListBox1->Checked[i] = false;

ecfisa, le he añadido el -1 porque sino cuando esté en el último dará un error de fuera de rango.

Es alucinante C++, me encantaría aprender otro lenguaje aparte de Delphi, pero el tiempo, juega en contra, al final lo aprenderé.

Un saludo

ecfisa 30-11-2011 22:59:54

Hola.

Cita:

ecfisa, le he añadido el -1 porque sino cuando esté en el último dará un error de fuera de rango.
Así sería si estuviesemos tratando con un for de Pascal, pero en C/C++ el for tiene un comportamiento algo diferente:
Código:


 for(int i=0; i < CheckListBox1->Count; i++)

El valor de i nunca va a llegar a ser CheckListBox1->Count ya que el ciclo finaliza antes de que sea igual, en este caso lo hace exáctamente cuando i es igual a CheckListBox1->Count -1 (el incremento de i es de 1).

Si agregamos el -1:
Código:

  for(int i=0; i < CheckListBox1->Count - 1; i++)
Estaríamos recorriendo n -2 items del CheckListBox (quedaría el último sin evaluar).

Cita:

Es alucinante C++, me encantaría aprender otro lenguaje aparte de Delphi, pero el tiempo, juega en contra, al final lo aprenderé.
De acuerdo con vos :)

Saludos.

olbeup 01-12-2011 14:03:39

Perdona mi ignorancia en el lenguaje C++, pensaba que era lo mismo.

Un saludo.

ecfisa 01-12-2011 15:15:03

Hola.

Hombre... que no hay nada que perdonar

Espero que muy pronto te den los tiempos para empezar con él. ;)

Un saludo. :)

lmpadron 01-12-2011 15:44:02

Cita:

Empezado por ecfisa (Mensaje 420056)
Hola Impadron.

Cita:

No me queda muy en claro lo que buscas hacer (...)
Lo que busco hacer es lo siguiente, en el CheckListBox1 cargo los valores de una tabla y el usuario puede seleccionarlos todos uno o varios, una ves seleccionados los guardo en un campo de otra tabla para agregarlos como valores a un Combobox.

Cita:

Pero según esto:

Sería como te comentaron arriba:
Código:

  for(int i=0; i < CheckListBox1->Count; i++)
  if(CheckListBox1->Checked[i])
    DBEdit1->Text = DBEdit1->Text + CheckListBox1->Items->Strings[i];
  /* Limpiar la selección una vez agregados */
  for(int i=0; i < CheckListBox1->Count; i++)
    CheckListBox1->Checked[i] = false;


El código funciona perfecto (me da pena no haber llegado a esa solución por mi mismo ;)

pero con el segundo FOR la idea no era que limpiara el CheckListBox sino los valores que se guardaron en el DBEdit o sea que cada ves que se cambia el CheckListBox si se selecciona un valor pues este sea agregado (como hace el primer FOR) o que sea quitado del DBEDIT.

lmpadron 01-12-2011 16:00:31

O sea concretamente seria como determinar si el item esta Checked o no para saber si agregamos ese campo o lo quitamos de los que ya están y la forma de quitarlo (q eso no me queda muy claro).

Cita:

Empezado por olbeup (Mensaje 420037)
Es alucinante C++

Cita:

Empezado por ecfisa (Mensaje 420142)
De acuerdo con vos :)

De paso Gracias a ambos por ayudarme y obviamente coincido jajajajaja, espero yo también poder aprender en elgún momento algo de c++ !!! ;)

ecfisa 01-12-2011 16:02:34

Hola Impadrón.

Cita:

pero con el segundo FOR la idea no era que limpiara el CheckListBox sino los valores que se guardaron en el DBEdit
Entonces creo que bastaría con:
Código:

for(int i=0; i < CheckListBox1->Count; i++)
  if(CheckListBox1->Checked[i])
    DBEdit1->Text = DBEdit1->Text + CheckListBox1->Items->Strings[i];
  /*
  Operaciones necesarias con DBEdit1
  ...
  */
  DBEdit1->Text = "";

Saludos.

lmpadron 01-12-2011 16:11:31

Cita:

Empezado por ecfisa (Mensaje 420154)
Hola Impadrón.

Entonces creo que bastaría con:
Código:

(...)
  DBEdit1->Text = "";


Pues si, tenias razón (como siempre !!! jajaja) solo con una pequeña modificación y funciona perfecto

Código:

      DBEdit1->Text = "";
      for(int i=0; i < CheckListBox1->Count; i++)
      {
      if(CheckListBox1->Checked[i])
      {
        DBEdit1->Text = DBEdit1->Text + "-" + CheckListBox1->Items->Strings[i];
      }
      }

De esta forma limpio el DBEdit primeramente luego recorro con el ciclo cada item del CheckListBox y si esta seleccionado es agregado al DBEdit. De esta forma si al dar click se deselecciona un Item se remueve este del DBEdit

Saludos y gracias por su ayuda


La franja horaria es GMT +2. Ahora son las 15:28:47.

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