在Table的OnFilterRecord事件上写上: procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet; var Accept: Boolean); function lpMatch(lpWildcard: PChar; szWildcard: integer; lpStr: PChar; szStr: integer): boolean; var i, j: integer; c: char; begin Result := True; if szWildcard = 0 then Exit; i := 0; while (i < szWildcard) and Result do begin c := UpCase(lpWildcard[i]); if c = '%' then begin Result := False; j := i; while not Result and (j <= szStr) do begin Result := lpMatch(@(lpWildcard[i + 1]), szWildcard - i - 1, @(lpStr[j]), szStr - j); Inc(j); end; Exit; end else if szStr <= 0 then Result := False else Result := (c = UpCase(lpStr[i])) or (c = '?'); Inc(i); end; if Result then Result := szWildcard = szStr; end;{*******************************************************} { } { Match } { } { match the wildcard with string } { } { Return true/ false } { } {*******************************************************} function Match(Wildcard, Str: string): Boolean; var i: Integer; lpWildcard, lpStr: array[0..255] of char; begin if AllTrim(Wildcard) = EmptyStr then Result := True else if Pos('..', Wildcard) <> 0 then begin i := Pos('..', Wildcard); Result := False; //Shun 02/01/2001 //if UpperCase(Str) >= UpperCase(Copy(Wildcard, 1, i - 1)) then if ECharUpperCase(Str) >= ECharUpperCase(Copy(Wildcard, 1, i - 1)) then begin if AllTrim(Copy(Wildcard, i + 2, Length(Wildcard))) = '' then Result := True else //Shun 02/01/2001 //Result := UpperCase(Str) <= UpperCase(Copy(Wildcard, i + 2, Length(Wildcard))); Result := ECharUpperCase(Str) <= ECharUpperCase(Copy(Wildcard, i + 2, Length(Wildcard))); end; end else begin StrPCopy(lpStr, Str); Result := False; repeat i := Pos('|', Wildcard); if i = 0 then StrPCopy(lpWildcard, Wildcard) else begin StrPCopy(lpWildcard, Copy(Wildcard, 1, i - 1)); Delete(Wildcard, 1, i); end; if StrLen(lpWildcard) <> 0 then Result := Result or lpMatch(lpWildcard, StrLen(lpWildcard), lpStr, StrLen(lpStr)); until i = 0; end; end; begin Accept := Match(edit1.Text, FieldByName('field1').AsString); end;
这道题并不简单,除非使用SQL。
To filter strings bases on partial comparisons, use an asterisk as a wildcard. For example:State = 'M*'
procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
function lpMatch(lpWildcard: PChar; szWildcard: integer; lpStr: PChar;
szStr: integer): boolean;
var
i, j: integer;
c: char;
begin
Result := True;
if szWildcard = 0 then Exit;
i := 0;
while (i < szWildcard) and Result do
begin
c := UpCase(lpWildcard[i]);
if c = '%' then
begin
Result := False;
j := i;
while not Result and (j <= szStr) do
begin
Result := lpMatch(@(lpWildcard[i + 1]), szWildcard - i - 1, @(lpStr[j]), szStr - j);
Inc(j);
end;
Exit;
end
else
if szStr <= 0 then Result := False
else
Result := (c = UpCase(lpStr[i])) or (c = '?');
Inc(i);
end;
if Result then Result := szWildcard = szStr;
end;{*******************************************************}
{ }
{ Match }
{ }
{ match the wildcard with string }
{ }
{ Return true/ false }
{ }
{*******************************************************}
function Match(Wildcard, Str: string): Boolean;
var
i: Integer;
lpWildcard, lpStr: array[0..255] of char;
begin
if AllTrim(Wildcard) = EmptyStr then Result := True
else
if Pos('..', Wildcard) <> 0 then
begin
i := Pos('..', Wildcard);
Result := False;
//Shun 02/01/2001
//if UpperCase(Str) >= UpperCase(Copy(Wildcard, 1, i - 1)) then
if ECharUpperCase(Str) >= ECharUpperCase(Copy(Wildcard, 1, i - 1)) then
begin
if AllTrim(Copy(Wildcard, i + 2, Length(Wildcard))) = '' then
Result := True
else
//Shun 02/01/2001
//Result := UpperCase(Str) <= UpperCase(Copy(Wildcard, i + 2, Length(Wildcard)));
Result := ECharUpperCase(Str) <= ECharUpperCase(Copy(Wildcard, i + 2, Length(Wildcard)));
end;
end
else
begin
StrPCopy(lpStr, Str);
Result := False;
repeat
i := Pos('|', Wildcard);
if i = 0 then StrPCopy(lpWildcard, Wildcard)
else
begin
StrPCopy(lpWildcard, Copy(Wildcard, 1, i - 1));
Delete(Wildcard, 1, i);
end;
if StrLen(lpWildcard) <> 0 then
Result := Result or lpMatch(lpWildcard, StrLen(lpWildcard), lpStr, StrLen(lpStr));
until i = 0;
end;
end;
begin
Accept := Match(edit1.Text, FieldByName('field1').AsString);
end;