Fórum próximo campo ao preencher o edit #325560
18/07/2006
0
Raserafim
Curtir tópico
+ 0Posts
18/07/2006
Lhsantos
SendMessage(Form1.Handle,WM_NEXTDLGCTL,0,0);
Gostei + 0
18/07/2006
Night_man
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);
Gostei + 0
19/07/2006
Marco Salles
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
20/07/2006
Raserafim
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
20/07/2006
Marco Salles
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
20/07/2006
Marco Salles
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
02/08/2006
Raserafim
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
02/08/2006
Marco Salles
tente isso :
propriedade Options do DbGrid tem que estar com DgAlwsShowEditor em True
Gostei + 0
03/08/2006
Marco Salles
testei aqui e não funcionou... :cry: :cry:
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
04/08/2006
Raserafim
Gostei + 0
04/08/2006
Marco Salles
Coloque esta Unit no Delphi...
e boa sorte.....
Gostei + 0
05/08/2006
Raserafim
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
05/08/2006
Marco Salles
[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
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
05/08/2006
Raserafim
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
16/08/2007
Anjinho Loiro
xauzinho....
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)