próximo campo ao preencher o edit
como faço para que ao digitar a quantidade de caracteres máxima o foco vá automaticamente para o próximo componente?
Raserafim
Curtidas 0
Respostas
Lhsantos
18/07/2006
Veja se isso ajuda:
SendMessage(Form1.Handle,WM_NEXTDLGCTL,0,0);
SendMessage(Form1.Handle,WM_NEXTDLGCTL,0,0);
GOSTEI 0
Night_man
18/07/2006
no evento OnChange
[/code]
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
Marco Salles
18/07/2006
Outra...
agora se voce quiser tornar geral para cada edit
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
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?
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
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
18/07/2006
Fiz um exemplo rapido aqui
Um clientDataset com os campo
Nome
Rua
cidade
Um DataSouce
Um DbGrid
Todos do tip oString
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
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
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.
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
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
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
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
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.....
Coloque esta Unit no Delphi...
e boa sorte.....
GOSTEI 0
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.
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
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
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
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
18/07/2006
Nenhum dos dois meio serviram. Vc teria algo mais pra me sugerir?
xauzinho....
xauzinho....
GOSTEI 0