GARANTIR DESCONTO

Fórum Personalizando o DbGrid... #213587

12/02/2004

0

Boa Tarde Amigos. Estou já Há Mais Ou Menos Quatro Horas Quebrando a Cabeça Com Isto e Então Resolvir Recorrer ao Forum. Afinal De Contas Para Que Servem Os Amigos :?: . Bem, o caso é o Seguinte. Tenho Um Dbgrid e Gostaria De Testar o Valor Digitado em Um Campo Do DbGrid....Quando o Usuário Digita Um Valor Neste Campo, Ele Então Irá Selecionar Outro Campo, Suponha Que o Usuário Após Ter Digitado o Valor Deu Um <TAB> na Grad. Ao Inves De Automaticamente Como é de Praxi, O Outro Campo Da Grade Ser Imediatamente Acionado, A Rotina [color=red:f8e1fe8c2f]que não sei Criar[/color:f8e1fe8c2f], Testa o Valor Digitado e Se Não For Ok Nada Acontece na Grade, Isto é, [color=red:f8e1fe8c2f] O Cursor Fica No Mesmo Lugar Esperando Uma Correção Do Valor Digitado Pelo Usuário.[/color:f8e1fe8c2f].
Para Simplifar Vamos Dar Nomes aos Bois. Suponha Que O Campo Seja a Area. e Este Campo Não Pode Ser Deixado em Branco e Nem Digitado o Valor Zero. Quando o Usuário Estando No Modo De Inserção Ou Edição , Percorrer a Grad Deixar Este Campo (NULO OU ZERADO), o Cursor Fica Posicionado neste Campo Esperando a Correção Por Parte Do Usuário. É Claro Que Podemos Incrementar Com Uma Mensagem e Um Sinal Sonoro Do Erro Do Usuário Mas Isto é Irrelevante Já Que O Problema Principal Não é Esse... Acredito na Criatividade Dos Meus Amigos , Afinal Para Que Servem oS Amigos :?: Obrigado


Marco Salles

Marco Salles

Responder

Posts

12/02/2004

Gveggi

Vai no evento OnValidate do TField associado a coluna do seu DBGrid, la voce testa o valor digitado e faz o que precisa.

Giovanni


Responder

Gostei + 0

12/02/2004

Marco Salles

Giovanni Veggi , Esta Opção Eu Já Tentei. Ela Não Impede Que O Proximo Campo Da Grid Seje Selecionado,Ao Se Pressionar a Tecla [color=red:55ae97958b]<TAB> [/color:55ae97958b]a Não Ser Que Eu Crie Uma Exceção Do Tipo Raise Exception.Create(´´)... Mas Ficar Criando Exceções Só Em Último Caso...


Responder

Gostei + 0

12/02/2004

Marco Salles

Como Eu Disse Anteriormente , Ficar Criando Exceções Só Em Último Caso... Porém Acredito Na Criatividade Dos Meus Colegas Afinal Para Que Servem Os Amigos :?:

Resumindo: No Grid, o Usuário Edita Um Campo. Logo Em Seguida o Usuário Dá Um <TAB> Para Mudar De Campo. Gostaria De Criar Uma Rotina Que Analisase o Valor Do Campo. Se Campo Ok o Grid Muda Para Outro Campo (Conforme a Vontade Inicial Do Usuário), Caso Contrário, O
Grid Fique No Mesmo Lugar(Tipo Desativando a Tecla TAB Temporariamente, Atê Que o Valor Do Campo Seje OK....)


Responder

Gostei + 0

12/02/2004

Marco Salles

Sobe...


Responder

Gostei + 0

12/02/2004

Marco Salles

Somos Ou Não Somos Amigos :?:


Responder

Gostei + 0

12/02/2004

Fabio.hc

tente assim:

var
  Form3: TForm3;
  var_dig:string;

procedure TForm3.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
   if key = #9 then
      Key := 13;

   if Key = 13 then
      begin
      if var_dig = ´OK´ then
         DBGrid1.Perform(WM_KEYDOWN, VK_TAB, 0)
      else
         DBGrid1.Perform(WM_KEYDOWN, VK_CLEAR, 0);
      var_dig:=´´;
      end
   else
      if key in [´A´..´Z´] then
         var_dig:=var_dig + (key);
end;



Responder

Gostei + 0

13/02/2004

Marco Salles

Fabio, Muito Interresante a Sua Lógica Para Resolver a Questão. Mas Esta Ocorrendo Duas Imperfeições Na Rootina.1) Quando Campo é Ok , Ao se Pressionar a Tecla <Tab> No Grid , o Grid Esta Dando [color=red:78c9f7cc9c]Um Duplo Tab, [/color:78c9f7cc9c]Isto é Esta Saltando Dois Campos(Este Poblema Acho Que é Devido a Função: DBGrid1.Perform(WM_KEYDOWN, VK_TAB, 0) ,Que Parece Esta Duplicando O Comando <TAB> Acionado Pelo Usuário. :( 2) O Outro Ponto Chave Esta Quando o Campo Não For OK, O Usuário Ao Pressionar a tecla <Tab> O Grid
Muda Para o Outro Campo(Parece que a Função DBGrid1.Perform(WM_KEYDOWN, VK_Clear, 0) , [color=red:78c9f7cc9c]Não Esta Fazendo o Efeito Desejado.... [/color:78c9f7cc9c] :( ..Qualquer Nova Sugestão Fabio.Hc Será Muito Bem Aceita. Obrigado

Quero Ainda Resaltar Que Quando Me Referi a Campo OK Eu Estava Me Referindo a Condição Ok (Valor Do Campo Area Não PodeSer Nulo e Nem ZERO) e Não a Palavra [color=red:78c9f7cc9c]“Ok&8221;. [/color:78c9f7cc9c]Mas, Se Eu Consegui Resolver o Problema De Uma Maneira Qualquer, Eu Faço Uma [color=red:78c9f7cc9c]Adaptação [/color:78c9f7cc9c]Para o Meu Caso Específico....


Responder

Gostei + 0

13/02/2004

Marco Salles

Sobe


Responder

Gostei + 0

13/02/2004

Marco Salles

Sobe


Responder

Gostei + 0

13/02/2004

Fabio.hc

Estou melhorando a rotina acima.


Responder

Gostei + 0

13/02/2004

Fabio.hc

Tente assim:

procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   if DBGrid1.SelectedField.FieldName = ´Area´ then
      begin
      if DBGrid1.DataSource.DataSet.State = dsbrowse then
         begin
         if (Key = vk_return) or (key = vk_tab) or (key = VK_UP) or (key = VK_DOWN) or (key = VK_left) or (key = VK_right) then
            begin
            if DBGrid1.SelectedField.IsNull then
               Key := vk_return
            else if DBGrid1.SelectedField.Value <= 0 then
               Key := vk_return
            end;
         end;
      end;
end;



Responder

Gostei + 0

13/02/2004

Marco Salles

Fabio.Hc , Voce Realmente Tem Uma Disposição Invejável Sem Falar No Conhecimento Apresentado Nos Vários Tópicos Que Voce Participa.Isto Eu Não Falo De Boca Para Fora, Mas é O Que Voce Tem Demostrado.... Nesta Sua Segunda Apresentação Sobre Este Tópico, O Que Posso Destacar [color=red:7a9e06403e](“Pois Estou a Testar a Sugestão&8221;), [/color:7a9e06403e]é a Velha História Conhecida Por Nós...Ao Se Digitar Qualquer Valor No Campo Do DbGrid Conectado ao Campo Área, Este Valor Não Aparece De Imediato no Campo área, ele aparece no dbgrid mas ainda não foi [color=red:7a9e06403e]VALIDADO[/color:7a9e06403e]. O efeito disso é que qualquer valor digitado no campo do DbGrid a istrução : if DBGrid1.SelectedField.IsNull then ..... Key := vk_return Sera Sempre Verdadeira, Então Eu Ficaria Sempre Digitando Algo e Nunca Sairia Do [color=red:7a9e06403e]LUGAR[/color:7a9e06403e]. Se Tivesse Um Jeito De Não Testar o Valor Do Campo Mas Sim o [color=red:7a9e06403e]Conteúdo Do Texto Do DbGrid Em Temp Real [/color:7a9e06403e], Ai Seria Bom Demais....

Quero Dizer Que Estou Desde AnteOntem Sobre Esta Dúvida. Consegui Avanços Relevantes Mas Ainda Estou Com Problema...No Mais Tudo Que Voce Coloca [color=red:7a9e06403e]PODE [/color:7a9e06403e]Não Resolver o Problema Diretamente, Mas Dá Para Captar a :idea: Idéia e Mesmo Funções e Procedimentos Novos, Aparecem :P e São Moldados De Acordo Com Nosso Objetivo...Por Exemplo Estou Quase Resolvendo Usando a Idéia Da [color=red:7a9e06403e]“Var_Dig&8221; [/color:7a9e06403e]Apresentada No Primeiro Tópico . Isto Tudo Na Verdade Não Tem Nenhum Vínculo Com o Lado Economico, Mas é Um Estudo Que Estou Fazendo....Se Te Enterressar Estou Postando Abaixo Os Eventos Que Estou Usando Para Resolver o Problema


[color=red:7a9e06403e]********Na Verdade o Campo é Não é Area e Sim População e Seu Indice e TRES NO DBGRID[/color:7a9e06403e]
procedure TCalcForm.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_Down,
VK_UP
:begin
if (DbGrid1.DataSource.DataSet.State in [DsInsert,DsEdit]) Then
Key:=0;
end;
VK_Tab
:begin
if DbGrid1.SelectedIndex=3 Then
if (DbGrid1.DataSource.DataSet.State in [DsInsert,DsEdit]) Then
if (Val_Dig=´´) Then
begin
beep(1,1);
ShowMessage(´ERROR : Este Campo Não Pode Ser Deixado Em Branco.´);
Key:=Vk_Clear;
end
else
if (Val_Dig=´0´) Then
if not(MessageDlg(´AVISO : O Valor Deste Campo é Zero? Voce Confirma Isto?´,
mtConfirmation,[mbok,mbcancel],0)=mrok) Then
begin //Caso Não Confirme , Fica No Mesmo Lugar
Beep(1,1);
Key:=VK_Clear;
end;
end;
end;
end;

[color=red:7a9e06403e]////Como Disse o Campo é Populacao e Seu Indice é o TRES.. Por Isto Que Estou A TESTAR[/color:7a9e06403e]
procedure TCalcForm.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if DbGrid1.SelectedIndex=3 Then //So me Interessa Indice=3
if Key <> #9 Then
if Key = 8 Then
Delete(Val_Dig,Length(Val_Dig),1)
else
if (Val_Dig = ´0´)Then
Key:=0
else
Val_Dig:=Val_Dig+Key;}
end;

procedure TCalcForm.DBGrid1ColEnter(Sender: TObject);
begin
if DbGrid1.SelectedIndex=3 Then
if DbGrid1.DataSource.State in [DsEdit] Then
Val_Dig:=Table1Population.AsString;
end;

procedure TCalcForm.DBGrid1ColExit(Sender: TObject);
begin
if DbGrid1.SelectedIndex=3 Then //So Me Interressa Indice=3
Val_Dig:=Table1Population.AsString;
end;

procedure TCalcForm.Table1BeforePost(DataSet: TDataSet);
begin
…&8230;&8230;&8230;&8230;&8230;&8230;&8230;&8230;.
Val_Dig:=´´;
end;

Teoricamente Tudo Parece Se Encaixar, O Problema Que Estou a Encontrar é O Seguinte. Suponha o Valor [color=red:7a9e06403e]ZERO [/color:7a9e06403e]Digitado No Campo Do DbGrid...
1)Suponha o Valor Zero Digitado No DbGrid
2)Logo Em Seguida Dou Um [color=red:7a9e06403e]TAB[/color:7a9e06403e]
3)O Programa Me Pergunta Se ([color=red:7a9e06403e]´AVISO : O Valor Deste Campo é Zero? Voce Confirma Isto?´,[/color:7a9e06403e]4)O Problema Dá Quando Eu Confirmo. Porque:
a) O Grid Muda De Campo ...Correto
b) O Campo Population Fica Com O Valor Zero...Correto[color=red:7a9e06403e]
c) O Valor Zero Misteriosamente Some Do DbGrid ?????????????????? O GRID FICA EM
BRANCO.... VAI ENTENDER????? JÁ TENTEI ATE DESABILITAR TEMPORARIAMENTE O
EVENTO DBGRID1KEYPRESS , MAS NÃO DEU RESULTADO????????[/color:7a9e06403e]

No Mais Estou Usando a Tabela [color=red:7a9e06403e]Country Do Aliase BDDEMOS [/color:7a9e06403e]Do Delphi...Olha Eu Sei Que é Meio
Chato Analisar Um Problema Dos Outros. Porém Estou Enviando Porque as Vezez Voce é Um Cara Igual a a Mim, Que Gosta De Ficar Quebrando a Cabeca :P ...Afinal, Nós Somos Ou Não Somos Amigos :?: Somos, Claro Que Somos :!:


Responder

Gostei + 0

14/02/2004

Fabio.hc

[quote:f4777ecc60=´Marco Salles´]Fabio.Hc , Voce Realmente Tem Uma Disposição Invejável Sem Falar No Conhecimento Apresentado Nos Vários Tópicos Que Voce Participa.Isto Eu Não Falo De Boca Para Fora, Mas é O Que Voce Tem Demostrado.... Nesta Sua Segunda Apresentação Sobre Este Tópico, O Que Posso Destacar (“Pois Estou a Testar a Sugestão”), é a Velha História Conhecida Por Nós...Ao Se Digitar Qualquer Valor No Campo Do DbGrid Conectado ao Campo Área, Este Valor Não Aparece De Imediato no Campo área, ele aparece no dbgrid mas ainda não foi VALIDADO. O efeito disso é que qualquer valor digitado no campo do DbGrid a istrução : if DBGrid1.SelectedField.IsNull then ..... Key := vk_return Sera Sempre Verdadeira, Então Eu Ficaria Sempre Digitando Algo e Nunca Sairia Do LUGAR. Se Tivesse Um Jeito De Não Testar o Valor Do Campo Mas Sim o Conteúdo Do Texto Do DbGrid Em Temp Real , Ai Seria Bom Demais.... [/quote:f4777ecc60]
R. Para testar o valor do em tempo real:
1. DBGrid1.DataSource.DataSet.post; (Grava e sai do modo de edição ou inserção).
2. DBGrid1.DataSource.DataSet.UpdateRecord; (Grava e Continua no modo de edição ou inserção).

Voltando, continuo usando no evento OnKeyDown:

procedure TForm3.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   if DbGrid1.SelectedIndex=3 Then //So Me Interressa Indice=3
//   if DBGrid1.SelectedField.FieldName = ´Population´ then
      begin
//*----------------------------------------------------------------
      if DBGrid1.DataSource.DataSet.State in [dsedit, dsinsert] then
         begin
         if (Key = vk_return) or (key = vk_tab) then
            DBGrid1.DataSource.DataSet.post;
         if (key = VK_UP) or (key = VK_DOWN) or (key = VK_left) or (key = VK_right) then
            Key := 0;
         end;
//*----------------------------------------------------------------
      if DBGrid1.DataSource.DataSet.State = dsbrowse then
         begin
         if (Key = vk_return) or (key = vk_tab) or (key = VK_UP) or (key = VK_DOWN) or (key = VK_left) or (key = VK_right) then
            begin
            if DBGrid1.SelectedField.IsNull then
               begin
               ShowMessage(´ERROR : Este Campo Não Pode Ser Deixado Em Branco.´);
               Key := 0
               end
            else if DBGrid1.SelectedField.Value <= 0 then
               begin
               if not(MessageDlg(´AVISO : O Valor Deste Campo é Zero? Voce Confirma Isto?´,
                  mtConfirmation,[mbok,mbcancel],0)=mrok) Then
                  begin //Caso Não Confirme , Fica No Mesmo Lugar
                  Beep;
                  Key := 0
                  end;
               end;
            end;
         end;
//*----------------------------------------------------------------
      end;
end;



Responder

Gostei + 0

14/02/2004

Marco Salles

[quote=´Fabio.HC 1. DBGrid1.DataSource.DataSet.post; (Grava e sai do modo de edição ou inserção).
2. DBGrid1.DataSource.DataSet.UpdateRecord; (Grava e Continua no modo de edição ou inserção).

Voltando, continuo usando no evento OnKeyDown:

end;[/code]


Bom Fabio, Eu Também Prefiro Continuar a Usar o EVento OnKeyDown.. A Solução Apresentada No Meu Modo De Ver Tem Dois Inconvenientes.
1) Ao Salvar o Registro Antes Do Processo Terminar, o Registro No Grid Dará Um ´Salto´ Aos Olhos Do Usuário...Isto é Um Incoveniente Que Deve Ser Considerado.....
2)O Segundo Ponto Porem Neste Exemplo é O Mais Agravante.Veja Que Não Foi Mencionado Mas Há Campos Calculados Que Dependem Do Valor Do Campo Populacao...Quando Voce Grava Sem Antes Concluir O Processo Pode Esta Gravando Um Valor Inválido Para Este Campo Calculado.(Como Por Exemplo Uma Divisão Por Zero) O Que Acarreta Numa Dor De Cabeça.

3) Se Voce Tivesse Um ´Tempinho´ e Abrir Um Form, Colocar Um DbGrid Um Table, Um DataSouce, Copiar Aqueles Eventos Que Lhe Passei( É Só Colar, Executar e Inserir Um Registro , Usando as Setas dO Teclado) (USO o Aliase DbDemos Tabela Country Do Delphi)...Feito Isto Voce Poderia Observar Aqueles Passos Que Lhe Passei ANTERIORMENTE...

4)No Mais, Mais Uma Função Foi Apresentada Por Voce, Que Tenho Certeza Ainda Me Será Útil Um Dia :
DBGrid1.DataSource.DataSet.UpdateRecord; (Grava e Continua no modo de edição ou inserção).

Mas De Qualquer Forma Agradeço a Atenção Dispensada, E Espero Ainda Terminar Este Tópico Com Este Problema Morto e Enterrado. :P


Responder

Gostei + 0

14/02/2004

Marco Salles

Sobe ????


Responder

Gostei + 0

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

Aceitar