Personalizando o DbGrid...
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
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
Curtidas 0
Respostas
Gveggi
12/02/2004
Vai no evento OnValidate do TField associado a coluna do seu DBGrid, la voce testa o valor digitado e faz o que precisa.
Giovanni
Giovanni
GOSTEI 0
Marco Salles
12/02/2004
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...
GOSTEI 0
Marco Salles
12/02/2004
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....)
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
Marco Salles
12/02/2004
Sobe...
GOSTEI 0
Marco Salles
12/02/2004
Somos Ou Não Somos Amigos :?:
GOSTEI 0
Fabio.hc
12/02/2004
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;
GOSTEI 0
Marco Salles
12/02/2004
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....
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
Marco Salles
12/02/2004
Sobe
GOSTEI 0
Marco Salles
12/02/2004
Sobe
GOSTEI 0
Fabio.hc
12/02/2004
Estou melhorando a rotina acima.
GOSTEI 0
Fabio.hc
12/02/2004
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;
GOSTEI 0
Marco Salles
12/02/2004
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 :!:
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
Fabio.hc
12/02/2004
[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:
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
Marco Salles
12/02/2004
[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]
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
Marco Salles
12/02/2004
Sobe ????
GOSTEI 0
Marco Salles
12/02/2004
Será Que Não Tem Jeito Mesmo :?: :cry:
GOSTEI 0
Carlos Bernardo
12/02/2004
Marcos, vc já conseguiu resolver esse problema ?
Tenho algumas idéias sobre o assunto....
Tenho algumas idéias sobre o assunto....
GOSTEI 0
Carlos Bernardo
12/02/2004
[quote=´rausch´]Marcos, vc já conseguiu resolver esse problema ?
Tenho algumas idéias sobre o assunto....
Tenho algumas idéias sobre o assunto....
Minha idéia é a seguinte:
1º Vc tem q deixar o Keypreview do form : false
Senão a tecla enter não vai funcionar dentro do grid
2º No options do grid, passa o dgtabs para false
Senão, ao pressionar o tab, não irá funcionar de acordo, com q queremos...
3º No evento onkeydown do grid
if key = Vk_Return then key := vk_Tab;
4º No evento onkeypress do grid
if (key = #13) and (dbgrid1.SelectedIndex =3) then
begin
If (dbgrid1.Columns[3].Field.text = ´´) or (dbgrid1.Columns[3].Field.text <= floattostr(0))then
begin
ShowMessage(´Esse campo deve ser preenchido com valor superior a zero.´);
dbgrid1.Options := dbgrid1.Options + [dgAlwaysShowEditor ];
dbgrid1.SelectedIndex :=3;
end
else
dbgrid1.Options := dbgrid1.Options - [dgAlwaysShowEditor ];
end
else
if dbgrid1.selectedindex = 3 then
dbgrid1.Options := dbgrid1.Options - [dgAlwaysShowEditor ];
if (key = #13) and (dbgrid1.SelectedIndex =4) then
begin
If (dbgrid1.Columns[4].Field.text = ´´) or (dbgrid1.Columns[4].Field.text <= floattostr(0))then
begin
ShowMessage(´Esse campo deve ser preenchido com valor superior a zero.´);
dbgrid1.Options := dbgrid1.Options + [dgAlwaysShowEditor ];
dbgrid1.SelectedIndex :=4;
end
else
dbgrid1.Options := dbgrid1.Options - [dgAlwaysShowEditor ];
end
else
if dbgrid1.SelectedIndex = 4 then
dbgrid1.Options := dbgrid1.Options - [dgAlwaysShowEditor ];
O + [dgAlwaysShowEditor], fará com q a célula fique em modo de edição, evitando uma mensagem a mais de erro na condição acima..., sendo q a condição já está correta...
Agora, algumas coisas q ainda não resolvi, se vc sair da célula com o clique do mouse, não tem jeito...
Caso vc queira melhorar, de um toque...
Aqui funcionou certinho...
GOSTEI 0