Foco no primeiro componente
tenho um form padronizado, e preciso que ao clicar em um determinado botão o foco vá para o primeiro controle, ou seja, para o controle que tem o TabOrder = 0
Raserafim
Curtidas 0
Respostas
Edilcimar
13/01/2006
Se for no botão então coloque Edit1.SetFocus, ou OutroComponente.SetFocus
GOSTEI 0
Aasn
13/01/2006
Caro Edilcimar,
ao clicar no botão vc ´varre´ os componentes do form a procura daquele cujo TabOrder seja = 0.
Eu explico:
for c := 0 to ComponentCount -1 do
begin
if (Components[c] is TWinControl) then
if (Components[c] as TWinControl).TabOrder = 0 then
begin
(Components[c] as TWinControl).SetFocus;
Break;
end;
end;
[]´s
AASN
ao clicar no botão vc ´varre´ os componentes do form a procura daquele cujo TabOrder seja = 0.
Eu explico:
for c := 0 to ComponentCount -1 do
begin
if (Components[c] is TWinControl) then
if (Components[c] as TWinControl).TabOrder = 0 then
begin
(Components[c] as TWinControl).SetFocus;
Break;
end;
end;
[]´s
AASN
GOSTEI 0
Aasn
13/01/2006
Caro Edilcimar,
Desculpe-me se a mensagem pareceu arrogante, mas ela estava destinada a raserafim.
Era apenas mais uma dica, não tem relação com a sua resposta.
[]´s
AASN
Desculpe-me se a mensagem pareceu arrogante, mas ela estava destinada a raserafim.
Era apenas mais uma dica, não tem relação com a sua resposta.
[]´s
AASN
GOSTEI 0
Michael
13/01/2006
Olá!
A melhor forma de se fazer isso é através do método [b:598608fc27]SelectFirst[/b:598608fc27], da classe [b:598608fc27]TWinControl[/b:598608fc27]. Ele seleciona (dá foco) no controle filho com [b:598608fc27]TabOrder [/b:598608fc27]igual a 0. Como [b:598608fc27]TCustomForm [/b:598608fc27]descende indiretamente de [b:598608fc27]TWinControl[/b:598608fc27], basta colocar o método no evento do botão desejado.
[]´s
A melhor forma de se fazer isso é através do método [b:598608fc27]SelectFirst[/b:598608fc27], da classe [b:598608fc27]TWinControl[/b:598608fc27]. Ele seleciona (dá foco) no controle filho com [b:598608fc27]TabOrder [/b:598608fc27]igual a 0. Como [b:598608fc27]TCustomForm [/b:598608fc27]descende indiretamente de [b:598608fc27]TWinControl[/b:598608fc27], basta colocar o método no evento do botão desejado.
procedure TForm1.Button1Click(Sender: TObject); begin SelectFirst; end;
[]´s
GOSTEI 0
Raserafim
13/01/2006
Michael, quase perfeito, se não fosse um detalhe q não percebi. tenho um PageControl, e portanto o componente q quero q receba o foco vai ser na verdade o 2º componente.
como passo o foco para o segundo componente?
como passo o foco para o segundo componente?
GOSTEI 0
Aasn
13/01/2006
Caro Colega,
A rotina que postei anteriormente seve justamente para isso, vc pode escolher qualquer componente para ´focar´, basta que vc defina o taborder desejado.
[]´s
AASN
A rotina que postei anteriormente seve justamente para isso, vc pode escolher qualquer componente para ´focar´, basta que vc defina o taborder desejado.
[]´s
AASN
GOSTEI 0
Aasn
13/01/2006
Complementando o post anterior
se os componentes forem fixos, não forem criados em tempo de execução, você pode usar essa procedure:
procedure _SetFocus(controle : TWinControl);
begin
try
Screen.ActiveForm.FocusControl(controle);
except end;
end;
[]´s
AASN
se os componentes forem fixos, não forem criados em tempo de execução, você pode usar essa procedure:
procedure _SetFocus(controle : TWinControl);
begin
try
Screen.ActiveForm.FocusControl(controle);
except end;
end;
[]´s
AASN
GOSTEI 0
Michael
13/01/2006
Como eu mencionei, o método [b:f8d14ae744]SelectFirst [/b:f8d14ae744]é implementado na classe [b:f8d14ae744]TWinControl[/b:f8d14ae744], e como [b:f8d14ae744]TTabSheet [/b:f8d14ae744] é descendente direto desta classe, vc [u:f8d14ae744]poderia[/u:f8d14ae744] fazer isso:
Porém, este código não vai compilar, pois a classe [b:f8d14ae744]TTabSheet [/b:f8d14ae744]não publica o método, deixando-o na seção [b:f8d14ae744]Protected[/b:f8d14ae744]. Então, vc precisa de um ´truque´ para acessar métodos e propriedades protegidas de uma classe. Na seção [b:f8d14ae744]type [/b:f8d14ae744]da sua unit, logo abaixo da seção [b:f8d14ae744]interface[/b:f8d14ae744], digite:
E, no evento [b:f8d14ae744]OnClick [/b:f8d14ae744]do seu botão:
Colega [b:f8d14ae744]AASN[/b:f8d14ae744], não entendi o objetivo da sua procedure. A classe [b:f8d14ae744]TWinControl [/b:f8d14ae744]já tem o método [b:f8d14ae744]SetFocus [/b:f8d14ae744]que faz exatamente o q ela se propõe. E funciona independentemente dos componentes serem criados em design/run-time. ;-)
[]´s
PageControl.ActivePage.SelectFirst;
Porém, este código não vai compilar, pois a classe [b:f8d14ae744]TTabSheet [/b:f8d14ae744]não publica o método, deixando-o na seção [b:f8d14ae744]Protected[/b:f8d14ae744]. Então, vc precisa de um ´truque´ para acessar métodos e propriedades protegidas de uma classe. Na seção [b:f8d14ae744]type [/b:f8d14ae744]da sua unit, logo abaixo da seção [b:f8d14ae744]interface[/b:f8d14ae744], digite:
THackWinControl = class(TWinControl);
E, no evento [b:f8d14ae744]OnClick [/b:f8d14ae744]do seu botão:
THackWinControl(PageControl.ActivePage).SelectFirst;
Colega [b:f8d14ae744]AASN[/b:f8d14ae744], não entendi o objetivo da sua procedure. A classe [b:f8d14ae744]TWinControl [/b:f8d14ae744]já tem o método [b:f8d14ae744]SetFocus [/b:f8d14ae744]que faz exatamente o q ela se propõe. E funciona independentemente dos componentes serem criados em design/run-time. ;-)
[]´s
GOSTEI 0
Aasn
13/01/2006
Colega [b:a54f0fcc74]AASN[/b:a54f0fcc74], não entendi o objetivo da sua procedure. A classe [b:a54f0fcc74]TWinControl [/b:a54f0fcc74]já tem o método [b:a54f0fcc74]SetFocus [/b:a54f0fcc74]que faz exatamente o q ela se propõe. E funciona independentemente dos componentes serem criados em design/run-time. ;-)
[]´s
Caro Michael.
O fato de ter mencionado ´DesignTime ´DT´´ não quer dizer que só funcione nesse modo, quis dizer que em ´DT´ vc já sabe o nome do componente etc então fica mais fácil tipo: ´_SetFocus(Edit1)´ mas também funciona em ´RT´ perfeitamente.
Essa procedure é legal pois funciona com qualquer componente que receba foco, sem ter que se preocupar com ´truques´, basta mandar focalizar o componente e pronto, está ´focado´.
[]´s
AASN
GOSTEI 0
Michael
13/01/2006
Continuo sem entender a vantagem dela, se é possível simplesmente fazer isso:
Componentes não derivados de [b:fde675bc8c]TWinControl[/b:fde675bc8c], e que portanto não podem receber foco, não terão este método e ele não poderá ser chamado por engano.
Está se reescrevendo o que já existe, de uma outra forma.
[]´s
Edit1.SetFocus;
Componentes não derivados de [b:fde675bc8c]TWinControl[/b:fde675bc8c], e que portanto não podem receber foco, não terão este método e ele não poderá ser chamado por engano.
Está se reescrevendo o que já existe, de uma outra forma.
[]´s
GOSTEI 0
Aasn
13/01/2006
Continuo sem entender a vantagem dela, se é possível simplesmente fazer isso:
Edit1.SetFocus;
Caro Michael,
Criei esta procedure para resolver um problema relacionado ao foco de um componente em um formulário ´Dockado´, em que o simples comando ´Edit1.SetFocus´ não estava funcionando, o foco simplesmente desaparecia. Com a utilizção desta procedure o problema foi solucionado. Daí resolvi adotar em outras situações.
[]´s
AASN
p.s.: Por favor não leve esse nosso ´embate´ para o lado pessoal, é que gosto de discutir a respeito das idéias, com o objetivo de amadurece-las.
GOSTEI 0
Michael
13/01/2006
Não levo nenhuma discussão em fórums na Web para o lado pessoal. Quando o rumo de um debate começa a me desagradar, simplesmente páro de responder.
Ou seja, se estou escrevendo isso, é pq não chegou a este ponto ainda. ;-)
[]´s
Ou seja, se estou escrevendo isso, é pq não chegou a este ponto ainda. ;-)
[]´s
GOSTEI 0
Mdm
13/01/2006
Exelente dica Michael ! fui muito ajudado com ela. dessa forma eliminei um procedimento no meu sistema.
Valeu !!!
Valeu !!!
GOSTEI 0