Fórum Testar um valor digitado no DBGrid, pra mudar de coluna #369038
14/03/2009
0
como eu testo um valor que acabei de digitar no DBGrid.
Eu tentei assim:
DBgrid.SelectField.Value, mas o teste só funciona depois que saio da coluna e volto.
Isso eu tentei tanto no KeyDown como no KeyPress.
Eu quero testar antes que ele saia da coluna pra que se estiver nas condiçoes que preciso o programa permita que saia, caso contrário ele deve digitar um novo valor.
Grato
Fonsenix
Curtir tópico
+ 0Posts
14/03/2009
Marco Salles
Aqui um exemplinho que fiz rapidinho
No evento OnsetText do Tfield FIRSTNAME de uma tabelinha MyBase que
eu tenho
procedure TForm1.ClientDataSet1FIRSTNAMESetText(Sender: TField; const Text: String); begin if uppercase(text) = Uppercase(´Marco´) then abort else sender.AsString:=text end;
Aqui testa se o Text é igual a Constante ´Marco´ ... caso seje gera uma
exceção silenciosa (Abort) e não consigo mudar de campo
Acho que é isso que vc quer
Gostei + 0
14/03/2009
Fonsenix
mais um vez agradeço sua colaboração.
Então, tentei como vc passou, com esse código:
if (StrToFloat(Text) > qnestoque) then
begin
Application.MessageBox(´Não consta esta quantidade de material´+#13+
´no estoque escolhido´,´ESTOQUE INSUFICIENTE´,MB_ICONERROR+MB_OK);
Abort;
end
else
begin
sender.AsString:=text
end;
Mas aparece duas vezes a mensagem.
Por que será?
Valeu.
Gostei + 0
15/03/2009
Marco Salles
Para uma resposta mais aferida , talves seje necessário conhecermos detalhes da sua arquiteruta ou do seu codigo
Existem Outros eventos relacionados com esta validação ??w
Vc esta usando DbEdits ou DbGrid ???
Coloque mais detalhes e debuguer ... Algo esta ocorrendo de forma recursiva. Ok ?
Gostei + 0
15/03/2009
Martins
Pq creio q está acontecendo o q o nobre [b:f21a2ac335]Marco Salles[/b:f21a2ac335] citou logo acima, dê uma revisada em seu código.
Boa sorte.
Gostei + 0
15/03/2009
Fonsenix
Marco e Salles,
na tela eu tenho sim, outros componentes como DBedits mas estão ligados a outra tabela.
No DBGrid eu tenho 7 campos, cod, descriçao, subitem, quantidade(onde eu quero testar o valor digitado), preço, desconto, total eu faço vários controles. Por exemplo, se estou em descrição e dou um Enter ele pula pro código o mesmo acontece no código. Se digito algo ele busca na tabela de produtos, preenche os campos cod e descrição e pula pro campo quantidade, e assim por diante.
Então, e esses controles eu faço no KeyDown do DBGrid, onde uso um case, pra testar se o DBGridSelectedIndex é tal, se for pulo pro próximo:
VK_RETURN:
begin
//inicio case ENTER
case dbgrd1.SelectedIndex of
2:
begin
DM.MDS_SUBPRODUTOS.Close;
DM.MDS_SUBPRODUTOS.SelectSQL.Clear;
DM.MDS_SUBPRODUTOS.SelectSQL.Add(´select * from subprodutos where cd_produto=:cdproduto´);
DM.MDS_SUBPRODUTOS.Params[0].AsInteger:=DM.MDOPRODUTOS.Fields[0].AsInteger;
DM.MDS_SUBPRODUTOS.Open;
// ShowMessage(IntToStr(DM.MDOPRODUTOS.Fields[0].AsInteger));
// ShowMessage(IntToStr(DM.MDS_SUBPRODUTOS.RecordCount));
if DM.MDS_SUBPRODUTOS.RecordCount<>0 then
begin
CreateForm(TFrmBuscaSubProd);
end
else
begin
dbgrd1.SelectedIndex:=3;
end;
end;
3:
begin
dbgrd1.SelectedIndex:=5;
end;
5:
begin
dbgrd1.SelectedIndex:=7;
end;
7:
begin
if (DBGrd1.Fields[0].AsString<>NullAsStringValue) and (DBGrd1.Fields[1].AsString<>NullAsStringValue) then
begin
if (StrToFloat(dbgrd1.Fields[5].AsString)>DM.MDOPRODUTOS.Fields[6].AsFloat) then
begin
Application.MessageBox(´O desconto dado esta acima do permitido´,´AVISO´,MB_ICONINFORMATION+MB_OK);
dbgrd1.SelectedIndex:=5;
end
else
begin
if (DM.MDS_ORCAMI.State in [dsEdit,dsInsert]) then
begin
DM.MDS_ORCAMI.Post;
// DM.MDS_ORCAMI.Last;
// DM.MDS_ORCAMI.Append;
dbgrd1.SelectedIndex:=0;
end else
begin
// DM.MDS_ORCAMI.Append;
// DM.MDS_ORCAMI.Last;
// DM.MDS_ORCAMI.Append;
dbgrd1.SelectedIndex:=0;
end;
DM.MDOTOTAL.Close;
DM.MDOTOTAL.SQL.Clear;
DM.MDOTOTAL.SQL.Add(´select * from TOTAL_ORCAM(:onum)´);
DM.MDOTOTAL.Params[0].AsInteger:=onum_var;
DM.MDOTOTAL.Open;
DM.MDS_ORCAM.Edit;
DM.MDS_ORCAM.Fields[18].AsFloat:=DM.MDOTOTAL.Fields[0].AsFloat;
DM.MDS_ORCAM.Post;
DM.MDS_ORCAMI.Append;
end;
end
else
dbgrd1.SelectedIndex:=0;
end;
end;
end;
Meio bagunçado né? rs
Gostei + 0
16/03/2009
Marco Salles
< no case> coloque um BreakPoint e execute passo a passo e veja o que
esta Rolando .. Tenho certeza que vai clarear .
Ai vc coloca os detalhes para tds que acompanham o tópico. Ok!
Gostei + 0
16/03/2009
Fonsenix
< no case> coloque um BreakPoint e execute passo a passo e veja o que
esta Rolando .. Tenho certeza que vai clarear .
Ai vc coloca os detalhes para tds que acompanham o tópico. Ok![/quote:c0ba0a2fee]
Marco, eu debuguei e percebi o seguinte, como eu controlo o movimento no DBGrid, quando dou um ENTER no KeyDown tem um código que joga pro próximo campo, mas no OnSetText ele testa, aborta se for menor, então o código tenta jogar pra próximo campo, ai testa denovo, por isso as duas mensagens.
Ja sei a causa, agora vou descobrir a solução.Valeu um abraço.
Gostei + 0
16/03/2009
Marco Salles
Sei .. então me repsonda o seguinte :
Com a tecla Tab , o problema da mensagem duplicada não ocorre ????
Gostei + 0
17/03/2009
Fonsenix
Me desculpe a demora em responder Marco,
então com tab, a mensagem aparece apenas um vez.
Por isso, que acho que tem a ver com o controle que fiz no dbgrid.
E me desculpando, eu disse na mensagem acima caros amigos, Marco e Salles, eu quis dizer Marco e Martins.
Um abraço.
Gostei + 0
17/03/2009
Marco Salles
Por acaso vc nao tem algum codigo que troca o Enter pelo Tab na sua
Aplocação . To achndo que o problema pode esta ai
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)