Fórum Ajuda com componente TChackBox no Delphi #560336

17/08/2016

0

Bom dia, tenho 6 componentes TCheckBox em um form e gostaria de desabilitar 5 deles após escolher um dos 6, mais ao desmarcar esse que foi escolhido voltar a habilitar os 5.
Emanuel Gonçalves

Emanuel Gonçalves

Responder

Posts

17/08/2016

Emanuel Gonçalves

tive uma ideia, o problema agora está no ( FDLerCodLanc.SQL.Add('OR '); ) . me retorna o erro ( Token Unknown - line 3, columm1 OR )

procedure TfrmRelCodLanc.Monta_SQL();
var i : Integer;
    Entra : Boolean;
begin
    FDLerCodLanc.Active := False;
    FDLerCodLanc.SQL.Clear;
    FDLerCodLanc.SQL.Add(' SELECT * FROM CODLANC ');
    Entra := True;

    for i := 0 to Self.ComponentCount - 1 do
    begin
        if (Self.Components[i] is TCheckBox) and ( TCheckBox(Self.Components[i]).Checked) then
        begin
            If Entra then
            begin
                FDLerCodLanc.SQL.Add('WHERE ');
                Entra := False;
            end
            else
                FDLerCodLanc.SQL.Add('OR ');             <<<<<<<<<<<<<<<<<<< O detalhe está aqui, me retorna o erro ( Token Unknown - line 3, columm1 OR  )
                Case TCheckBox(Self.Components[i]).Tag of
                    1:  FDLerCodLanc.SQL.Add('L_TIPO = ''D'' ');
                    2:  FDLerCodLanc.SQL.Add('L_TIPO = ''R'' ');
                    3:  FDLerCodLanc.SQL.Add('L_TIPO = ''E'' ');
                    4:  FDLerCodLanc.SQL.Add('L_TIPO = ''S'' ');
                    5:  FDLerCodLanc.SQL.Add('L_TIPO = ''M'' ');
                    6:  FDLerCodLanc.SQL.Add('L_TIPO = ''U'' ');
                end;
        end;
    end;

    if RdGpListaPor.ItemIndex = 0 then
       FDLerCodLanc.SQL.Add('ORDER BY L_TIPO, L_CODIGO')
    else
        FDLerCodLanc.SQL.Add('ORDER BY L_TIPO, L_DESCRICAO');

    FDLerCodLanc.Active := True;
    FDLerCodLanc.First;
end;

Responder

Gostei + 0

17/08/2016

Natanael Ferreira

Sugiro trocar os checkbox's pelo componente RadioGroup onde você pode escolher apenas uma opção dentre as disponíveis.

Ou CheckListBox que nativamente você pode escolher mais de uma opção, mas com o código abaixo no evento OnClickChecked fica exclusivo igual o RadiogGroup.

var
  i: Integer;
begin
  with TCheckListBox(Sender) do
    if (Checked[ItemIndex]) then
    begin
      Items.BeginUpdate;

      for i := 0 to Pred(Items.Count) do
        if (i <> ItemIndex) then
          Checked[i] := False;

      Items.EndUpdate;
    end;
end;
Responder

Gostei + 0

17/08/2016

Emanuel Gonçalves

Obrigado Natanael,

Mas fiquei curioso para resolver o erro, não consigo entender o pq desse erro.
Responder

Gostei + 0

17/08/2016

Natanael Ferreira

Provavelmente é algum detalhe na montagem do SQL que está incorreto.

Coloque um ShowMessage buscando o texto do SQL antes de ativar a query para ver como ele está sendo montado.

procedure TfrmRelCodLanc.Monta_SQL();
var
  i: Integer;
  Entra: Boolean;
begin
  FDLerCodLanc.Active := False;
  FDLerCodLanc.SQL.Clear;
  FDLerCodLanc.SQL.Add(' SELECT * FROM CODLANC ');
  Entra := True;

  for i := 0 to Self.ComponentCount - 1 do
  begin
    if (Self.Components[i] is TCheckBox) and (TCheckBox(Self.Components[i]).Checked) then
    begin
      If Entra then
      begin
        FDLerCodLanc.SQL.Add('WHERE ');
        Entra := False;
      end
      else
        FDLerCodLanc.SQL.Add('OR ');

      Case TCheckBox(Self.Components[i]).Tag of
        1:
          FDLerCodLanc.SQL.Add('L_TIPO = ''D'' ');
        2:
          FDLerCodLanc.SQL.Add('L_TIPO = ''R'' ');
        3:
          FDLerCodLanc.SQL.Add('L_TIPO = ''E'' ');
        4:
          FDLerCodLanc.SQL.Add('L_TIPO = ''S'' ');
        5:
          FDLerCodLanc.SQL.Add('L_TIPO = ''M'' ');
        6:
          FDLerCodLanc.SQL.Add('L_TIPO = ''U'' ');
      end;
    end;
  end;

  if RdGpListaPor.ItemIndex = 0 then
    FDLerCodLanc.SQL.Add('ORDER BY L_TIPO, L_CODIGO')
  else
    FDLerCodLanc.SQL.Add('ORDER BY L_TIPO, L_DESCRICAO');

  ShowMessage(FDLerCodLanc.SQL.Text); // Acrescentei esta linha

  FDLerCodLanc.Active := True;
  FDLerCodLanc.First;
end;
Responder

Gostei + 0

17/08/2016

Emanuel Gonçalves

Ele ta criando o seguinte SQL

select * from CODLANC
where
or <<<<<<<<<<<<< aqui está o problema e não consigo resolver
L_TIPO = 'D'
or
L_TIPO = 'S'
order by L_TIPO, L_CODIGO
Responder

Gostei + 0

17/08/2016

Natanael Ferreira

Fiz uma simulação do seu cenário aqui e seu código está correto.

Para que funcione, os 6 checkbox's devem estar com a propriedade Tag numerada de 1 a 6.

Se não estiver, dará este problema.
Responder

Gostei + 0

17/08/2016

Emanuel Gonçalves

eu identifiquei o problema , o form tinha um sétimo componente Tcheckbox com a tag 0, a solução foi

if (Self.Components[i] is TCheckBox) and ( TCheckBox(Self.Components[i]).Checked) and (TCheckBox(Self.Components[i]).Tag > 0)
Responder

Gostei + 0

17/08/2016

Emanuel Gonçalves

obrigado
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar