próximo campo ao preencher o edit

Delphi

18/07/2006

como faço para que ao digitar a quantidade de caracteres máxima o foco vá automaticamente para o próximo componente?


Raserafim

Raserafim

Curtidas 0

Respostas

Lhsantos

Lhsantos

18/07/2006

Veja se isso ajuda:

SendMessage(Form1.Handle,WM_NEXTDLGCTL,0,0);


GOSTEI 0
Night_man

Night_man

18/07/2006

no evento OnChange

 
 if (Sender is TEdit) and
    ((Sender as TEdit).MaxLength > 0) and
    (Length((Sender as TEdit).Text) = (Sender as TEdit).MaxLength) then
    SelectNext(Sender as TEdit, True, True);
[/code]


GOSTEI 0
Marco Salles

Marco Salles

18/07/2006

Outra...

procedure TForm1.Edit1Change(Sender: TObject);
begin
if length(edit1.text) >= Edit1.MaxLength Then
  Perform(Wm_NextDlgCtl, 0, 0); 
end;


agora se voce quiser tornar geral para cada edit

procedure TForm1.Edit1Change(Sender: TObject);
begin
if length(TEdit(sender).text) >= TEdit(sender).MaxLength Then
  Perform(Wm_NextDlgCtl, 0, 0);
end;



GOSTEI 0
Raserafim

Raserafim

18/07/2006

valeu pessoal.

o evento OnChange de um Edit funciona diferente do OnChange do campo em um ClientDataSet. enquanto no Edit o evento é disparado acada tecla, no campo o evento só é disparado na primeira tecla.

Mas, e como faço para utilizar esta função em um DBGrid?


GOSTEI 0
Marco Salles

Marco Salles

18/07/2006

Mas, e como faço para utilizar esta função em um DBGrid?


Uma vez fiz algo parecido... Para dispara o evento OnChange do campo , simulava o pressionamento da tecla Tab , para cada tecla apertada no evento KeyPress da Grid.. [b:a5898460b7]Ia e voltava [/b:a5898460b7].. Ai sim , no evento OnChange do campo era acionado a cada tecla que se pressionava em uma determinada coluna da Grid...

foi a idéia que tive na epoca ... mas talvez alguem apresente algo mais interresante. Fico na torcida


GOSTEI 0
Marco Salles

Marco Salles

18/07/2006

Fiz um exemplo rapido aqui

Um clientDataset com os campo
Nome
Rua
cidade

Um DataSouce

Um DbGrid

Todos do tip oString

var
Voltar:Boolean;


procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if clientDataSet1.State in [dsEdit,DsInsert] then
  if  (dbgrid1.SelectedField = ClientDataSet1rua) Then
    begin
    if Key <> 9 then
      begin
        ClientDataSet1rua.OnChange:=ClientDataSet1ruaChange;
        keybd_event(VK_TAB,0,0 , 0); // Tab Press
      end
    end
  else
    if Voltar Then
       DBGrid1.SelectedField := ClientDataSet1.FieldByName(´rua´);
  end;


procedure TForm1.ClientDataSet1ruaChange(Sender: TField);
begin
ClientDataSet1rua.OnChange:=nil;
if length(sender.Text) >= 4 then //escoli o Tamnho Do campo 4
   DBGrid1.SelectedField := ClientDataSet1.FieldByName(´Cidade´)
else
   voltar:=True;
end;


procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
   if  dbgrid1.SelectedField = ClientDataSet1rua Then
     begin
      Voltar:=False;
      dbgrid1.EditorMode:=True;
     end;
end;


P:S ....Quando o Tamnho do campo Rua for 4 Mudo para o Proximo Campo No Grid

Testes que eu Fiz Funciona sem problemas , Espero que lhe sirva


GOSTEI 0
Raserafim

Raserafim

18/07/2006

Marco salles, segui a sua linha de raciocínio, mas encontrei mais um obstáculo.

quando digito que é passado para o próximo campo e volta, o campo é atualizado. até aí tudo bem. mas quando ele volta preciso que o cursor vá para logo depois do último caracter digitado.

como faço isso?

detalhe: o campo tem máscara.


GOSTEI 0
Marco Salles

Marco Salles

18/07/2006

mas quando ele volta preciso que o cursor vá para logo depois do último caracter digitado.


tente isso :

 propriedade Options do DbGrid tem que estar com DgAlwsShowEditor em True



GOSTEI 0
Marco Salles

Marco Salles

18/07/2006

Citação: mas quando ele volta preciso que o cursor vá para logo depois do último caracter digitado. tente isso : Código: propriedade Options do DbGrid tem que estar com DgAlwsShowEditor em True


testei aqui e não funcionou... :cry: :cry:

Marco salles, segui a sua linha de raciocínio, mas encontrei mais um obstáculo. quando digito que é passado para o próximo campo e volta, o campo é atualizado. até aí tudo bem. mas quando ele volta preciso que o cursor vá para logo depois do último caracter digitado. [b:f9b241aa6a]detalhe: o campo tem máscara.[/b:f9b241aa6a]



Para campo com mascara é um pouco diferente :lol: :lol:
Isto se deve ao proprio DbGrid.

então sugero algumas alteraçoes:

1) tire o DbGridMode:=True desse evento
procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
  if  dbgrid1.SelectedField = ClientDataSet1cep Then
           Voltar:=False;
end;


2)
propriedade Options do DbGrid tem que estar com DgAlwsShowEditor em True

3)Adicione Na uses
SndKey32

4)Altero o codigo do evento OnKeyPress para
if clientDataSet1.State in [dsEdit,DsInsert] then
  if  (dbgrid1.SelectedField = ClientDataSet1rua) Then
    begin
    if (Key <> 9)and(key <> 8) then
      begin
        ClientDataSet1rua.OnChange:=ClientDataSet1ruaChange;
        keybd_event(VK_TAB,0,0 , 0); // Tab Press
      end
    end
  else
    if Voltar Then
      begin
        DBGrid1.SelectedField := ClientDataSet1.FieldByName(´rua´);
        SendKeys(pchar(´´), False);
         for i:=0 to length(clientDataSet1cep.AsString)-1 do
            SendKeys(pchar(´´), False);
      end;


Se tiver alguma dificuldade poste a sua mascara para que possamos testar

P;s Na mascara não usei p EXCLAMAÇÃO

P:S aqui esta funcionando Blz..


GOSTEI 0
Raserafim

Raserafim

18/07/2006

Marco Salles, no meu delphi 7 não achei esse comando SendKeys, nem muito menos esta unit SndKey32


GOSTEI 0
Marco Salles

Marco Salles

18/07/2006

Procure no seu [b:f9386ac136]CD [/b:f9386ac136]de Delphi 7, na pasta extras a unit SndKey32.pas. Com ela vc conseguirá facilmente enviar qualquer sequencia de teclas para o Buffer do teclado do Windows...

Coloque esta Unit no Delphi...

e boa sorte.....


GOSTEI 0
Raserafim

Raserafim

18/07/2006

achei a unit, mas mesmo assim ainda não deu certo.

acho q o fato de o meu DBGrid ter vários tratamentos de Enter (para passar para a próxima coluna e caso esteja no final vai para a linha de baixo e para a primeira coluna, mas caso a linha já seja uma insersão e nada tenha sido acrescentado vai para o próximo controle). TAB vai para o próximo controle. e mais alguns outros tratamentos.
pode ser que isto esteja atrapalhando.

acho que vou ficar no aguardo de alguma outra solução. por exemplo alguma forma de saber o que está sendo digitado na DBGrid.

mas valeu a atenção até aqui Marcos Salles. valeu mesmo.


GOSTEI 0
Marco Salles

Marco Salles

18/07/2006

achei a unit, mas mesmo assim ainda não deu certo.



acho q o fato de o meu DBGrid ter vários tratamentos de Enter


[b:72c3a2da36]Sim , eventos podem influenciar toda a lógica[/b:72c3a2da36].... No meu caso o que eu faço , quando estou com algum problema nesta ordem e acompanhar passo a passo a instrução... Tento identificar eventos que não fazem parte do contexto naquele momento ... Então eu desabilito temporariamente esses eventos indesejáveis e no momento oportuno eu os reconectos ao programa

Acho que voce deve tentar , para ver se voce não esta esquecendo nada , por exemplo, ´ propriedade Options do DbGrid tem que estar com DgAlwsShowEditor em True ´

[b:72c3a2da36]tente com todos os outros eventos desabilitados[/b:72c3a2da36] , para verificar se o método que lhe passei , para este caso simples funciona

Posso lhe garantir que comigo [b:72c3a2da36]aqui funciona[/b:72c3a2da36] .. Se a resposta for não , por favor , poste a sua mascara para que eu ´possa fazer os teste aqui. Se a resposta for sim , tente descobrir os eventos expurios naquela situação

acho que vou ficar no aguardo de alguma outra solução. por exemplo alguma forma de saber o que está sendo digitado na DBGrid.

Esta outra solução , seria otima , e acredito que alguem deva saber . Confesso que ja pesei ate desenhar manualmente os campos da Grade , mas ainda não tive esse tempo...Mas acho que voce não deva desistir , pois quem não tem cão caça com gato.


GOSTEI 0
Raserafim

Raserafim

18/07/2006

hehehe, valeu pelo insentivo de persistência.

mas eu não estou bem desistindo não. isso é para o cliente digitar o DDD e o telefone. ao preencher o DDD o canpo passar logo para o telefone.
mas como eu já fiz este outro tratamento em que o enter faz passar de coluna e o tab pular para outro controle já facilitou bastante para o usuário.

então apenas vou dar um tempo e ver se aparece esta outra solução.

se bem que vc me deu uma boa idéia. vou fazer esta rotina sem nenhum outro evento e se funcionar perfeitamente vou colocando os eventos aos poucos e edentificando qual ocasiona o problema desabilitar no momento desta operação.

se der certo ou não der, ou se achar outra solução te aviso. mas acho que não vou fazer logo não.

valeu Marco Salles


GOSTEI 0
Anjinho Loiro

Anjinho Loiro

18/07/2006

Nenhum dos dois meio serviram. Vc teria algo mais pra me sugerir?

xauzinho....


GOSTEI 0
POSTAR