Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿como obtener dos items seleccionados en un checklistbox? (https://www.clubdelphi.com/foros/showthread.php?t=87058)

danielmj 10-11-2014 20:33:14

¿como obtener dos items seleccionados en un checklistbox?
 
Hola de nuevo,

Tengo un checkListBox con 20 opciones, por otro lado, tengo dos labels en las que quiero meter los dos items seleccionados del checklistBox.
Hasta ahora tengo este codigo:

Código Delphi [-]
for i:= 0 to chName.Items.Count -1 do
    begin
      if chName.Checked[i] then
        begin
          if chName.State[i] = cbChecked then
            label7.Caption:= QuotedStr(chName.Items[i]);
            label8.Caption:= QuotedStr(chName.Items[i]);
            j:= j+1;
        end;
        if j > 2 then
          begin
            if Application.MessageBox ('Sólo pueden seleccionarse dos colores','Atención',mb_iconInformation+
            mb_Ok) = idOk then
            chName.Checked[i]:= false;
            chName.Selected[i]:= false;
            exit
          end;
    end;

El problema es que en los dos labels, me muestra el primer item que selecciono obviando el segundo. Por otra parte, como veis controlo que no se seleccionen mas de dos elementos, si fuerzo ese punto, en las etiquetas mete el tercer elemento que se intenta seleccionar antes de ser impedido, machacando el valor que ya tuviese.

Dicho de otro modo, de los 20 elementos, quiero seleccionar 2 y que los meta en dos etiquetas, un elemento en cada una.
¿Alguna idea o sugerencia?

Saludos.

ecfisa 10-11-2014 22:03:43

Hola danielmj.

Código Delphi [-]
...
procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
var
  i, c: Integer;
begin
  c:= 0;
  with TCheckListBox(Sender) do
  begin
    for i:= Items.Count -1 downto 0 do
      if State[i] = cbChecked then Inc(c);
    if c > 2 then
    begin
      Checked[ItemIndex]:= False;
      raise Exception.Create('Sólo pueden seleccionarse dos colores');
    end;
  end;
end;

procedure TForm1.btnSendToLabelsClick(Sender: TObject);
var
  i,c: Integer;
  s: array[0..1] of string;
begin
  with CheckListBox1 do
  begin
    c:= 0;
    for i:= 0 to Items.Count-1 do
      if Checked[i] then
      begin
        s[c]:= QuotedStr(Items[i]);
        Inc(c);
      end;
  end;
  Label7.Caption:= s[0];
  Label8.Caption:= s[1];
end;

Saludos :)

escafandra 10-11-2014 22:08:17

El siguiente ejemplo funciona en tiempor real, mientras su pulsa en los items:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  Label7.Caption:= '';
  Label8.Caption:= '';
end;


procedure TForm1.chNameClickCheck(Sender: TObject);
var
  i, j: integer;
begin
  j:=  0;
  for i:= 0 to chName.Items.Count -1 do if chName.Checked[i] then inc(j);

  if j > 2 then
  begin
    Application.MessageBox ('Sólo pueden seleccionarse dos colores','Atención',mb_iconInformation + mb_Ok);
    chName.Checked[chName.ItemIndex]:= false;
  end;

  if chName.Checked[chName.ItemIndex] then
  begin
    if label7.Caption = '' then
      label7.Caption:= QuotedStr(chName.Items[chName.ItemIndex])
    else if label8.Caption = '' then
      label8.Caption:= QuotedStr(chName.Items[chName.ItemIndex]);
  end
  else
  begin
    if label7.Caption = QuotedStr(chName.Items[chName.ItemIndex]) then label7.Caption:= '';
    if label8.Caption = QuotedStr(chName.Items[chName.ItemIndex]) then label8.Caption:= '';
  end;
end;


Saludos.

danielmj 10-11-2014 22:23:17

Muchas gracias a los dos, yo lo tenía ahí pero no terminaba de arrancar, por ejemplo a mi me salía "amarillo,amarillo,azul", es decir, repite uno de los elementos y luego concatenaba el segundo. Ahora ya va perfecto.

Gracias.


La franja horaria es GMT +2. Ahora son las 06:49:00.

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