Fórum Personalizando o DbGrid... #213587
12/02/2004
0
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
Curtir tópico
+ 0Posts
12/02/2004
Gveggi
Giovanni
Gostei + 0
12/02/2004
Marco Salles
Gostei + 0
12/02/2004
Marco Salles
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....)
Gostei + 0
12/02/2004
Marco Salles
Gostei + 0
12/02/2004
Marco Salles
Gostei + 0
12/02/2004
Fabio.hc
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;
Gostei + 0
13/02/2004
Marco Salles
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....
Gostei + 0
13/02/2004
Marco Salles
Gostei + 0
13/02/2004
Marco Salles
Gostei + 0
13/02/2004
Fabio.hc
Gostei + 0
13/02/2004
Fabio.hc
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;
Gostei + 0
13/02/2004
Marco Salles
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 :!:
Gostei + 0
14/02/2004
Fabio.hc
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;
Gostei + 0
14/02/2004
Marco Salles
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
Gostei + 0
14/02/2004
Marco Salles
Gostei + 0