本帖最后由 zhengyc653 于 2013-08-03 15:17:16 编辑

解决方案 »

  1.   

    这个查询对话框要cxGrid自带的,不是我们自己设计的啊
      

  2.   

    lz的需求, 只能改dev的代码实现like的匹配情况有: %国%   国%   %国
    你需求的[包含], 匹配情况只有: %国%
      

  3.   

    我也不知道要改Dev的代码,可跟踪来跟踪去,就是不知道要在哪改!
      

  4.   

    思路:
    应该在过滤窗体中找到确定这个按钮,然后更改生成出来的过滤字串。
    于是,找到 cxFilterControlDialog.pas  ,查看 OK 按钮的 OnClick 事件
    发现里面只有一条语句: 
    ApplyFilter;
    于是,再跟踪 ApplyFilter 函数,它的声明如下: 
    procedure ApplyFilter; virtual;procedure TfmFilterControlDialog.ApplyFilter;
    begin
      SetControlsEnabled(False);
      DoBeforeApply;
      try
        FilterControl.ApplyFilter;
      finally
        DoAfterApply;
        SetControlsEnabled(True);
      end;
    end;继续跟踪 DoBeforeApply ,发现其也是一个虚方法:procedure TfmFilterControlDialog.DoBeforeApply;
    begin
      if Assigned(FOnBeforeApply) then
        FOnBeforeApply(Self);
    end;又发现 FOnBeforeApply 的声明为:
    FOnBeforeApply: TNotifyEvent;
    到这,就不懂得如何往下跟踪了...  
      

  5.   

    filterControl.ApplyFilter;
    filterControl 这个对象在哪? 在这个单元好像没找到这个对象
    不知道是引引哪个单元的东东
      

  6.   

    1 把这个文件复制到你的程序目录
    \DevExpress VCL\ExpressDataController\Sources\cxFilter.pas2 TcxFilterCriteria.AddItem过程做如下修改:(自动给like, not like运算的查询条件加%)function TcxFilterCriteria.AddItem(AParent: TcxFilterCriteriaItemList; AItemLink: TObject;
      AOperatorKind: TcxFilterOperatorKind; const AValue: Variant;
      const ADisplayValue: string): TcxFilterCriteriaItem;
    begin
      if AParent = nil then
        AParent := Root;  if AOperatorKind in [foLike, foNotLike] then
        Result := AParent.AddItem(AItemLink, AOperatorKind, '%' + AValue + '%', ADisplayValue)
      else
        Result := AParent.AddItem(AItemLink, AOperatorKind, AValue, ADisplayValue);
    end;
      

  7.   


    之前的修改全部取消.一下改动完成后, 所有使用该文件做过滤的, like, not like 都会受影响
    -------------------------------------------------------
    把这个文件复制到你的程序目录
    \DevExpress VCL\ExpressDataController\Sources\cxLike.pasfunction LikeStr(const AStr, APatternStr: string; APercent, AUnderline: Char): Boolean;
    var
      vPatternStr : string;
    begin
      vPatternStr := Format('%%%s%%', [APatternStr]);
      Result := Like(PChar(AStr), Length(AStr), PChar(vPatternStr),
        Length(vPatternStr), APercent, AUnderline, #0);
    end;
      

  8.   

    非常感谢 simonhehe 的热心助助!!问题解决,分不多,全给你了。