PDA

Ver la Versión Completa : Trabajo con Componentes


Jucho69
15-01-2007, 23:48:10
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 (http://www.clubdelphi.com/foros/guiaestilo.php) 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
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.


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
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


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:


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. :)


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
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. ;)