Mudar a cor da font do CheckBox qdo Clicado

Delphi

15/05/2010

Alguem sabe como mudar a cor da fonte do CheckBox quando Clicadojá crie uma procedure assim:
procedure TFrmPadrao.CheckBoxClicado;Var  x: Integer;begin  // Configura o componente CheckBox  for x := 0 to ComponentCount - 1 do  if (Components[x] is TCheckBox) then  begin    case (Components[x] as TCheckBox).State of     cbUnchecked: TColorControl(Components[x] as TCheckBox).Font.Color := clWindowText;     cbChecked  : TColorControl(Components[x] as TCheckBox).Font.Color := clRed;    end;  end;end;
tentei chamar assim
procedure TFrmPadrao.CheckBox1Click(Sender: TObject);begin  CheckBoxClicado;//  CheckBox1.Font.Color := clRed;end;
e não consegui, alguem já conseguir fazer isto??
José Silva.

José Silva.

Curtidas 0

Respostas

Marco Salles

Marco Salles

15/05/2010

O  checkbox é um controle padrão do Windows, o que significa que todo o desenho do controle é feito pelo Windows   Para poder fazer isso, você teria que implementar seu próprio checkbox com uma rotina de desenho modificada.
GOSTEI 0
José Silva.

José Silva.

15/05/2010

MARCO ANTONIO SALLES, obrigado pela sua atenção e sua resposta, mas sou principiante, e como todo principiante gosta de embelezar as sua primeiras aplicações e vi que o checkbox é um componente diferenciado, como você mesmo disse "você teria que implementar seu próprio checkbox com uma rotina de desenho modificada", por um acaso você tem um exemplo de como fazer isso??Grato, fico no aguardo
GOSTEI 0
Marco Salles

Marco Salles

15/05/2010

MARCO ANTONIO SALLES, obrigado pela sua atenção e sua resposta, mas sou principiante, e como todo principiante gosta de embelezar as sua primeiras aplicações e vi que o checkbox é um componente diferenciado, como você mesmo disse "você teria que implementar seu próprio checkbox com uma rotina de desenho modificada", por um acaso você tem um exemplo de como fazer isso?? Grato, fico no aguardo
    Entendo.. Pois bem eu poderia ate criar aqui mesmo , devargarzinho.... um tutorial , para implementar esta funcionalidade.   Vc sabe criar um pacote dpk ????
GOSTEI 0
José Silva.

José Silva.

15/05/2010

Entendo.. Pois bem eu poderia ate criar aqui mesmo , devargarzinho.... um tutorial , para implementar estafuncionalidade. Vc sabe criar um pacote dpk ????
MARCO ANTONIO SALLES, isso eu já sei!!!Se você disponibilizar esse tutorial, ira ajudar não só a mim como também todos(iniciantes é claro) que procuram por essa solução.Desde já agradeço
 
GOSTEI 0
Marco Salles

Marco Salles

15/05/2010

Beleza , mas este Tutorial eu não tenho. Teria que fazer devargar ... um pouquinho por dia Sabe como é .. Tempo né   Sairemos do Chão , ate chegar no componente em questão   Ok ???
GOSTEI 0
Lartedesign

Lartedesign

15/05/2010

Ola José Francisco

Minha dica é nao complique uma coisa tão simples. Sua solução está aqui

No evento onclick do CheckBox  coloque da seguinte forma

procedure TFrmPadrao.CheckBox1Click(Sender: TObject);
    begin
     if CheckBox1.Checked = True then  //se estiver selecionado a cor do texto será vermelho
      begin
       CheckBox1.Font.Color := clRed;
         end else   // se nao estiver
 selecionado a cor do texto será Preto
      begin
     CheckBox1.Font.Color := clWindowText;
  end;
end;


Apenas isso .

Espero ter ajudado

lartedesign.
www.lartedesign.com.br
Leandro
GOSTEI 0
Lartedesign

Lartedesign

15/05/2010

Ola José Francisco

Minha dica é nao complique uma coisa tão simples. Sua solução está aqui

No evento onclick do CheckBox  coloque da seguinte forma

procedure TFrmPadrao.CheckBox1Click(Sender: TObject);
    begin
     if CheckBox1.Checked = True then  //se estiver selecionado a cor do texto será vermelho
      begin
       CheckBox1.Font.Color := clRed;
         end else   // se nao estiver
 selecionado a cor do texto será Preto
      begin
     CheckBox1.Font.Color := clWindowText;
  end;
end;


Apenas isso .

Espero ter ajudado

lartedesign.
www.lartedesign.com.br
Leandro
GOSTEI 0
Marco Salles

Marco Salles

15/05/2010

ola seu lartedesign tudo bem   qual o delphi vc usa e qual o sistema operacional ????    
GOSTEI 0
José Silva.

José Silva.

15/05/2010

lartedesign, infelizmente não deu certo, esse componente e diferenciado, teste ai e você verá que não funciona.Continuo no aguardo
GOSTEI 0
Lartedesign

Lartedesign

15/05/2010

respondendo a primeira pergunta

WINXP  .  DELPHI 7




SEGUNDA DO   JOSÉ FRANCISCO DA SILVA.

se vc usa um checkbox uq pode ser diferente no componente ?

uq esta acontecendo quando vce testa a aplicação  ???   qual delphi vc utiliza ???
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

15/05/2010

olha, deveria ser bem simples mesmo.

tente assim:

procedure TFormPadrao.CheckBox1Click(Sender: TObject);
begin
  CheckBoxClicado(TCheckBox(Sender));
end;

procedure TFormPadrao.CheckBoxClicado(chkBox: TCheckBox);
begin
   if chkBox.Checked then
      chkBox.Font.Color := clGreen
   else
      chkBox.Font.Color := clWindowText;
end;


GOSTEI 0
José Silva.

José Silva.

15/05/2010

lartedesign, respondendo 
se vc usa um checkbox uq pode ser diferente no componente ? 
Não é que é um componente diferente, mas sim diferenciado no que diz respeito a alteração da font 

uq esta acontecendo quando vce testa a aplicação  ???  qual delphi vc utiliza ??? 
Simplesmente não muda a cor da font Delphi 2010  Desde já agradeço sua resposta

 
GOSTEI 0
José Silva.

José Silva.

15/05/2010

Emerson, vou testar e depois respondo, pois no momento estou sem DelphiObrigado
GOSTEI 0
José Silva.

José Silva.

15/05/2010

Emerson, deveria ser bem simples mesmo.
tentei assim:



procedure TFormPadrao.CheckBox1Click(Sender:
TObject);begin  CheckBoxClicado(TCheckBox(Sender));end;

procedure TFormPadrao.CheckBoxClicado(chkBox: TCheckBox);begin   if chkBox.Checked then      chkBox.Font.Color := clGreen   else      chkBox.Font.Color := clWindowText;end;



E não surtiu o efeito esperado, ou seja, não mudou a cor da
font, mas engraçado que usando assim:

procedure
TFormPadrao.CheckBoxClicado(chkBox: TCheckBox);begin   if chkBox.Checked then      chkBox.Font .Style := [fsBold]   else      chkBox.Font .Style := [];end;

consegui que o estilo ficasse em NEGRITO.

Estou cada vez mais convencido que esse componente NÃO ACEITA MUDAR A
COR DA FONT, Nem os mais experientes desta comunidade conseguiram este feito.

Fico no aguardo

Mais uma vez obrigado
Emerson
GOSTEI 0
Marco Salles

Marco Salles

15/05/2010

é simples , fiquei livre do tutorial . por sorte   confesso que fiquei surpreso qnd o ChekBox permite alteração no Delphi 7 e a partir do Delphi 2007 não   vasculei um pouco da Vcl e cheguei na classe TButtonControl que seria a classe desprezada no caso da escolha de um novo checkBox   Fui na procedure procedure CNCtlColorStatic(var Message: TWMCtlColorStatic);
procedure TButtonControl.CNCtlColorStatic(var Message: TWMCtlColorStatic);
begin
  with ThemeServices do
    if ThemeControl(Self) then
    begin
      if (Parent <> nil) and Parent.DoubleBuffered then
        PerformEraseBackground(Self, Message.ChildDC)
      else
        DrawParentBackground(Handle, Message.ChildDC, nil, False);
      { Return an empty brush to prevent Windows from overpainting we just have created. }
      Message.Result := GetStockObject(NULL_BRUSH);
    end
    else
      inherited;
end;
  e debugando veriquei que ThemeControl(Self) para o Delphi2007 e Delphi2010 retornava sempre True. Tinha que cair no   inherited; para manter a cor e a font definida ate mesmo em DesignedTime   então o proximo passo foi desabiltar os Temas que vc faz em   caixa de diálogo Project Options -> página de aplicativos -> temas runtime Enable  .. desabilite   Fiz ums teste aqui e parece que agorar vai ( ...)  
GOSTEI 0
José Silva.

José Silva.

15/05/2010

MARCO ANTONIO SALLES, M A R A V I L H A !!!!é QUEM SABE, SABE, quem não sabe aprende com quem sabe, bate palmas e agradece.Marcos você matou a charada, Parabéns e muito obrigado por mim e por toda comunidade que um dia necessitou dessa dica.
OBS: Como coloco que está concluido
GOSTEI 0
José Silva.

José Silva.

15/05/2010


MARCO ANTONIO SALLES, M A R A V I L H A !!!!é QUEM SABE, SABE, quem não sabe aprende com quem sabe, bate palmas e agradece.Marcos você matou a charada, Parabéns e muito obrigado por mim e por toda comunidade que um dia necessitou dessa dica.
OBS: Como coloco que está concluido
 

Como tem acima um botão para abrir e outro para responder, deveria ter um também para mudar o status para concluido.É só uma ideia para melhorar mais ainda, vocês não acham???
GOSTEI 0
Marco Salles

Marco Salles

15/05/2010


Como tem acima um botão para abrir e outro para responder, deveria ter um também para mudar o status para concluido. É só uma ideia para melhorar mais ainda, vocês não acham???
O Botão eu não digo , pq desatentamente algum desativado poderia meter a mão nele. Mas que  deveriam implementar este recurso sem dúvida nenhuma . (Permite a Edição por exemplo do caption do Primeiro Post por exemplo )
GOSTEI 0
José Silva.

José Silva.

15/05/2010





Como tem acima um botão para abrir e outro para responder, deveria ter um também para mudar o status para concluido.
É só uma ideia para melhorar mais ainda, vocês não acham???


O Botão eu não digo , pq desatentamente algum desativado poderia meter a mão nele. Mas que  deveriam implementar
este recurso sem dúvida nenhuma . (Permite a Edição por exemplo do caption do Primeiro Post por exemplo )
 
MARCO ANTONIO SALLES, mas a minha ideia é que esse botão só estaria disponível para quem abriu o tópico, o que vocês acham disso??
GOSTEI 0
José Silva.

José Silva.

15/05/2010


é simples , fiquei livre do tutorial . por sorte
 
confesso que fiquei surpreso qnd o ChekBox permite alteração no Delphi 7 e a partir do Delphi 2007 não
 
vasculei um pouco da Vcl e cheguei na classe TButtonControl que seria a classe desprezada no caso da
escolha de um novo checkBox
 
Fui na procedure procedure CNCtlColorStatic(var Message: TWMCtlColorStatic);


procedure TButtonControl.CNCtlColorStatic(var Message: TWMCtlColorStatic);
begin
  with ThemeServices do
    if ThemeControl(Self) then
    begin
      if (Parent <> nil) and Parent.DoubleBuffered then
        PerformEraseBackground(Self, Message.ChildDC)
      else
        DrawParentBackground(Handle, Message.ChildDC, nil, False);
      { Return an empty brush to prevent Windows from overpainting we just have created. }
      Message.Result := GetStockObject(NULL_BRUSH);
    end
    else
      inherited;
end;


 
e debugando veriquei que ThemeControl(Self) para o Delphi2007 e Delphi2010 retornava sempre True.
Tinha que cair no   inherited; para manter a cor e a font definida ate mesmo em DesignedTime
 
então o proximo passo foi desabiltar os Temas que vc faz em
 
caixa de diálogo Project Options ->
página de aplicativos ->
temas runtime Enable  .. desabilite
 
Fiz ums teste aqui e parece que agorar vai ( ...)
 
 

Marcos, aproveitando sua dica, teria como varrer todos os CheckBox do Form de uma só vez, para não precisar marcar um por um no OnClick e assim valeria para todos??



GOSTEI 0
Marco Salles

Marco Salles

15/05/2010

Alguem sabe como mudar a cor da fonte do CheckBox quando Clicado já crie uma procedure assim:
procedure TFrmPadrao.CheckBoxClicado; Var   x: Integer; begin   // Configura o componente CheckBox   for x := 0 to ComponentCount - 1 do   if (Components[x] is TCheckBox) then   begin     case (Components[x] as TCheckBox).State of      cbUnchecked: TColorControl(Components[x] as TCheckBox).Font.Color := clWindowText;      cbChecked  : TColorControl(Components[x] as TCheckBox).Font.Color := clRed;     end;   end; end;
tentei chamar assim
procedure TFrmPadrao.CheckBox1Click(Sender: TObject); begin   CheckBoxClicado; //  CheckBox1.Font.Color := clRed; end;
e não consegui, alguem já conseguir fazer isto??
    Mas para que vc quer varrer se vc pode usar Orientação a Objeto ????   em cada CheckBox do seu formulario vc Compartilha o mesmo Manipulador de eventos   E So vc Seleciona-los Simultaneamente Clicando sobre cada um deles com a Tecla CNTRL pressionada   Depois no Objecto inspector na aba Events procure por OnClick e de o duplo click   Deve abir algo assim   procedure TFrmPadrao.onclick(sender:TObject); begin end;   Escreva então o método Geral  

procedure TFrmPadrao.SeuOnClick(sender:TObject);
begin  
     TCheckBox(sender).Font.Color := clWindowText;
     TCheckBox(sender).Font.Color := clRed;
    end;
  end;
end;
   
GOSTEI 0
Marco Salles

Marco Salles

15/05/2010

  Mas para que vc quer varrer se vc pode usar Orientação a Objeto ????   em cada CheckBox do seu formulario vc Compartilha o mesmo Manipulador de eventos   E So vc Seleciona-los Simultaneamente Clicando sobre cada um deles com a Tecla CNTRL pressionada   Depois no Objecto inspector na aba Events procure por OnClick e de o duplo click   Deve abir algo assim   procedure TFrmPadrao.onclick(sender:TObject); begin end;   Escreva então o método Geral  

procedure TFrmPadrao.SeuOnClick(sender:TObject);
begin  
     TCheckBox(sender).Font.Color := clWindowText;
     TCheckBox(sender).Font.Color := clRed;
    end;
  end;
end;
 
GOSTEI 0
Marco Salles

Marco Salles

15/05/2010

Mas para que vc quer varrer se vc pode usar Orientação a Objeto ????   em cada CheckBox do seu formulario vc Compartilha o mesmo Manipulador de eventos   E So vc Seleciona-los Simultaneamente Clicando sobre cada um deles com a Tecla CNTRL pressionada   Depois no Objecto inspector na aba Events procure por OnClick e de o duplo click   Deve abir algo assim   procedure TFrmPadrao.onclick(sender:TObject); begin end;   Escreva então o método Geral  

procedure TFrmPadrao.SeuOnClick(sender:TObject);
begin  
     TCheckBox(sender).Font.Color := clWindowText;
     TCheckBox(sender).Font.Color := clRed;
    end;
  end;
end;
 
GOSTEI 0
Marco Salles

Marco Salles

15/05/2010

Alguem sabe como mudar a cor da fonte do CheckBox quando Clicado já crie uma procedure assim:
procedure TFrmPadrao.CheckBoxClicado; Var   x: Integer; begin   // Configura o componente CheckBox   for x := 0 to ComponentCount - 1 do   if (Components[x] is TCheckBox) then   begin     case (Components[x] as TCheckBox).State of      cbUnchecked: TColorControl(Components[x] as TCheckBox).Font.Color := clWindowText;      cbChecked  : TColorControl(Components[x] as TCheckBox).Font.Color := clRed;     end;   end; end;
tentei chamar assim
procedure TFrmPadrao.CheckBox1Click(Sender: TObject); begin   CheckBoxClicado; //  CheckBox1.Font.Color := clRed; end;
e não consegui, alguem já conseguir fazer isto??
     Mas para que vc quer varrer se vc pode usar Orientação a Objeto ????   em cada CheckBox do seu formulario vc Compartilha o mesmo Manipulador de eventos   E So vc Seleciona-los Simultaneamente Clicando sobre cada um deles com a Tecla CNTRL pressionada   Depois no Objecto inspector na aba Events procure por OnClick e de o duplo click   Deve abir algo assim   procedure TFrmPadrao.onclick(sender:TObject); begin end;   Escreva então o método Geral  

procedure TFrmPadrao.SeuOnClick(sender:TObject);
begin  
     TCheckBox(sender).Font.Color := clWindowText;
     TCheckBox(sender).Font.Color := clRed;
    end;
  end;
end;
   
GOSTEI 0
José Silva.

José Silva.

15/05/2010



Alguem sabe como mudar a cor da fonte do CheckBox quando Clicado
já crie uma procedure assim:



procedure TFrmPadrao.CheckBoxClicado;
Var
  x: Integer;
begin
  // Configura o componente CheckBox
  for x := 0 to ComponentCount - 1 do
  if (Components[x] is TCheckBox) then
  begin
    case (Components[x] as TCheckBox).State of
     cbUnchecked: TColorControl(Components[x] as TCheckBox).Font.Color := clWindowText;
     cbChecked  : TColorControl(Components[x] as TCheckBox).Font.Color := clRed;
    end;
  end;
end;


tentei chamar assim



procedure TFrmPadrao.CheckBox1Click(Sender: TObject);
begin
  CheckBoxClicado;
//  CheckBox1.Font.Color := clRed;
end;


e não consegui, alguem já conseguir fazer isto??




 
 
Mas para que vc quer varrer se vc pode usar Orientação a Objeto ????
 
em cada CheckBox do seu formulario vc Compartilha o mesmo Manipulador de eventos
 
E So vc Seleciona-los Simultaneamente Clicando sobre cada um deles com a Tecla CNTRL pressionada
 
Depois no Objecto inspector na aba Events procure por OnClick e de o duplo click
 
Deve abir algo assim
 

procedure TFrmPadrao.onclick(sender:TObject);
begin
end;
 
Escreva então o método Geral
 



procedure TFrmPadrao.SeuOnClick(sender:TObject);

begin  

     TCheckBox(sender).Font.Color := clWindowText;

     TCheckBox(sender).Font.Color := clRed;

    end;

  end;

end;


 
 
 

Marcos, eu queria algo parecido com:
  for x := 0 to ComponentCount - 1 do  if (Components[x] is TCheckBox) then  begin    if (Components[x] as TCheckBox).HasParent then    begin       . . . . .      (Components[x] as TCheckBox).OnClick := ??????????;       . . . . end;
e o delphi soubesse que estou clicando em algum checkbox e ele fizesse a ação que deteminei no OnClick, ou seja CheckBoxClicado.Não sei se me expressei muito bem

GOSTEI 0
José Silva.

José Silva.

15/05/2010

Marcos, eu queria algo parecido com: 
for x := 0 to ComponentCount - 1 do  if (Components[x] is TCheckBox) then  begin  if (Components[x] as TCheckBox).HasParent then  begin  .  .  .  .  .  (Components[x] as TCheckBox).OnClick := ??????????; // não aceita CheckBoxClicado .  .  .  .  end; 
e o delphi soubesse que estou clicando em algum checkbox e ele fizesse a ação que deteminei no OnClick, ou seja CheckBoxClicado.
Não sei se me expressei muito bem

 
GOSTEI 0
Marco Salles

Marco Salles

15/05/2010

Mas para que vc quer varrer se vc pode usar Orientação a Objeto ????   em cada CheckBox do seu formulario vc Compartilha o mesmo Manipulador de eventos   E So vc Seleciona-los Simultaneamente Clicando sobre cada um deles com a Tecla CNTRL pressionada   Depois no Objecto inspector na aba Events procure por OnClick e de o duplo click   Deve abir algo assim   procedure TFrmPadrao.onclick(sender:TObject); begin end;   Escreva então o método Geral  

procedure TFrmPadrao.SeuOnClick(sender:TObject);
begin  
     TCheckBox(sender).Font.Color := clWindowText;
     TCheckBox(sender).Font.Color := clRed;
    end;
  end;
end;
GOSTEI 0
Shuichi Murakami

Shuichi Murakami

15/05/2010

Olá, sou novo por aqui e apesar de tardio, também talvez não seja o local adequado para postar os meus sinceros agradedimentos ao Marco Antonio Salles que solucionou o problema do amigo José Francisco da Silva (e certamente de muitos outros). O motivo da dúvida de postagem é que estou tentando desenvolver no Lazarus que também trabalha com linguagem Pascal e me deparei com o mesmo problema com checkboxes e radiobuttons. Seguindo as dicas do Marco, deu tudo beleza mesmo no Lazarus ! Como diz um provérbio árabe: "Um sábio que não ensina o que sabe, é como uma nuvem negra e fecunda que passa sem deixar cair a chuva." Arigatô pela chuva.
GOSTEI 0
Marco Salles

Marco Salles

15/05/2010

Shuichi Murakami muito agradecido pelo seu feedback , com certeza não só pelo compartilhar mas o agradecer tb faz parte da sabedoria milenar dos Orientais

[]sds
GOSTEI 0
POSTAR