Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda Com Checkbox


luizf

Pergunta

Olá pessoal, tudo beleza.

Estou precisando de uma ajudinha com dois checkbox.

Tenho dois formularios, form1 e form2. O primeiro chama o segundo, form2.showmodal.

No form2 tenho um button e dois checkbox, cb_1 e cb_2.

No form2, o button chama uma determinada função e junto, depois da função, coloquei um comando para verificar se o cb_1 esta checado, se tiver verificar se o cb_2 tambem esta checado para executar outro item.

1-    if cb_1.Checked  then   
2-      begin                           
3-        if cb_2.Checked then   
4-          close;                       
5-          form1.Close;             
6-      end                               
7-      else                              
8-      begin                            
9-        close;                         
10-  end;                               
O que seria: 1- se checkbox1 tiver checado 2- então verifica se checkbox2 esta checado 3- se checkbox2 tiver checado 4- então fecha este form2 5- e fecha o form1 se checkbox2 não tiver checado 9- fecha apenas o form2 O cb_1 checado é para fechar apenas o form2, com o cb_2 checado fecha o form2 e o form1. No evento onclick do cb_1 coloquei:
 if cb_1.Checked then
   begin
     cb_2.Enabled:= true;
   end
   else
   begin
     cb_2.Enabled:= false;
   end;

Com o cb_1 checado, é habilitado o cb_2 ( enable:= true).

Com o cb_1 não checado, o cb_2 é desabilitado ( enable:= false).

Mas, não está saindo como eu queria, alguém pode dar uma olhada e verificar o que tem de errado.

Muito obrigado.

T+

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

opa

Mas, não está saindo como eu queria, alguém pode dar uma olhada e verificar o que tem de errado.
O que você quer fazer?

O que seria:

1- se checkbox1 tiver checado

2- então verifica se checkbox2 esta checado

3- se checkbox2 tiver checado

4- então fecha este form2

5- e fecha o form1

se checkbox2 não tiver checado

9- fecha apenas o form2

você explicou o seu código então não da pra saber o que realmente você quer fazer...

if cb_1.Checked  then   
begin                           
  if cb_2.Checked then   
  close;                       
  form1.Close; //?¿     
end                               
else                              
begin                            
  close;                         
end;
Este código realmente está confuso porque o Form1 é o principal da aplicação e se você fechá-lo ele vai automaticamente terminar a aplicação e sendo assim vai fechar o form2 também! Então não faz sentido você colocar
if cb_2.Checked then close;
porque ele vai ser fechado de qualquer jeito pelo form1...
form1.Close;

Claro, supondo que você manteve a ordem de criação, então supostamente o

Form1 é o principal... por isso talvez você esteja achando estranho que não está

como você quer rs

explica o que você quer fazer pra gente poder te ajudar ;)

abraços

Link para o comentário
Compartilhar em outros sites

  • 0

O que eu quero é o seguinte:

Ao clicar o button feche o form2, desde que o cb_1 esteja checado e feche o form1, desde que o cb_2 esteja checado, ou sejal, se o cb_2 estiver checado, irá sair da aplicação.

Mas está dando varios erros, por exemplo, o aplicativo esta sendo fechado mesmo com os checkboxs não tando checados.

Entendeu?

T+

Link para o comentário
Compartilhar em outros sites

  • 0
1 -  if cb_1.Checked  then   
2 -  begin                           
3 -    if cb_2.Checked then   
4 -      close;                       
5 -    form1.Close;             
6 -  end                               
7 -  else                              
8 -  begin                            
9 -    close;                         
10-   end;
luizf, acho que você se atrapalhou com os if's..else. Veja como deveria ter ficado:
1 -  if cb_1.Checked  then  // *** só fecha alguma coisa se checked
2 -  begin                           
3 -    if cb_2.Checked then  // *** se checked, fecha aplicação através do close do form principal
5 -      form1.Close;             
7 -    else  // senão fecha janela atual
9 -      close;                         
10- end;
mantive os nº para você verificar o que foi removido
No evento onclick do cb_1 coloquei:
 if cb_1.Checked then
   begin
     cb_2.Enabled:= true;
   end
   else
   begin
     cb_2.Enabled:= false;
   end;
Com o cb_1 checado, é habilitado o cb_2 ( enable:= true). Com o cb_1 não checado, o cb_2 é desabilitado ( enable:= false).
Vamos simplificar?
cb_2.Enabled := cb_1.Checked;

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

E aí Micheus, beleza.

Muito obrigado, sua simplificação ficou boa:

cb_2.Enabled := cb_1.Checked;
Faltou um end e um begin, tava dando erro.
if cb_1.Checked  then  // *** só fecha alguma coisa se checked
    begin
      if cb_2.Checked then  // *** se checked, fecha aplicação através do close do form principal
        form1.Close;
>>    end
      else  // senão fecha janela atual
>>    begin
        close;
      end;

Mas, fora isso, o resto ainda tá dando erro.

...▬ Fechar este. ------> cb_1

......▬ Fechar todos.------> cb_2, que só é habilitado caso cb_1 esteja checado.

Os erros são estes:

1- Com os dois checados, beleza, fecha o aplicativo.

2- Com o cb_1 checado e o cb_2 não checado, não fecha nada, era para fechar o form atual, form2.

3- Com o cb_1 não checado e o cb_2 checado, mas desabilitado por causa do cb_1 não estar checado, fecha o form atual, mas não era para fechar nada, pois o cb_1 não esta checado e o cb_2 esta checado, mas desabilitado, o que tambem desabilita qualquer função que esteja por traz deste, não é isso?

Então se puder/em me dar uma luz agradeço.

T+ e um abraço.

.

Link para o comentário
Compartilhar em outros sites

  • 0

Mais uma coisinha, eu gostaria, depois de resolvido o problema, criar uma

procedure, pois não é só nesse botão que vou usar, então com a procedure, é

só chamar.

Mas, não sei como fazer a procedure, nem como chamá-la e nem como declará-la,

ou seja não sei nada. RSRSRS.

Me dá uma dica.

O que eu quero, é mais ou menos isso:

Declaração:

procedure FECHAR (agora aqui não sei o que coloco);
Código da procedure:
procedure FECHAR (agora aqui não sei o que coloco);
begin
  if cb_1.Checked  then  // *** só fecha alguma coisa se checked
    begin
      if cb_2.Checked then  // *** se checked, fecha aplicação através do close do form principal
        frm_Autorun_CAD.Close;
      end
      else  // senão fecha janela atual
      begin
        close;
      end;
end;
Chamar a procedure, por exemplo em tres botões com apenas a chamada desta procedure em comum.
procedure Tform2.Button1Click(Sender: TObject);
begin
  linha de código 1
  linha de código 2
  FECHAR;
end;

procedure Tform2.Button2Click(Sender: TObject);
begin
  FECHAR;
end;

procedure Tform2.Button3Click(Sender: TObject);
begin
  linha de código 1
  linha de código 2
  linha de código 3
  linha de código 4
  linha de código 5
  FECHAR;
end;

É isso, se puder me dar mais esta ajuda fico grato.

T+

.

Link para o comentário
Compartilhar em outros sites

  • 0

Por enquanto vou responder esta, depois sigo a próxima. ;)

Faltou um end e um begin, tava dando erro.

if cb_1.Checked  then  // *** só fecha alguma coisa se checked
    begin
      if cb_2.Checked then  // *** se checked, fecha aplicação através do close do form principal
        form1.Close;
>>    end
      else  // senão fecha janela atual
>>    begin
        close;
      end;
Mas, fora isso, o resto ainda tá dando erro. Os erros são estes: 2- Com o cb_1 checado e o cb_2 não checado, não fecha nada, era para fechar o form atual, form2. 3- Com o cb_1 não checado e o cb_2 checado, mas desabilitado por causa do cb_1 não estar checado, fecha o form atual, mas não era para fechar nada, pois o cb_1 não esta checado e o cb_2 esta checado, mas desabilitado, o que tambem desabilita qualquer função que esteja por traz deste, não é isso?
luizf, o erro deveria estar em outro lugar. O problema continua devido aos posicionamentos dos begin..end; Vou colocar com os begin..end (que não seriam necessários) para ver ser você descobre onde está o verdadeiro erro.
if cb_1.Checked  then  // *** só fecha alguma coisa se checked
begin                          
    if cb_2.Checked then  // *** se checked, fecha aplicação através do close do form principal
    begin
        form1.Close;            
    end 
    else  // senão fecha janela atual
    begin
        close;                        
    end;
end;

Observe no código (comentários em vermelho):

"2- Com o cb_1 checado e o cb_2 não checado, não fecha nada, era para fechar o form atual, form2."

Se cb_1 Checked, testa cb_2; Se cb_2 Checked fecha o form1, senão fecha o atual;

"3- Com o cb_1 não checado e o cb_2 checado, mas desabilitado por causa do cb_1 não estar checado, fecha o form atual, mas não era para fechar nada, pois o cb_1 não esta checado e o cb_2 esta checado, mas desabilitado, o que tambem desabilita qualquer função que esteja por traz deste, não é isso?"

Se cb_1 não Checked, não tem nada a fazer.

Agora é que eu entendi porque você tinha o erro. É que eu havia deixado um ";" depois do form1.close - era só remover.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0
Mais uma coisinha, eu gostaria, depois de resolvido o problema, criar uma procedure, pois não é só nesse botão que vou usar, então com a procedure, é só chamar.

Mas, não sei como fazer a procedure, nem como chamá-la e nem como declará-la,

ou seja não sei nada. RSRSRS.

Vixe!!! tá feia a coisa heim?! :D

Me dá uma dica.

O que eu quero, é mais ou menos isso:

Declaração:

type
  TForm2 = class(TForm)
  ...
  private
    procedure Fechar;  // não vai necessitar de parâmetros
  ...
  end;
Código da procedure:
procedure TForm2.Fechar;
begin
  if cb_1.Checked  then  // *** só fecha alguma coisa se checked
  begin                          
    if cb_2.Checked then  // *** se checked, fecha aplicação através do close do form principal
      form1.Close
    else  // senão fecha janela atual
      close;                        
  end;
end;
Chamar a procedure, por exemplo em tres botões com apenas a chamada desta procedure em comum.
procedure Tform2.Button1Click(Sender: TObject);
begin
  linha de código 1
  linha de código 2
  Fechar;
end;

procedure Tform2.Button2Click(Sender: TObject);
begin
  Fechar;
end;

procedure Tform2.Button3Click(Sender: TObject);
begin
  linha de código 1
  linha de código 2
  linha de código 3
  linha de código 4
  linha de código 5
  Fechar;
end;

É isso aí.

Link para o comentário
Compartilhar em outros sites

  • 0

Beleza, era mais ou menos como eu pensava mais estava me faltando alguns detalhes, heheheh.

Só que declarei a procedure no private e deu esta mensagem, mas rodou legal:

[Hint] Unit_form2.pas(35): Private symbol 'Fechar' declared but never used

Mudei a declaração para o public e não apareceu a msg, por que? Tem algum problema deixar no public?

Mais uma coisinha, no post#4 que você me mandou eu o apliquei e deu erro como disse no post#5 e adicionei um end e um begin e rodou certinho, não deu o resultado que eu esperava mas rodou.

Agora você me passa como fazer essa procedure e coloca o código sem o tal end e o begin, de novo, mas desta vez não deu erro.

?????????????????

Voce ou alguém pode me explicar.

Um abraço e T+

.

Link para o comentário
Compartilhar em outros sites

  • 0
Só que declarei a procedure no private e deu esta mensagem, mas rodou legal:

[Hint] Unit_form2.pas(35): Private symbol 'Fechar' declared but never used

Mudei a declaração para o public e não apareceu a msg, por que? Tem algum problema deixar no public?

Pela mensagem de advertência, significa que você ainda não tinha incluído a chamada da procedure nos eventos do botão (é o que normalmente ocorre).

Quando você passou para public, será que você já não teria adicionado a chamada?

Mais uma coisinha, no post#4 que você me mandou eu o apliquei e deu erro como disse no post#5 e adicionei um end e um begin e rodou certinho, não deu o resultado que eu esperava mas rodou.

Agora você me passa como fazer essa procedure e coloca o código sem o tal end e o begin, de novo, mas desta vez não deu erro.

Então. É como coloquei em vermelho negrito no último post. No post #4 eu havia colocado um ";" depois do form1.close (não pode ter ";" antes de um else), o que gerou o erro e fez com que você introduzisse o begin..end; Só que nesta situação, você modificou a lógica que eu havia proposto.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu pela força em Micheus.

Pelo menos agora tá funcionando.

Mais uma coisinha que eu queria pedir, sem querer abusar, é claro.

Meu programa tem o form principal (form1), esse form chama outros forms, mas sempre do form1 para os outros, ou seja o form1 chama o form2, se eu quero ir ao form3, tenho de fechá-lo voltando ao form1 para ir ao form3, é que esses form não tem nada a ver um com o outro, então coloquei uma descrição no form1 e dependendo do que se quer é form que irá se abrir.

Então o quero é o seguinte, essa procedure fechar vou ter que usar em todos os forms menos o form1.

Por isso tava pensando se tem como criar um unit independente do form e usá-la nos forms, por exemplo tenho as units do form1, do form2, do form...... e a unitFechar. Ou colocar essa procedure em uma DLL, não sei.

Me diz aí como posso fazer.

Um abraço e T+

.

Link para o comentário
Compartilhar em outros sites

  • 0
Por isso tava pensando se tem como criar um unit independente do form e usá-la nos forms, por exemplo tenho as units do form1, do form2, do form...... e a unitFechar. Ou colocar essa procedure em uma DLL, não sei.
luizf, você pode criar uma unit só para ela ou, ainda, definí-la na unit do form principal (no seu caso Form1), "exportá-la" colocando a definição (cabeçalho) da procedure antes da sessão Implementation e colocando o código completo após Implementation (junto com o código do form). Neste caso, para usá-la nos outros form's, você adiciona a unit do form principal na cláusula uses do form em questão.

Se todos os form's que você quizer aplicar esta procedure tiverem os CheckBox cb_1 e cb_2, vamos passar como parâmetro o form atual. E para não nos preocuparmos com quem é o form principal, sabendo que queremos terminar a aplicação ao fechá-lo, vamos chamar logo o Application.Terminate (assim, fica um pouco mais genérica - vai que você troca o nome do form, daí tem que sair alterando...):

procedure Fechar(FormAtual :TForm);
var
  cb_1, cb_2 :TCheckBox;
begin
  cb_1 := FormAtual.FindComponent('cb_1') as TCheckBox;
  cb_2 := FormAtual.FindComponent('cb_2') as TCheckBox;
  if not Assigned(cb_1) or not Assigned(cb_2) then  // apenas uma proteção contra esquecimento;-)
    Raise Exception.Create('Não foram encontrados os CheckBox esperados.');

  if cb_1.Checked  then  // *** só fecha alguma coisa se checked
  begin
    if cb_2.Checked then  // *** se checked, fecha aplicação através do close do form principal
      Application.Terminate
    else  // senão fecha janela atual
      FormAtual.close;
  end;
end;
Então, para chamar você usa, por ex.:
procedure Tform2.Button2Click(Sender: TObject);
begin
  Fechar(Self);  // o self é a instância do próprio form
end;

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      652k
×
×
  • Criar Novo...