Foco no primeiro componente

13/01/2006

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

Respostas

13/01/2006

Edilcimar

Se for no botão então coloque Edit1.SetFocus, ou OutroComponente.SetFocus


Responder Citar

13/01/2006

Aasn

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


Responder Citar

13/01/2006

Aasn

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


Responder Citar

13/01/2006

Michael

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.

procedure TForm1.Button1Click(Sender: TObject);
begin
  SelectFirst;
end;


[]´s


Responder Citar

14/01/2006

Raserafim

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?


Responder Citar

14/01/2006

Aasn

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


Responder Citar

14/01/2006

Aasn

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


Responder Citar

16/01/2006

Michael

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:

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


Responder Citar

16/01/2006

Aasn

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


Responder Citar

16/01/2006

Michael

Continuo sem entender a vantagem dela, se é possível simplesmente fazer isso:

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


Responder Citar

16/01/2006

Aasn

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.


Responder Citar

16/01/2006

Michael

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


Responder Citar

16/01/2006

Mdm

Exelente dica Michael ! fui muito ajudado com ela. dessa forma eliminei um procedimento no meu sistema.
Valeu !!!


Responder Citar