Fórum Verificar quando usuário parou de Digitar. #412831

15/02/2012

0

Bom dia Pessoal.

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

Ederson Caldatto

Responder

Posts

15/02/2012

Joel Rodrigues

Cara, no onKeyUp você pode iniciar um contador e no onKeyDown zerá-lo. Se o contador somar uma certa quantidade, por exemplo, 2 segundos, você faz o filtro.
Responder

Gostei + 0

17/02/2012

Marco Salles

olá zero Coll , os passos a seguir são mais complicados porém mais Orientado a Objeto

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)








Responder

Gostei + 0

17/02/2012

Marco Salles

então

http://marcosalles.wordpress.com/2012/02/17/dicas-delph-verificar-quando-usuario-parou-de-digitar-parte-i/
Responder

Gostei + 0

17/02/2012

Ederson Caldatto

Grato pelas respostas vou tentar.
Unica coisa é que uso o Delphi 7 no trabalho.
Responder

Gostei + 0

17/02/2012

Marco Salles

Grato pelas respostas vou tentar.
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
Responder

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 ...
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar