GARANTIR DESCONTO

Fórum próximo campo ao preencher o edit #325560

18/07/2006

0

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


Raserafim

Raserafim

Responder

Posts

18/07/2006

Lhsantos

Veja se isso ajuda:

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


Responder

Gostei + 0

18/07/2006

Night_man

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]


Responder

Gostei + 0

19/07/2006

Marco Salles

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;



Responder

Gostei + 0

20/07/2006

Raserafim

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?


Responder

Gostei + 0

20/07/2006

Marco Salles

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


Responder

Gostei + 0

20/07/2006

Marco Salles

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


Responder

Gostei + 0

02/08/2006

Raserafim

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.


Responder

Gostei + 0

02/08/2006

Marco Salles

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



Responder

Gostei + 0

03/08/2006

Marco Salles

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..


Responder

Gostei + 0

04/08/2006

Raserafim

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


Responder

Gostei + 0

04/08/2006

Marco Salles

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.....


Responder

Gostei + 0

05/08/2006

Raserafim

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.


Responder

Gostei + 0

05/08/2006

Marco Salles

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.


Responder

Gostei + 0

05/08/2006

Raserafim

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


Responder

Gostei + 0

16/08/2007

Anjinho Loiro

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

xauzinho....


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar