table的filter好像不支持 like %aaa%的语法啊 有什么办法?现在不能换到query了请教用table实现的方法

解决方案 »

  1.   

    在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;
      

  2.   

    这道题并不简单,除非使用SQL。
      

  3.   

    To filter strings bases on partial comparisons, use an asterisk as a wildcard. For example:State = 'M*'