PageControl com foco travado

Delphi

04/08/2009

Olá,

Após a execução do código abaixo,

procedure TFrmCadastro.PgcCadcliChanging(Sender: TObject;
var AllowChange: Boolean);
begin
if (Dados.TbClientes.FieldByName(´pessoa´).Value = ´J´) then
begin
AllowChange := False;
Application.MessageBox(´Cadastro complementar somente para pessoa física!´, ´Aviso´, MB_ICONWarning);
Exit;
end;
end;

o foco do formulário recai sobre o PageControl, devido a definição do valor da propriedade TabOrder do controle, e nele se fixa. Ou seja, por mais que eu mude a ordem dos controles no formulário, por meio do TabOrder, quando o PageControl recebe o foco, não consigo passar para outro controle que, no meu caso, seria um DbGrid. O que devo fazer para que, ao teclar a tecla ´seta para baixo´, o foco saia do PageControl e vá para o DbGrid?


Sgrandini

Sgrandini

Curtidas 0

Respostas

Alanporto

Alanporto

04/08/2009

Ocorre por que o foco fica nos TabSheets, então só muda o foco para outros controles com a tecla Tab (com os direcionais ele foca nas outras abas). O que você pode fazer é dar um SetFocus nele no evento OnShow do TabSheet.


GOSTEI 0
Sgrandini

Sgrandini

04/08/2009

Realmente, o foco só muda com a tecla TAB. Infelizmente, alanporto, o procedimento que vc passou não funcionou. Não consigo fazer com que o foco saia do PageControl e passe para o DbGrid usando a tecla ´seta para baixo´. Coloquei o TabOrder do DbGrid 0, e do PageControl 1. Qdo eu seleciono uma determinada linha do DbGrid, cujo valor do campo ´pessoa´ é igual a ´J´, o procedimento descrito no evento OnChanging do PageControl deve impedir que o usuário mude de aba, e é o que acontece de fato. Ao cliclar no botão ´Ok´ da mensagem que é exibida pelo ´MessageBox´, o foco é direcionado para o PageControl de acordo com o valor definido no TabOrder (1) deste controle. Mesmo o foco sendo direcionado para o PageControl, eu gostaria que ele (o foco) mudasse para o controle DbGrid utilizando a tecla ´seta para baixo´ e não a tecla TAB. Como fazer isso?


GOSTEI 0
Alanporto

Alanporto

04/08/2009

é aí você me pegou... mas você não pode simplesmente dar SetFocus no DBGrid após o MessageBox :?:

Ficaria assim:
procedure TFrmCadastro.PgcCadcliChanging(Sender: TObject;
var AllowChange: Boolean);
begin
if (Dados.TbClientes.FieldByName(´pessoa´).Value = ´J´) then
begin
AllowChange := False;
Application.MessageBox(´Cadastro complementar somente para pessoa física!´, ´Aviso´, MB_ICONWarning);
[b]DBGrid1.SetFocus;[/b]
end;
end; 


O foco após a mensagem já voltaria para o DBGrid.


GOSTEI 0
Alanporto

Alanporto

04/08/2009

esqueci que o negrito não funciona no code (desconsidere o [ b ])


GOSTEI 0
Sgrandini

Sgrandini

04/08/2009

Eu fiz isso, mas não deu certo. O problema é que, seja qual for a ordem do PageControl no form, qdo o foco recai sobre ele nada faz com que saia. Só se eu utilizar o TAB, e não é isso que quero. Mesmo que o foco vá para um botão, por exemplo, e depois vá para o DbGrid, não tem problema. O negócio é que o foco precisa sair do PageControl.
Mas obrigada pela ajuda!


GOSTEI 0
Alanporto

Alanporto

04/08/2009

Tenta inserindo esse código no OnChange.
   if PgcCadcli.ActivePage = TabSheetUsado then
      DBGrid1.SetFocus;

Assim sempre seta o foco no DBGrid quando a aba é ativada (comigo funcionou normalmente, tanto quando entra na aba quando aparece o MessageBox).


GOSTEI 0
Sgrandini

Sgrandini

04/08/2009

Ainda não foi desta vez. Mudei o TabStop do PageControl para False, mas nem assim deu jeito. O que será que estou fazendo de errado?


GOSTEI 0
Alanporto

Alanporto

04/08/2009

passe seu e-mail por mp que te mando o que fiz aqui pra você ver se o seu tem alguma coisa errada.


GOSTEI 0
Sgrandini

Sgrandini

04/08/2009

Descobri que o problema está na linha de código

Application.MessageBox(´Cadastro complementar somente para pessoa física!´, ´Aviso´, MB_ICONWarning);

Não sei pq isso acontece. Mudei para SHOWMESSAGE e funcionou. Assim que cliquei no OK da mensagem, teclei na seta para baixo e passei para a próxima linha do DbGrid. Pena o MESSAGEBOX não funcionar, pq eu gostaria de adicionar o ícone de aviso e alterar o título da janela de mensagem.


GOSTEI 0
Diegotiemann

Diegotiemann

04/08/2009

Tente colocar a linha abaixo logo depois do message box


 Perform(WM_NEXTDLGCTL, 0, 0);


Esse trecho passa o foco para o próximo componente, se não trocar de aba, talvez funcione


GOSTEI 0
Sgrandini

Sgrandini

04/08/2009

Finalmente, deu certo.
Obrigada, diegotiemann!


GOSTEI 0
POSTAR