problemas com TSpeedButton e controles DataAware
Pessoal, estou com um problema um tanto quanto previsível no delphi.
Tenho vários formulários de cadastro usando DBEdit, DbMemo, etc.. e para efetuar os procedimentos manipulação da tabela, estou utilizando TSpeedButtons. Até aí tudo bem.
O problema ocorre quando vou salvar as alterações na tabela. Sempre que salvo, o último campo editado não é gravado na tabela, isto porque o DBEdit sempre atualiza os dados no dataset no seu evento onexit, e este evento só ocorre quando um outro componente recebe o foco, mas no caso do TSpeedButton, ele não recebe foco, consequentemente não executando o evento onExit do DBEdit.
Uma saída que achei foi chamar a instrução self.SetFocus; no início do procedimento do botão salvar. O problema é que fazer esta alteração em todos os botões ficaria inviável, gostaria de derivar um outro botão baseado no TSpeedButton e acrescentar esse trecho de código no evento onclick dele... alguém poderia me dar uma ajuda a esse respeito?
Preciso usar o SpeedButton por causa da sua propriedade Flat, por este motivo que não troco para o BitBtn...
Obrigado pela atenção.
Tenho vários formulários de cadastro usando DBEdit, DbMemo, etc.. e para efetuar os procedimentos manipulação da tabela, estou utilizando TSpeedButtons. Até aí tudo bem.
O problema ocorre quando vou salvar as alterações na tabela. Sempre que salvo, o último campo editado não é gravado na tabela, isto porque o DBEdit sempre atualiza os dados no dataset no seu evento onexit, e este evento só ocorre quando um outro componente recebe o foco, mas no caso do TSpeedButton, ele não recebe foco, consequentemente não executando o evento onExit do DBEdit.
Uma saída que achei foi chamar a instrução self.SetFocus; no início do procedimento do botão salvar. O problema é que fazer esta alteração em todos os botões ficaria inviável, gostaria de derivar um outro botão baseado no TSpeedButton e acrescentar esse trecho de código no evento onclick dele... alguém poderia me dar uma ajuda a esse respeito?
Preciso usar o SpeedButton por causa da sua propriedade Flat, por este motivo que não troco para o BitBtn...
Obrigado pela atenção.
Prgdelphi
Curtidas 0
Respostas
Daemon
19/07/2005
...olha. ..para ser bem sincero eu nunca tive esse problema da forma que voce apresentou, o que eu já vi, foi a pessoa tentar pegar o conteudo do campo com ...DataSet.FieldByName(´X´).AsString sendo que o campo tinha acabado de ser alterado, sendo assim, o valor do campo ainda estava na propriedade Text do DBEdit, mas de qualquer forma, tenta isso aqui:
..coloque esse trecho de codigo no evento OnChange do campo, TODOS os DBedit´s podem estar usando o mesmo evento, não precisa abrir um evento para cada um, talvez não seja a solução certa, mas é uma solução genérita e deve funcionar... ....isso resolve para vc??
if (Sender is TDBEdit) and ((Sender as TDBEdit).DataSource.State in [dsInsert, dsBrowse]) then (Sender as TDBEdit).Field.AsString := (Sender as TDBEdit).Text;
..coloque esse trecho de codigo no evento OnChange do campo, TODOS os DBedit´s podem estar usando o mesmo evento, não precisa abrir um evento para cada um, talvez não seja a solução certa, mas é uma solução genérita e deve funcionar... ....isso resolve para vc??
GOSTEI 0
Prgdelphi
19/07/2005
Obrigado pela ajuda amigão, mas não resolveu o meu problema não.... continua do mesmo jeito, eu vou no dbedit, altero o valor do campo e clico no botão salvar(TSpeedButton) e este último dbedit que foi alterado não é atualizado na tabela.
Precisava mesmo era acrescentar o comando self.setfocus no início do evento onclick de cada botão... por isso que eu pensei em derivar um novo objeto baseado no TSpeedButton mas não estou conseguindo com muito sucesso.
Obrigado pela ajuda.
Precisava mesmo era acrescentar o comando self.setfocus no início do evento onclick de cada botão... por isso que eu pensei em derivar um novo objeto baseado no TSpeedButton mas não estou conseguindo com muito sucesso.
Obrigado pela ajuda.
GOSTEI 0
Adriano Santos
19/07/2005
Cara o BitBtn tem a propriedade Flat, não entendi pq não pode usá-lo?
GOSTEI 0
Bon Jovi
19/07/2005
Acho q isso pode acontecer não só com SpeedButton. Pelo que lembro se o usuario usar a tecla de atalho do botão ao invés de pressiona-lo tb ocorre o mesmo. Pra resolver isso use o método UpdateRecord antes de chamar o Post ou no evento BeforePost.
ClientDataSet1.UpdateRecord;
ClientDataSet1.Post;
ClientDataSet1.UpdateRecord;
ClientDataSet1.Post;
GOSTEI 0
Prgdelphi
19/07/2005
É isso aí mesmo...
matou o problema bon jovi... agora funcionou perfeito...
valeu pela ajuda de todos...
e respondendo ao asrsantos, naum sei pq eu tinha certeza que o bitbtn tb tinha a propriedade flat. Procurei em tudo quanto é lugar e não achei. ele não possui essa propriedade. Testei no delphi 6 e 2005.
obrigado a todos.
matou o problema bon jovi... agora funcionou perfeito...
valeu pela ajuda de todos...
e respondendo ao asrsantos, naum sei pq eu tinha certeza que o bitbtn tb tinha a propriedade flat. Procurei em tudo quanto é lugar e não achei. ele não possui essa propriedade. Testei no delphi 6 e 2005.
obrigado a todos.
GOSTEI 0
Adriano Santos
19/07/2005
e respondendo ao asrsantos, naum sei pq eu tinha certeza que o bitbtn tb tinha a propriedade flat. Procurei em tudo quanto é lugar e não achei. ele não possui essa propriedade. Testei no delphi 6 e 2005.
Pow, procurei a propriedade agora de manhã e tb não achei...será que estamos loucos? Tinha certeza absoluta que o BitBtn possuia a propriedade, que doidera.
falow
GOSTEI 0