ببینید من این راه حل به نظرم می رسه البته اگر اسرار خاصی به استفاده از خاصیت Filter ندارید:
unit Unit2;
interface
uses
Classes, ADODB, DB;
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure ADOTableFilterRecord(DataSet: TDataSet;var Accept: Boolean);
public
STbl:TADOTable;
FldName:String;
SearchString:String;
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TMyThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TMyThread }
procedure TMyThread.Execute;
Var tbl:TADOTable;
begin
{ Place thread code here }
tbl:=TADOTable.Create(nil);
tbl.Connection:=STbl.Connection;
tbl.TableName:=STbl.TableName;
tbl.Open;
tbl.OnFilterRecord:=ADOTableFilterRecord;
tbl.Filtered:=true;
tbl.First;
//
if Pos(SearchString,STbl.FieldByName(FldName).AsStrin g)>0 then
tbl.RecNo:=STbl.RecNo
else
begin
tbl.RecNo:=STbl.RecNo;
while Pos(SearchString,tbl.FieldByName(FldName).AsString )=0 do
tbl.Next;
tbl.Prior;
end;
//
tbl.Next;
STbl.RecNo:=tbl.RecNo;
tbl.Close;
tbl.Free;
end;
procedure TMyThread.ADOTableFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept:=(Pos(SearchString,DataSet.FieldByName(FldN ame).AsString)>0);
end;
end.
این یونیت را در برنامه قرار دهید و به روش زیر از اون استفاده کنید:
Var T:TMyThread;
begin
T:=TMyThread.Create(true);
T.STbl:=ADOTable1;
T.FldName:='ID';
T.SearchString:=Edit1.Text;
t.Suspended:=false;
end;
البته این کد که نوشتم خیلی غیر حرفه ای هست و برای استفاده درست و حسابی باید با مبحث MultiThreding آشنایی داشته باشید اما خوب کار راه بیانداز هست دلیل استفاده از روش MultiThreding هم این هست که ممکنه بین رکوردی که الآن در ان هستید و رکورد بعدی که قرار است پیدا شود 5000 یا بیشتر فاصله باشه که با حلقه طول می کشه جست و جو کنه برای همین در صورت استفاده از روش معمولی برنامه تا پایان حلقه قفل می شه.اما با این روش نه قفل نمی شه.