Foco no primeiro componente
13/01/2006
0
Raserafim
Posts
13/01/2006
Edilcimar
13/01/2006
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
13/01/2006
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
13/01/2006
Michael
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
14/01/2006
Raserafim
como passo o foco para o segundo componente?
14/01/2006
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
14/01/2006
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
16/01/2006
Michael
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
16/01/2006
Aasn
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
16/01/2006
Michael
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
16/01/2006
Aasn
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.
16/01/2006
Michael
Ou seja, se estou escrevendo isso, é pq não chegou a este ponto ainda. ;-)
[]´s
16/01/2006
Mdm
Valeu !!!
Clique aqui para fazer login e interagir na Comunidade :)