PageControl com foco travado
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?
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
Curtidas 0
Respostas
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
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
04/08/2009
é aí você me pegou... mas você não pode simplesmente dar SetFocus no DBGrid após o MessageBox :?:
Ficaria assim:
O foco após a mensagem já voltaria para o DBGrid.
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
04/08/2009
esqueci que o negrito não funciona no code (desconsidere o [ b ])
GOSTEI 0
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!
Mas obrigada pela ajuda!
GOSTEI 0
Alanporto
04/08/2009
Tenta inserindo esse código no OnChange.
Assim sempre seta o foco no DBGrid quando a aba é ativada (comigo funcionou normalmente, tanto quando entra na aba quando aparece o MessageBox).
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
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
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
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.
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
04/08/2009
Tente colocar a linha abaixo logo depois do message box
Esse trecho passa o foco para o próximo componente, se não trocar de aba, talvez funcione
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
04/08/2009
Finalmente, deu certo.
Obrigada, diegotiemann!
Obrigada, diegotiemann!
GOSTEI 0