Fórum Verificar quando usuário parou de Digitar. #412831
15/02/2012
0
Me surgiu uma duvidas quanto a realização de um processo.
Tenho um edit na tela onde no OnKeyUp do mesmo eu realizo um filter no ClientDataSet,
o que queria saber e como fazer isso somente quando usuário não estiver digitando, assim que ele parar
para não ficar travando e não ocorrer erros.
Se alguém fez ou tem um ideia agradeço.
Obrigado
Ederson Caldatto
Curtir tópico
+ 0Posts
15/02/2012
Joel Rodrigues
Gostei + 0
17/02/2012
Marco Salles
Voce tem Flexibidade < depois voo colocar o método completo em meu blog >
www.marcosalles.wordpress.com
segue um trecho da classe
unit uIobserver;
interface
uses
Rtti;
Type
IObservador = Interface
[{F2FD337F-9573-4F79-A453-B87DEC580DAE}]
procedure inicialize(Owner:TObject;pMetodo:String;parametros: Array of Tvalue);
End;
implementation
end.
***************************************************
unit uTObserver;
interface
uses ExtCtrls, uIobserver ,Rtti;
type
TObservador = class(TInterfacedObject , IObservador)
private
FTimer:TTimer;
procedure MyTimer(Sender: TObject);
protected
FRoutine: TMethod;
FParametros: Array of Tvalue;
procedure ExecMethod; virtual;abstract;
public
procedure inicialize(pself:TObject;pMetodo:String;parametros: Array of Tvalue);virtual;
destructor Destroy ; override;
constructor create; reintroduce;
end;
implementation
uses
SysUtils;
{ TObservador }
constructor TObservador.create;
begin
FTimer:=TTimer.Create(nil);
FTimer.Enabled:=false;
Ftimer.Interval:=2000;
Ftimer.OnTimer:=MyTimer;
end;
destructor TObservador.Destroy;
begin
FTimer.Free;
inherited;
end;
procedure TObservador.inicialize(pself: TObject; pMetodo:String;parametros: Array of Tvalue);
var
i:integer;
Ct:TRttiContext;
tipo:TRttitype;
Met:TRttiMethod;
p:TRttiParameter;
begin
FRoutine.Code:=pself.MethodAddress(pMetodo);
if not Assigned( FRoutine.Code) then
raise Exception.Create(Error +pMetodo+Não definido na Instancia+sLineBreak+
pSelf.ToString);
FRoutine.Data:=Pointer(pself);
if not Assigned( FRoutine.Data) then
raise Exception.Create(Error : Parâmetro Não definido na Instancia+sLineBreak+
pSelf.ToString);
SetLength(FParametros,high(parametros)+1);
for i := Low(parametros) to High(parametros) do
FParametros[i]:= parametros[i];
FTimer.Enabled:=False;
FTimer.Enabled:=true;
end;
procedure TObservador.MyTimer(Sender: TObject);
begin
FTimer.Enabled:=false;
self.ExecMethod;
end;
end.
//A Partir daqui é so USAR ... Vou usar agora um procedure (sender:Tobject;Str_Params:String)
*********************************************************************
unit uOberver_Object_String;
interface
uses uTObserver;
type
TExec_Object_String = procedure (sender:Tobject;Str_Params:String) of object;
type
TObservador_Object_string = class(TObservador)
private
FFunc:TExec_Object_String;
procedure ExecMethod; override;
end;
implementation
{ TObservador_Object }
procedure TObservador_Object_String.ExecMethod;
begin
FFunc := TExec_Object_String(FRoutine);
FFunc(FParametros[0].AsObject,FParametros[1].AsString);
end;
end.
*******************************************************************
No Seu Fomulario Principal faça um aclopamento Fraco entre as classes envolvidas
private
Fobservador_Object_String:IObservador;
published
procedure Gravar(dataset:TClientDataSet;Str_nome:String); **//Depois passamos um exemplo do Fielter
end;
instanciação da variavel
procedure TForm1.FormCreate(Sender: TObject);
begin
Fobservador_Object_String:=TObservador_Object_String.create;
end;
Implemetação do método
procedure TForm1.Gravar(dataset: TClientDataSet; Str_nome: String);
begin
dataset.Append;
dataset.FieldByName(Nome).AsString:=Str_nome;
dataset.Post;
showmessage(registro + Str_nome+ gravado em +dataset.Name );
end;
utilizando o método
procedure TForm1.Edit1Change(Sender: TObject);
begin
Fobservador_Object_String.inicialize(self,Gravar,[ClientDataSet1,Tedit(sender).text]);
end;
Após um tempo de dois segundos sem digitar nada no Edit a classe Tobservador_Object_String executa
o método Gravar da classe TForm passando como parámetro o DataSet e o Texto a ser gravado (ou pesquisado)
ps) Apsera de ser grande , o processo é feito uma única vez e reutilizável de modo eficiente para outras
situações
A unica abordagem que foi colocada aqui que sou veemente contra e que a classe TForm seje responsável por
Salvar/Localizar/Filtrar Registro... Porém a interface IObservador não esta atralhada a nenhum form especifico
o unico parametro que ele pede são o Owner qu epode ser qualquer objeto , o Nome do Método e os parametros deste
método
procedure inicialize(Owner:TObject;pMetodo:String;parametros: Array of Tvalue);
A unica resalva é que este método esteja na directiva Published da classe e marcada com as diretivas de
compilação {$M+} e {$M+} que persisti as informaçoes em Rtti .. Utilizando o Framework antes do delphi 2010
apesar do exemplo so compilar no delphi 2010 em diante , por causa do usao da classe TValue (uses Rtti)
Gostei + 0
17/02/2012
Marco Salles
http://marcosalles.wordpress.com/2012/02/17/dicas-delph-verificar-quando-usuario-parou-de-digitar-parte-i/
Gostei + 0
17/02/2012
Ederson Caldatto
Unica coisa é que uso o Delphi 7 no trabalho.
Gostei + 0
17/02/2012
Marco Salles
Unica coisa é que uso o Delphi 7 no trabalho.
Uee... então esuqece , daria ate para fazer algo no delphi7 , alterando
o tipo Array of Tvalue para Array of pointer .Porém é uma abordagem menos técnica
O que me causou um certo espanto que la participamos de discussão sobre Json entre outras
coisa mais que são inerentes a novas versôes do Delphi
Gostei + 0
18/02/2012
Marco Salles
finalizei ...
http://marcosalles.wordpress.com/2012/02/17/dicas-delph-verificar-quando-usuario-parou-de-digitar-parte-i/
http://marcosalles.wordpress.com/2012/02/18/dicas-delph-verificar-quando-usuario-parou-de-digitar-parte-ii/
talves sirva para alguem ...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)