Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Trabajo con Componentes (https://www.clubdelphi.com/foros/showthread.php?t=39277)

Jucho69 15-01-2007 23:48:10

Trabajo con Componentes
 
Por favor, soy nuevo y necesito que alguien brinde información sobre el componente CheckListBox sobre como limitar la cantidad de items marcados a uno solo, en tiempo de ejecución :confused:

esp3inform@mail.islazul.tur.cu

Gracias por adelantado

Neftali [Germán.Estévez] 16-01-2007 11:13:11

Antes de nada Revisa la Guía de estilo de los foros.

(1) Para saber cuantos ítems tienes seleccionados puedes hacer un recorrido por el CheckListBox (bucle for utilizando Items.Count) e ir sumando los que la propiedad Checked[i] es True.

(2) Para detectar cuando un elemento se "marca" puedes utilizar el evento OnClickCheck.

(3) Es este evento comprueba cuantos hay y si ya estás en el máximo uelves a ponerlo a False (utilizando la popiedad ItemIndex de la lista).

Un saludo. Si tienes problemas ya dirás...

Jucho69 16-01-2007 16:58:33

Manejo y utilización de un CheckListBox.
 
Hola...

Primeramente leí la Guia de estilos y me pareció muy aleccionadora por tanto, trataré de ser más explicito y claro.
Estoy haciendo una aplicación para manejar las Estadisticas del turismo en la entidad Islazul que incorpora un CheckListBox (componente poco nombrado) y que con el cual normalmente se pueden marcar más de un items en tiempo de ejecución, los items son nombres de instalaciones hoteleras que al ser marcados selecciono el informe correspondiente presionando un Button.

El dilema en sí es que al marcar un items luego de marcar otro, se borre el anterior marcado, o sea que siempre sea un solo items marcado, yo logré algo como les muestro a continuación, pero como verán no funciona del todo bien.

Código Delphi [-]
procedure TForm5.CheckListBox1ClickCheck(Sender: TObject);
 var i,a,j,e,f:integer;
begin

  // esta parte es para activar o desactivar el button asociado
  // al Checklist. segun haya o haya items marcados (funciona ok)
 
  for a:=0 to checklistbox1.items.count-1 do begin
  if  CheckListBox1.Checked[a]=false then BitBtn1.Enabled:=false;
  end;
  for j:=0 to checklistbox1.items.count-1 do begin
  if  CheckListBox1.Checked[j] then BitBtn1.Enabled:=true;
  end;
 

 //Esta es la parte que permite que solo haya un items marcado
      e:=-1;
 if ComboBox1.ItemIndex=1 then  begin
   CheckBox1.Checked:=false;
   CheckListBox1.ClearSelection;
   for i:=0 to checklistbox1.items.count-1 do
   if CheckListBox1.Checked[i] then begin
     e:=i;
     CheckListBox1.Checked[e]:=false;
   end;

 end;

En esta parte es donde tengo el problema donde hace bien la operación de mantener un solo items marcado pero solo cuando se selecciona un items en la lista que está más abajo del ya marcado, cuando se selecciona un items que este más arriba del anterior lo hace mal.

Disculpemme lo extenso de la explicación, y me indican si violo alguna norma del Foro, pero les agradeceria una vez más la colaboración de ustedes.

Gracias

Neftali [Germán.Estévez] 16-01-2007 17:28:34

Cita:

Empezado por Jucho69
tengo el problema donde hace bien la operación de mantener un solo items marcado pero solo cuando se selecciona un items en la lista que está más abajo del ya marcado, cuando se selecciona un items que este más arriba del anterior lo hace mal.

Haz un recorrido, los desmarcas todos menos el actual (el actual te lo da la propiedad List.ItemIndex).

Jucho69 16-01-2007 17:54:39

Agradezco tu ayuda Nef.
Yo hice el siguiente cambio:
Agregé un cliclo con la variable " f ", si la sustituyo por la variable " e " en la linea siguiente CheckListBox1.Checked[e]:=false; me hace el mismo proceso pero a la inversa.

Disculpa la insistencia y te agradecería nuevamente tu ayuda ya que no logro el objetivo de que el marcado/desmarcado fluya bien.

Gracias

Código Delphi [-]
procedure TForm5.CheckListBox1ClickCheck(Sender: TObject);
 var i,a,j,e,f:integer;
begin
  for a:=0 to checklistbox1.items.count-1 do begin
  if  CheckListBox1.Checked[a]=false then BitBtn1.Enabled:=false;
  end;
  for j:=0 to checklistbox1.items.count-1 do begin
  if  CheckListBox1.Checked[j] then BitBtn1.Enabled:=true;
  end;

   e:=-1;
 if ComboBox1.ItemIndex=1 then  begin
   CheckBox1.Checked:=false;
   CheckListBox1.ClearSelection;

   for i:=0 to checklistbox1.items.count-1 do
    if CheckListBox1.Checked[i] then begin
      e:=i;
    for f:=1 to checklistbox1.items.count-1 do     // Este es el cambio//
     CheckListBox1.Checked[e]:=false;
      end;
    end;
   if e>=0 then CheckListBox1.Checked[e]:=true;
 end;

dec 16-01-2007 18:36:04

Hola,

A mí me queda algo como esto, pero, no me termina de convencer el último "for", puesto que creo que necesitas que se habilite un botón siempre que exista al menos un "item marcado" en la lista, y, de no ser así, que se deshabilite el botón:

Código Delphi [-]
procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
var
  i: integer;
begin
  if (CheckListBox1.ItemIndex <> -1) then
  begin
    for i := 0 to CheckListBox1.Count-1 do
    begin
      if CheckListBox1.Checked[i]
       and (i <> CheckListBox1.ItemIndex) then
         CheckListBox1.Checked[i] := false;
    end;
  end;
  for i := 0 to CheckListBox1.Count-1 do
  begin
    if CheckListBox1.Checked[i] then
    begin
      BitBtn1.Enabled := true;
      Break;
    end
    else
      BitBtn1.Enabled := false;
  end;
end;

roman 16-01-2007 18:47:09

¿Y si se va a limitar la selección de casillas a una sóla, por qué, digo yo, no se usa mejor un simple listbox con MultiSelect en false?

// Saludos

dec 16-01-2007 18:51:14

Hola,

Bueno, pues al cabo yo lo dejaría como sigue... de momento. :)

Código Delphi [-]
procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
var
  b: boolean;
  i: integer;
begin
  b := false;
  if (CheckListBox1.ItemIndex <> -1) then
  begin
    for i := 0 to CheckListBox1.Count-1 do
    begin
      if CheckListBox1.Checked[i]
       and (i <> CheckListBox1.ItemIndex) then
         CheckListBox1.Checked[i] := false;
      if not b then
        b := CheckListBox1.Checked[i];
    end;
  end;
  BitBtn1.Enabled := b;
end;

Jucho69 16-01-2007 19:00:10

Hola Dec


Realmente la ayuda de los MOUSTROS que saben es indispensable, no se como agradecete a tí esta colaboración solo deseo poder algún día hacer lo mismo con otros.
Tambien le agradezco a Nef. y a otros que me hayan dado su valoración.

GRACIAS y mis respetos.

Jucho69 16-01-2007 19:26:42

Hola Roman..

Agradecido por tu observación y es cierto que con el List se hace lo mismo y mas facil, pero para mostrar mejor la selección a los usuarios menos entrenados en Windows el Check es lo ideal además que lo hé vinculado a un ComboBox de la siguiente forma:

si selecciono en el combo "Total de hoteles" , en el Check se marcan todos o los que se desea marcar, si selecciono por ejemplo "Instalación Hotelera" se selecciona solo un Items del Check.
Pueden haber variantes más faciles y versatiles y estoy seguro que muchos de ustedes pueden hayar más de una teniendo en cuenta la respuesta tan rápida y efectiva que me dió Dec.

Una vez más gracias.

Jucho69 16-01-2007 21:07:21

Te reitero mi agradecimiento Dec.

Me doy cuenta que primero hay que documentarse y aprender bien antes de comenzar a realizar cualquier proyecto más o menos importante, no obstante, seguramente muchos de ustedes comenzaron poco a poco y luego se desarroyaron en programación así es que tengo esperanzas, ya que la dedicación que pueda tener uno es escencial aparte de la imprescindible ayuda que se reciba de los Super.

Gracias y nuevamente mis respetos.

dec 16-01-2007 21:22:06

Hola,

Nada hombre, para eso estamos todos aquí, para aprender un poco, entre otras cosas. :)

Crandel 16-01-2007 23:57:17

Tambien tienes el TRadioGroup

Jucho69 18-01-2007 21:03:36

Sostengo el CheckList.
 
Hola Crandel.

En cierta tu observación, solo que el CheckList dá muchas más opciones en la selección que otros componentes del mismo tipo, tambien brinda más seguridad ya que evita la selección accidenta, claro que supongo que debe haber algún otro componente similar o incluso que haya sido creado fuera de Borland.
Si es así te agradeceria que me indicaras donde obtenerlo.

De cualquier manera gracias. ;)


La franja horaria es GMT +2. Ahora son las 05:11:10.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi