Ir al contenido


Foto

[RESUELTO] CheckListBox


  • Por favor identifícate para responder
9 respuestas en este tema

#1 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 08 diciembre 2010 - 01:24

Hola chicos y chicas !!!!

Aquí de nuevo con mis preguntas  8o|....

Resulta que estoy haciendo una aplicación donde utilizo un CheckListBox para enlistar unos folios de documentos a utilizar en la aplicación.

El llenado de los items lo hago sin problemas pero quiero hacer unas condiciones para que el usuario elija por lo menos un Item de la lista por lo que hago esto:



delphi
  1. {No se seleccionaron facturas}
  2.     if Lista.SelCount = -1 then
  3.     begin
  4.         Showmessage('Es necesario seleccionar al menos un folio');
  5.         bError := True;
  6.     end;



El detalle es que Lista.SelCount siempre me manda un -1 tenga yo Items seleccionados o no y obviamente este error no me deja continuar....  :

Hasta donde he buscado en google comenta que este componente hereda del TListBox y que SelCount nos indica el numero de items seleccionados.

La ayuda de Delphi dice ésto:

SelCount  Indicates the number of selected items. 


Pero nomás no logro que me diga cuántos items tengo "checkeados"  :  8o|  (li)

A alguien se le ocurre qué pueda estar pasando ?  :embarrassed:

Saludox ! :)
  • 0

#2 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 08 diciembre 2010 - 01:54

Una pequeña anotación. Cuando el valor de la propiedad MultiSelect es False, SelectCount será -1.

Tal vez por ahí está el problema.

Saludos
  • 0

#3 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 08 diciembre 2010 - 02:00

Mmm, gracias Héctor pero MultiSelect no me aparece como propiedad para el CheckListBox :(... (me parece que para el ListBox si es posible modificarlo)

Saludox ! :)
  • 0

#4 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 08 diciembre 2010 - 02:06

La propiedad MultiSelect y SelectCount se heredan de TCustomListBox y no te indican si han presionado sobre el checkbox, solamente te indica si están seleccionados los elementos que es algo distinto. No aparecen en el inspector de objetos pero si se tienen estas propiedades en CheckListBox.

Tal vez lo mejor será crear un ciclo a través del arreglo Checked[] para determinar si han pulsado sobre las casillas.

Saludos
  • 0

#5 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 08 diciembre 2010 - 02:09

La propiedad MultiSelect y SelectCount se heredan de TCustomListBox y no te indican si han presionado sobre el checkbox, solamente te indica si están seleccionados los elementos que es algo distinto. No aparecen en el inspector de objetos pero si se tienen estas propiedades en CheckListBox.

Tal vez lo mejor será crear un ciclo a través del arreglo Checked[] para determinar si han pulsado sobre las casillas.

Saludos


Gracias de nuevo amigo (y)...

Me supuse lo de la rutina pero pensé que estaba queriendo inventar el agua tibia :(... en fin, lo dejamos como resuelto y aquí dejo la rutina por si a alguien le ahorra algo de trabajo :) (suceptible a mejoras ???... no lo dudo ni 2 segundos :D :D )

Saludox ! :)



delphi
  1. function TfrmSeleFacturas.ItemsSeleccionados: Integer;
  2. var
  3.   i, iCuantos: Integer;
  4. begin
  5.     iCuantos:= 0;
  6.     for i := 0 to Lista.Count - 1 do
  7.     begin
  8.       if Lista.Checked[i] then
  9.         begin
  10.           iCuantos := iCuantos + 1;
  11.         end;
  12.     end;
  13.     Result:= iCuantos;
  14. end;


  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 08 diciembre 2010 - 06:14

Hola

¿ Y porque no usar el evento OnClickCheck del componente ?



delphi
  1. //Variable general
  2. var
  3.   contador: integer = 0;
  4.  
  5. //:::::::::
  6.  
  7. procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
  8. begin
  9.   if CheckListBox1.State[CheckListBox1.ItemIndex] = cbChecked then
  10.     inc(contador)
  11.   else
  12.     dec(contador);
  13. end;



Y muestras el resultado del contador donde quieras :)



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   ShowMessage(inttostr(contador));
  4. end;



Salud OS
  • 0

#7 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 09 diciembre 2010 - 09:18

Al hilo de este hilo  :) , me pregunto qué les hubiera costado a los desarrolladores de Delphi añadir una simple propiedad, llamémosle CheckCount, que indicara el número de elementos "checkeados". Mirando el código fuente en la VCL, hubiera sido muy fácil, y además se llevaría la cuenta al cambiar el estado de cada elemento, no sólo si se hace por un click del usuario sino también si se cambia por código.
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 diciembre 2010 - 09:36

Al hilo de este hilo  :) , me pregunto qué les hubiera costado a los desarrolladores de Delphi añadir una simple propiedad, llamémosle CheckCount, que indicara el número de elementos "checkeados". Mirando el código fuente en la VCL, hubiera sido muy fácil, y además se llevaría la cuenta al cambiar el estado de cada elemento, no sólo si se hace por un click del usuario sino también si se cambia por código.


Tienes toda la razòn.

No estaría nada mal pensar en hacernos un componente heredado de este que contenga dicha función  *-) :)

Salud OS
  • 0

#9 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 09 diciembre 2010 - 09:52

No estaría nada mal pensar en hacernos un componente heredado de este que contenga dicha función  *-) :)

En realidad debería hacerse sobre el mismo componente por parte de sus creadores, ya que es una sola propiedad la que se pide, pero fíjate que incluso heredar un componente para eso tan simple sería imposible, ya que el método donde debe llevarse la cuenta, SetState, es privado. El caso es que los TCheckListBox existen desde Delphi 3 o 4, creo recordar, mira si ha llovido, pero nunca se hacen estas mejoras que no llevan ni 2 minutos de programación, así sucede con unos cuántos componentes "de siempre" que no han evolucionado (salvo aquellas propiedades comunes a TControl que Delphi ha ido incorporando en sucesivas versiones).

Sal U2
  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 diciembre 2010 - 10:06

En realidad debería hacerse sobre el mismo componente por parte de sus creadores, ya que es una sola propiedad la que se pide, pero fíjate que incluso heredar un componente para eso tan simple sería imposible, ya que el método donde debe llevarse la cuenta, SetState, es privado. El caso es que los TCheckListBox existen desde Delphi 3 o 4, creo recordar, mira si ha llovido, pero nunca se hacen estas mejoras que no llevan ni 2 minutos de programación, así sucede con unos cuántos componentes "de siempre" que no han evolucionado (salvo aquellas propiedades comunes a TControl que Delphi ha ido incorporando en sucesivas versiones).

Sal U2


Bajo esa perspectiva, no hay mucho que hacer al respecto mas que usar algunas chapuzas.

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.