Array
(
)

Foco no primeiro componente

Raserafim
   - 13 jan 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


Edilcimar
   - 13 jan 2006

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


Aasn
   - 13 jan 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


Aasn
   - 13 jan 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


Michael
   - 13 jan 2006

Olá!

A melhor forma de se fazer isso é através do método SelectFirst, da classe TWinControl. Ele seleciona (dá foco) no controle filho com TabOrder igual a 0. Como TCustomForm descende indiretamente de TWinControl, basta colocar o método no evento do botão desejado.

#Código

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


[]´s


Raserafim
   - 14 jan 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?


Aasn
   - 14 jan 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


Aasn
   - 14 jan 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


Michael
   - 16 jan 2006

Como eu mencionei, o método SelectFirst é implementado na classe TWinControl, e como TTabSheet é descendente direto desta classe, vc [u:f8d14ae744]poderia[/u:f8d14ae744] fazer isso:

#Código

PageControl.ActivePage.SelectFirst;


Porém, este código não vai compilar, pois a classe TTabSheet não publica o método, deixando-o na seção Protected. Então, vc precisa de um ´truque´ para acessar métodos e propriedades protegidas de uma classe. Na seção type da sua unit, logo abaixo da seção interface, digite:

#Código
THackWinControl = class(TWinControl);


E, no evento OnClick do seu botão:

#Código
THackWinControl(PageControl.ActivePage).SelectFirst;


Colega AASN, não entendi o objetivo da sua procedure. A classe TWinControl já tem o método SetFocus que faz exatamente o q ela se propõe. E funciona independentemente dos componentes serem criados em design/run-time. ;-)

[]´s


Aasn
   - 16 jan 2006


Citação:
Colega AASN, não entendi o objetivo da sua procedure. A classe TWinControl já tem o método SetFocus 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


Michael
   - 16 jan 2006

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

#Código

Edit1.SetFocus;


Componentes não derivados de TWinControl, 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


Aasn
   - 16 jan 2006


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

#Código

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.


Michael
   - 16 jan 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


Mdm
   - 16 jan 2006

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