捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:金杰MIS工具 万能过滤/查询/网格编辑器
xinqing_114 33515 2008/3/31 16:41:17
好东西
kingjit 27477 2006/12/10 19:18:18
limin:
你说的没错,这个版本是有问题的
你可以到后面的有新版本发布的讨论区中,找到比较新的代码,解决了这个问题
limin 27472 2006/12/9 19:22:37
说实话,此控件的“万能查询”思路不错,但是基本不能用,前面的“并且”“或者”是个摆设,如果从第2行起用了“并且”的话,你会发现过滤出来的东西与你想像的完全不一样。如果你只打算用“或者”连接,此控件还可以,否则还是不要用了。
不过作者给了我们很好的思路,还是应该感谢。
ahq 22754 2006/4/8 17:06:47
运行出现错误!
[Fatal Error] ColEditor.dpr(10): File not found: 'EhLibADO.dcu'
怎么回事呀
lbren 20092 2005/12/17 16:54:21
这个不错时间显示有问题不知道改了没有改,2005-50-02
ahq 19572 2005/11/28 10:23:56
真是好东西,谢谢,收下了
kingjit 19531 2005/11/26 17:44:36
n看前做過一個printdbgrideh的控制器,回頭找找代碼!

girdedit 和 萬能篩選及保存界面,初顯成效,客戶的叫法和我們的不一樣,哈,在客戶那里改就可以了,真是他媽的方便!
guanbo 19530 2005/11/26 15:59:26
kingjit,你做过printdbgrideh的控制功能没??如果加上就更完美了...
chinasf 19462 2005/11/23 18:51:13
回kingjit得话,我不是谈心,你自己不是说过下面这样得话吗?我这是帮你提功能呢。

kingjit 19400  2005-11-22 16:44:59 
谢谢AAC,提出BUG并给出改正措施!回头我再测试一下!

不知道大家还想要什么样的功能呢?接下来该做.....

大家给些建议吧!
kingjit 19442 2005/11/23 14:14:07
  评 论 人:whoisi
  评论内容:
kingjit 加我QQ8361024
这个可以继续给扩展功能,把什么权限、菜单、表单等弄进来,做个什么框架,比较有意思,纯支持~~~

==========
奇怪,收到邮件,但是没有看到信息

CHINASF:
你好贪心喔,我把我的框架中的一些功能提取出来共享给大家,
你确要连我的框架一取拿出来,我二年的心血啊,不过也是不咋地哩!
whoisi 19439 2005/11/23 11:54:19
kingjit 加我QQ8361024
这个可以继续给扩展功能,把什么权限、菜单、表单等弄进来,做个什么框架,比较有意思,纯支持~~~
kingjit 19424 2005/11/23 8:53:49
保存到数据库的功能,建议使用EHLIB的另一个控件:
PropStorageEh
用它再搭配STREAM可以实现存储到数据库中!
它将在我的1.5版本中实现,
1.4版本增加了一点点小功能,:1.等待窗口,2.栏位尺寸自动大小
今天就发,谢谢大伙的关注
gyh75 19416 2005/11/23 1:29:30
http://2ccc.com/article.asp?articleid=359
这个版本,可以借鉴一下。

希望加上保存修改后的表格 格式的功能。
whoisi 19415 2005/11/22 23:38:28
如果把字段的设置保存到数据表里怎样写SaveData呢,(想把列宽也加进去)
aac 19409 2005/11/22 21:19:51
kingjit:
关于通用:在我上面再稍作修改即可以适应只设置dataset,或者只设置Grid,另外,我的程序一般都只设置显示的Title,不设置Dataset的DisplayLable。改为Grid过滤其中有一方面原因是不显示的字段是不能让用户去过滤的,所以我改成这样。

关于浮点出错:是因为用Double作为返回值的小数位太多,转换的时候出现微小误差造成的。

关于空字段跳过:
找到“//填充值到cbValue中了”下面一句改为:
          Svalue:= Trim( TField(cbFields.Items.Objects[cbFields.ItemIndex]).AsString );
          if  (cbValue.Items.IndexOf(Svalue) = -1) and not (Svalue=EmptyStr) then
          cbValue.Items.Add(Svalue);
数据导出功能:dbgrideh内置的。
chinasf 19406 2005/11/22 18:56:18
再增加一个数据导出得功能吧,就缺这个了。
kingjit 19404 2005/11/22 17:13:59
确实是有这样的错误,过滤不到正确的数据!
而且如果字段是空值,也是会有问题,插入的可选值都是空值
我觉得改成:
ftFloat, ftCurrency, ftBCD, ftBytes, ftVarBytes:
       begin Result := round((Field.AsFloat - StrToFloatDef(Value,0))*100)/100;  
会好些,然后再改一下插入待选值的功能,让字段为空则跳过!
kingjit 19403 2005/11/22 17:01:51
ACC:
但是我是想做到通用性,因为过滤不仅仅是跟GRID打交道!
而且你改了DATASET.Field.DisplayLable后,GRID的TITLE是跟着改变的!

关于浮点数出错的问题,我看了你给的答案,觉得很奇怪
能不能给出出错提示及原因呢?
aac 19402 2005/11/22 16:56:45
调用方式也改为: if ActiveControl is TDBGridEh then
    ShowFilterForm(TDBGridEh(ActiveControl));
aac 19401 2005/11/22 16:50:37
修改版:(直接从dbgrideh取中文标题栏,因为一般情况下过滤是给表格用的)
在面页增加了一个combobox控件,取名cbFieldsTitle,覆盖原cbfields控件.修改源码如下(只做了最简单实现方式修改):
unit uKingFilter;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, StdCtrls, DB, ExtCtrls, ComCtrls,DBGridEh;

type

  {
    '等于;不等于;大于;大于或等于;小于;小于或等于;始于;并非起始于;' +
    '止于;并非结束于;包含;不包含';
  }

  TFilterLogical = (flAnd, flOr);

  TFilterCondition = (fcEqual, fcNotEqual, fcGreat, fcGreatEqual,
    fcLess, fcLessEqual, fcBeginWith, fcNotBeginWith, fcEndWith, fcNotEndWith,
    fcContain, fcNotContain);

  { Forward declare }

  TKingFilterDialog = class;

  { TKingFilterForm }

  TKingFilter = class(TForm)
    gbFilterConditions: TGroupBox;
    lbFilter: TListBox;
    gbDefineCondition: TGroupBox;
    cbFields: TComboBox;
    Label1: TLabel;
    cbConditions: TComboBox;
    Label2: TLabel;
    Label3: TLabel;
    GroupBox1: TGroupBox;
    btNew: TSpeedButton;
    btDel: TSpeedButton;
    btOk: TSpeedButton;
    btCancel: TSpeedButton;
    btClear: TSpeedButton;
    Panel1: TPanel;
    btReplace: TSpeedButton;
    cbLink: TComboBox;
    cbValue: TComboBox;
    cbFieldsTitle: TComboBox;
    procedure lbFilterDrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure lbFilterDblClick(Sender: TObject);
    procedure edtValueChange(Sender: TObject);
    procedure cbFieldsChange(Sender: TObject);
    procedure btNewClick(Sender: TObject);
    procedure btDelClick(Sender: TObject);
    procedure btOkClick(Sender: TObject);
    procedure btCancelClick(Sender: TObject);
    procedure btClearClick(Sender: TObject);
    procedure btReplaceClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure cbFieldsTitleChange(Sender: TObject);
  private
    { Private declarations }
    FFilterDialog: TKingFilterDialog;
  public
    DataSet: TDataSet;
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  end;

  { TKingFilterDialog }

  TKingFilterDialogOption = (dfdOnlyBuildFilter);
  TKingFilterDialogOptions = set of TKingFilterDialogOption;

  //  TFilterStrings = class(TStrings)

  TKingFilterDialog = class(TComponent)
  private
    FFilterStrings: TStrings;
    FFilterFields: string;
    //    FFieldTypes: array of TFieldType;
    FDataSet: TDataSet;
    FDbGrid: TDBGridEh;
    FConditions: TStrings;
    FTitle: string;
    FSaveOnFilterRecord: TFilterRecordEvent;
    FSaveFiltered: Boolean;
    FPreFiltered: Boolean;
    FOptions: TKingFilterDialogOptions;
    //    function GetDataSet: TDataSet;
    function GetFilterFields: string;
    procedure SetTitle(const Value: string);
    procedure SetDataSet(Value: TDataSet);
    procedure SetDbGrid(Value: TDBGridEh);
    procedure SetFilterFields(const Value: string);
    function CanUseFilterCondition(Field: TField; FilterCondition:
      TFilterCondition): Boolean;
    procedure FilterStringsChange(Sender: TObject);
  protected
    //    procedure InitFieldTypes;
    procedure DataSetFilterRecord(DataSet: TDataSet; var Accept: Boolean);
      virtual;
    //    property DataSet: TDataSet read GetDataSet;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function Execute: Boolean;
    function GetFilter: string; virtual;
    procedure GetFilterDescriptions(List: TStrings);
    property FilterStrings: TStrings read FFilterStrings;
  published
    property DBGrid: TDBGridEh read FDbGrid write SetDbGrid;
    property DataSet: TDataSet read FDataSet write SetDataSet;
    property FilterFields: string read GetFilterFields write SetFilterFields;
    property Title: string read FTitle write SetTitle;
    property Options: TKingFilterDialogOptions read FOptions write FOptions;
  end;

procedure ShowFilterForm(Grid1: TDBGridEh);

var
  SaveTempFilterStr: TStringList; //保存临时的各个DATASETFILTER的记录

implementation

uses StrUtils;

{$R *.DFM}

function ExtractSubStr(const Str: string; var Pos: Integer; Delimiter: Char =
  ';'): string;
var
  I: Integer;
begin
  I := Pos;
  while (I <= Length(Str)) and (Str[I] <> Delimiter) do
    Inc(I);
  Result := Copy(Str, Pos, I - Pos);
  if (I <= Length(Str)) and (Str[I] = Delimiter) then
    Inc(I);
  Pos := I;
end;

function IndexOfFieldName(const Fields: string; Index: Integer): string;
var
  I, J, Pos: Integer;
begin
  Pos := 1;
  I := Pos;
  J := -1;
  while I <= Length(Fields) do
  begin
    if Fields[I] = ';' then
    begin
      Inc(J);
      if (J = Index) or (Index = -1) then
        Break;
      Pos := I + 1;
    end;
    Inc(I);
  end;
  Result := Trim(Copy(Fields, Pos, I - Pos));
  //  if (I <= Length(Fields)) and (Fields[I] = ';') then Inc(I);
end;

procedure ShowFilterForm(Grid1: TDBGridEh);
var
  kFilter: TKingFilterDialog;
begin
  kFilter := TKingFilterDialog.Create(nil);
  try
    kFilter.DataSet := Grid1.DataSource.DataSet;
    kFilter.DBGrid := Grid1;
    kFilter.Execute;
  finally
    FreeAndNil(kFilter);
  end;
end;

{ TKingFilterForm }

constructor TKingFilter.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  if AOwner is TKingFilterDialog then
    FFilterDialog := AOwner as TKingFilterDialog;
end;

procedure TKingFilter.lbFilterDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
const
  Offset = 2;
var
  I: Integer;
  S, Temp: string;
begin
  with (Control as TListBox) do
  begin
    Temp := Items[Index];
    I := 1;
    if Index <> 0 then
    begin
      if ExtractSubStr(Temp, I, ';') = '0' then
        S := '并且'
      else
        S := '或者';
    end
    else
      ExtractSubStr(Temp, I);
    //取得字段的DisplayLabel
    S := S + ' ' + DataSet.FieldByName(ExtractSubStr(Temp, I)).DisplayLabel;
    //    S := S + ' ' + TField(Items.Objects[Index]).DisplayLabel;
        //[StrToInt(ExtractSubStr(Temp, I))];
    S := S + ' ' + cbConditions.Items[StrToInt(ExtractSubStr(Temp, I))];
    S := S + ' ' + ExtractSubStr(Temp, I) + ' ;';
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left + Offset, Rect.Top, S);
  end;
end;

procedure TKingFilter.lbFilterDblClick(Sender: TObject);
var
  I: Integer;
  Temp: string;
begin
  Temp := lbFilter.Items[lbFilter.ItemIndex];
  I := 1;
  cbLink.ItemIndex := StrTointdef(ExtractSubStr(Temp, I), 0); //连接符,and=0 or 1

  cbFields.ItemIndex :=
    cbFields.Items.IndexOfObject(DataSet.FieldByName(ExtractSubStr(Temp, I)));
  // cbFields.ItemIndex :=
  //   cbFields.Items.IndexOfObject(lbFilter.Items.Objects[lbFilter.ItemIndex]);
   // StrToInt(ExtractSubStr(Temp, I));
  cbFields.OnChange(cbFields);
  cbConditions.ItemIndex := cbConditions.Items.IndexOfObject(
    TObject(StrToInt(ExtractSubStr(Temp, I))));
  //  case nbValue.PageIndex of
  //    0: edtValue.Text := ExtractSubStr(Temp, I);
  //    1: cbValue.ItemIndex := cbValue.Items.IndexOf(ExtractSubStr(Temp, I));
  //    2: dtpDate.Date := StrToDateTime(ExtractSubStr(Temp, I));
  //  end;
  cbValue.Text := ExtractSubStr(Temp, I);
  //wzm addd
  for i:=0 to  FFilterDialog.DBGrid.Columns.Count-1 do
  begin
    if FFilterDialog.DBGrid.Columns[i].FieldName=cbFields.Text then
       cbFieldsTitle.ItemIndex:=i;
  end;

end;

procedure TKingFilter.edtValueChange(Sender: TObject);
begin
  //  btnAddToList.Enabled := TEdit(Sender).Text <> '';
end;

procedure TKingFilter.cbFieldsChange(Sender: TObject);
const
  maxtime = 500; //如果500毫秒内还未完成填充动作,则就不再填充
var
  I: Integer;
  d: DWORD;
  bm,Svalue: string;
begin
  //设置条件项目
  cbConditions.Clear;
  for I := 0 to FFilterDialog.FConditions.Count - 1 do
    if
      FFilterDialog.CanUseFilterCondition(TField(cbFields.Items.Objects[cbFields.ItemIndex]),
      TFilterCondition(FFilterDialog.FConditions.Objects[I])) then
      cbConditions.Items.AddObject(FFilterDialog.FConditions[I],
        FFilterDialog.FConditions.Objects[I]);
  cbConditions.Enabled := cbConditions.Items.Count > 0;
  if cbConditions.Enabled then
    cbConditions.ItemIndex := 0;
  //设置可供选择的项目
//  if not showing then
//    exit;
  d := GetTickCount;
  cbValue.Clear;
  bm := DataSet.Bookmark;
  DataSet.Filtered := False;
  DataSet.DisableControls;
  try
    try
      with DataSet do
      begin
        First;
        while not Eof do
        begin
          //填充值到cbValue中了
          Svalue:= Trim( TField(cbFields.Items.Objects[cbFields.ItemIndex]).AsString );
          if
          cbValue.Items.IndexOf(Svalue) = -1 then
          cbValue.Items.Add(Svalue);
          if (GetTickCount - d) >= maxtime then
          Break; //如果时间到了,则退出不执行了
          Next;
        end;
      end;
      //      Caption:=IntToStr(cbValue.Items.Count);
      DataSet.Bookmark := bm;
    except
    end;
  finally
    DataSet.EnableControls;
  end;

  //  case TField(cbFields.Items.Objects[cbFields.ItemIndex]).DataType of
  //    ftBoolean: nbValue.PageIndex := 1;
  //    ftDate, ftDateTime: nbValue.PageIndex := 2;
  //    ftString, ftWideString, ftFixedChar, ftMemo, ftFmtMemo:
  //      cbConditions.ItemIndex :=
  //        cbConditions.Items.IndexOfObject(TObject(fcContain));
  //  else
  //    nbValue.PageIndex := 0;
  //  end;
end;

{ TKingFilterDialog }

constructor TKingFilterDialog.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FConditions := TStringList.Create;
  with FConditions do
  begin
    AddObject('等于', TObject(fcEqual));
    AddObject('不等于', TObject(fcNotEqual));
    AddObject('大于', TObject(fcGreat));
    AddObject('大于或等于', TObject(fcGreatEqual));
    AddObject('小于', TObject(fcLess));
    AddObject('小于或等于', TObject(fcLessEqual));
    AddObject('始于', TObject(fcBeginWith));
    AddObject('并非起始于', TObject(fcNotBeginWith));
    AddObject('止于', TObject(fcEndWith));
    AddObject('并非结束于', TObject(fcNotEndWith));
    AddObject('包含', TObject(fcContain));
    AddObject('不包含', TObject(fcNotContain));
  end;
  FTitle := '智能筛选';
  FFilterStrings := TStringList.Create;
  TStringList(FFilterStrings).OnChange := FilterStringsChange;
end;

destructor TKingFilterDialog.Destroy;
begin
  FConditions.Free;
  FFilterStrings.Free;
  FDataSet := nil;
  inherited;
end;

function TKingFilterDialog.CanUseFilterCondition(Field: TField;
  FilterCondition: TFilterCondition): Boolean;
begin
  case Field.DataType of
    ftUnknown, ftString, ftFixedChar, ftWideString, ftMemo, ftVariant, ftBlob,
      ftFmtMemo:
      Result := True;
    ftSmallint, ftInteger, ftWord, ftFloat, ftCurrency, ftBCD, ftBytes,
      ftVarBytes, ftAutoInc, ftLargeint:
      Result := FilterCondition in [fcEqual, fcNotEqual, fcGreat, fcGreatEqual,
        fcLess, fcLessEqual];
    ftBoolean: Result := FilterCondition in [fcEqual, fcNotEqual];
    ftDate, ftTime, ftDateTime:
      Result := FilterCondition in [fcEqual, fcNotEqual, fcGreat, fcGreatEqual,
        fcLess, fcLessEqual];
    {ftGraphic, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftADT
    ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, ftInterface,
    ftIDispatch, ftGuid}
  else
    Result := False;
  end;
end;

procedure TKingFilterDialog.DataSetFilterRecord(DataSet: TDataSet; var Accept:
  Boolean);

  function CompareFieldValue(Field: TField; Value: string): Single;
  begin
    case Field.DataType of
      //      ftUnknown, ftString, ftFixedChar, ftWideString, ftMemo, ftVariant, ftBlob,
      //      ftFmtMemo:
      //        Result := True;
      ftSmallint, ftInteger, ftWord, ftAutoInc, ftLargeint:
        Result := Field.AsInteger - StrToInt(Value);
      ftFloat, ftCurrency, ftBCD, ftBytes, ftVarBytes:
       begin Result := round((Field.AsFloat - StrToFloat(Value))*100)/100;  
       end;
      //        Result := FilterCondition in [fcEqual, fcNotEqual, fcGreat, fcGreatEqual,
      //          fcLess, fcLessEqual];
      ftBoolean: if Field.AsBoolean and (Value = '是') or
        (not Field.AsBoolean and (Value = '否')) then
          Result := 0
        else
          Result := 1; //FilterCondition in [fcEqual, fcNotEqual];
      ftDate: Result := Trunc(Field.AsDateTime) - StrToDate(Value);
      ftDateTime: Result := Field.AsDateTime - StrToDateTime(Value);
      ftTime: Result := Frac(Field.AsDateTime) - StrToTime(Value);
      //        Result := FilterCondition in [fcEqual, fcNotEqual, fcGreat, fcGreatEqual,
      //          fcLess, fcLessEqual];
          {ftGraphic, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftADT
          ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, ftInterface,
          ftIDispatch, ftGuid}
    else
      Result := AnsiCompareStr(Trim(Field.DisplayText), Value);
    end;
  end;

var
  I, APos: Integer;
  Condition: TFilterCondition;
  FieldName, Value, Temp: string;
  e: TFilterRecordEvent;
  s: string; //用来存放Dataset的全局命称,如Form1.Dataset1
begin
  //这个函数就厉害了,它是用数据集的onfilter事件做过滤的,而且还能保存其原有的过滤代码
  Accept := True;
  //  if Accept = False then ShowMessage('Accept');
//如果用户已经指定了数据集的过滤事件,则先调用

//if Assigned(FSaveOnFilterRecord) then
//  FSaveOnFilterRecord(DataSet, Accept);
  s := DataSet.Owner.Name + '.' + DataSet.Name;
  s := s + '=' + SaveTempFilterStr.Values[s];
  TMethod(e).Code := SaveTempFilterStr.Objects[SaveTempFilterStr.IndexOf(s)];
  if Assigned(E) then
  begin
    e(DataSet, Accept);
  end;

  if Accept then
    for I := 0 to SaveTempFilterStr.Count - 1 do
    begin
      Temp := SaveTempFilterStr.Values[DataSet.Owner.Name + '.' + DataSet.Name];
      //      ShowMessage(Temp);

      APos := 1;
      if I <> 0 then
      begin
        if ExtractSubStr(Temp, APos, ';') = '0' then // Logic AND
        begin
          if not Accept then
          Break
        end
        else if Accept then
          Break;
      end
      else
        ExtractSubStr(Temp, APos, ';');
      // FieldName := TField(FFilterStrings.Objects[I]).FieldName;
      FieldName := ExtractSubStr(Temp, APos, ';');
      //ExtractFieldName(Temp, APos);//IndexOfFieldName(FFilterFields, StrToInt(ExtractFieldName(Temp, APos)));
      Condition := TFilterCondition(StrToInt(ExtractSubStr(Temp, APos, ';')));
      Value := ExtractSubStr(Temp, APos, ';');
      //      if DataSet.FieldByName(FieldName).DataType in [ftDate, ftDateTime] then
      //        Value := DateToStr(StrToDate(Value));
      case Condition of
        fcEqual: Accept := CompareFieldValue(DataSet.FieldByName(FieldName),
          Value) = 0;
        fcNotEqual: Accept := CompareFieldValue(DataSet.FieldByName(FieldName),
          Value) <> 0;
        fcGreat: Accept := CompareFieldValue(DataSet.FieldByName(FieldName),
          Value) > 0;
        fcGreatEqual: Accept :=
          CompareFieldValue(DataSet.FieldByName(FieldName), Value) >= 0;
        fcLess: Accept := CompareFieldValue(DataSet.FieldByName(FieldName),
          Value) < 0;
        fcLessEqual: Accept := CompareFieldValue(DataSet.FieldByName(FieldName),
          Value) <= 0;
        fcBeginWith: Accept := LeftStr(DataSet.FieldByName(FieldName).AsString,
          Length(Value)) = Value;
        fcNotBeginWith: Accept :=
          LeftStr(DataSet.FieldByName(FieldName).AsString, Length(Value)) <>
          Value;
        fcEndWith: Accept := RightStr(DataSet.FieldByName(FieldName).AsString,
          Length(Value)) = Value;
        fcNotEndWith: Accept :=
          RightStr(DataSet.FieldByName(FieldName).AsString, Length(Value)) <>
          Value;
        fcContain: Accept := AnsiPos(Value,
          DataSet.FieldByName(FieldName).AsString) > 0;
        fcNotContain: Accept := AnsiPos(Value,
          DataSet.FieldByName(FieldName).AsString) = 0;
      end;
          // ShowMessage(DataSet.FieldByName(FieldName).AsString + ' - ' + Value + ' = ' +
          //   FloatToStr(CompareFieldValue(DataSet.FieldByName(FieldName), Value)));
    end;
end;

//function TKingFilterDialog.GetDataSet: TDataSet;
//begin
//  if Assigned(FDataSource) then Result := FDataSource.DataSet
//  else Result := nil;
//end;

function TKingFilterDialog.GetFilter;

  function ValueToFilterText(const FieldName, Value: string): string;
  begin
    if Assigned(DataSet) then
      case DataSet.FieldByName(FieldName).DataType of
        ftSmallint, ftInteger, ftWord, ftAutoInc: Result := Value;
        ftFloat, ftCurrency, ftBCD, ftVarBytes, ftBytes, ftTypedBinary: Result
          := Value;
        //       ftDate, ftTime, ftDateTime:
        ftBoolean:
          if Value = '是' then
          Result := 'True'
          else
          Result := 'False';
      else
        Result := '''' + Value + '''';
      end
    else
      Result := Value;
  end;

var
  Temp, FieldName: string;
  I, Pos: Integer;
begin
  Result := '';
  for I := 0 to FFilterStrings.Count - 1 do
  begin
    Temp := FFilterStrings[I];
    Pos := 1;
    if I <> 0 then
    begin
      if ExtractSubStr(Temp, Pos, ';') = '0' then
        Result := Result + ' AND '
      else
        Result := Result + ' OR ';
    end
    else
      ExtractSubStr(Temp, Pos, ';');
    FieldName := TField(FFilterStrings.Objects[I]).FieldName;
    //ExtractFieldName(Temp, APos);//IndexOfFieldName(FFilterFields, StrToInt(ExtractFieldName(Temp, APos)));

  //    FieldName := ExtractSubStr(Temp, Pos, ';');//IndexOfFieldName(FFilterFields, StrToInt(ExtractSubStr(Temp, Pos, ';')));
  //    Result := Result + FieldName;
    case TFilterCondition(StrToInt(ExtractSubStr(Temp, Pos, ';'))) of
      fcEqual: Result := Result + FieldName + ' = ' +
        ValueToFilterText(FieldName, ExtractSubStr(Temp, Pos, ';'));
      fcNotEqual: Result := Result + FieldName + ' <> ' +
        ValueToFilterText(FieldName, ExtractSubStr(Temp, Pos, ';'));
      fcGreat: Result := Result + FieldName + ' >' +
        ValueToFilterText(FieldName, ExtractSubStr(Temp, Pos, ';'));
      fcGreatEqual: Result := Result + FieldName + ' >= ' +
        ValueToFilterText(FieldName, ExtractSubStr(Temp, Pos, ';'));
      fcLess: Result := Result + FieldName + ' < ' +
        ValueToFilterText(FieldName, ExtractSubStr(Temp, Pos, ';'));
      fcLessEqual: Result := Result + FieldName + ' <= ' +
        ValueToFilterText(FieldName, ExtractSubStr(Temp, Pos, ';'));
      fcBeginWith: Result := Result + FieldName + ' LIKE ''' +
        ExtractSubStr(Temp, Pos, ';') + '%''';
      fcNotBeginWith: Result := Result + ' NOT ' + FieldName + ' LIKE ''' +
        ExtractSubStr(Temp, Pos, ';') + '%''';
      fcEndWith: Result := Result + FieldName + ' LIKE ''%' +
        ExtractSubStr(Temp, Pos, ';') + '''';
      fcNotEndWith: Result := Result + ' NOT ' + FieldName + ' LIKE ''%' +
        ExtractSubStr(Temp, Pos, ';') + '''';
      fcContain: Result := Result + FieldName + ' LIKE ''%' +
        ExtractSubStr(Temp, Pos, ';') + '%''';
      fcNotContain: Result := Result + ' NOT ' + FieldName + 'LIKE ''%' +
        ExtractSubStr(Temp, Pos, ';') + '%''';
    end;
  end;
  Result := Trim(Result);
end;

procedure TKingFilterDialog.GetFilterDescriptions(List: TStrings);
var
  I, Pos: Integer;
  S, Temp: string;
begin
  List.Clear;
  for I := 0 to FFilterStrings.Count - 1 do
  begin
    Temp := FFilterStrings[I];
    Pos := 1;
    if I <> 0 then
    begin
      if ExtractSubStr(Temp, Pos) = '0' then
        S := '与'
      else
        S := '或';
    end
    else
      ExtractSubStr(Temp, Pos);
    S := S + ' ' + IndexOfFieldName(FilterFields, StrToInt(ExtractSubStr(Temp,
      Pos)));
    S := S + ' ' + FConditions[StrToInt(ExtractSubStr(Temp, Pos))];
    S := S + ' ' + ExtractSubStr(Temp, Pos) + ' 。';
    List.Add(S);
  end;
end;

function TKingFilterDialog.GetFilterFields: string;
begin
  Result := FFilterFields;
  //  Result := StringReplace(FFilterFields.CommaText, ',', ';', rfReplaceAll);
end;

procedure TKingFilterDialog.SetFilterFields(const Value: string);
begin
  if FFilterFields <> Value then
  begin
    FFilterFields := Value;
    //    InitFieldTypes;
  end;
end;

{procedure TKingFilterDialog.InitFieldTypes;
var
  Pos: Integer;
  FieldName: string;
begin
  if Assigned(DataSet) then
  begin
    SetLength(FFieldTypes, 0);
    Pos := 1;
    FieldName := ExtractFieldName(FFilterFields, Pos);
    while FieldName <> '' do
    begin
      SetLength(FFieldTypes, Length(FFieldTypes) + 1);
      FFieldTypes[High(FFieldTypes)] := DataSet.FieldByName(FieldName).DataType;
      FieldName := ExtractFieldName(FFilterFields, Pos);
    end;
  end;
end;
}

procedure TKingFilterDialog.SetTitle(const Value: string);
begin
  if FTitle <> Value then
  begin
    FTitle := Value;
  end;
end;

procedure TKingFilterDialog.SetDataSet(Value: TDataSet);
begin
  if FDataSet <> Value then
  begin
    if Assigned(DataSet) then
    begin
      DataSet.OnFilterRecord := FSaveOnFilterRecord;
      DataSet.Filtered := FSaveFiltered;
    end;
    FDataSet := Value;
    if Assigned(DataSet) then
    begin
      FSaveOnFilterRecord := DataSet.OnFilterRecord;
      FSaveFiltered := DataSet.Filtered;
      DataSet.OnFilterRecord := DataSetFilterRecord;
    end;
  end;
end;

procedure TKingFilterDialog.SetDbGrid(Value: TDBGridEh);
begin
  if FDbGrid <> Value then
  begin
    FDbGrid := Value;
  end;
end;

function TKingFilterDialog.Execute;
var
  FilterForm: TKingFilter;

  procedure FillFieldsComboBox;
  var
    I: Integer;
    //    FieldName: string;
    AFields: TList;
  begin
    //    I := 1;
    //    FieldName := ExtractFieldName(FFilterFields, I);
    if Assigned(DataSet) then
    begin
      AFields := TList.Create;
      try
        with DataSet do
        begin
          if FFilterFields = '' then //如果没有设置过滤字段时,默认是所有字段
          for i := 0 to FieldCount - 1 do
          begin
          if Fields[i].Visible then
          AFields.Add(Fields[i]);
          end
          else
          GetFieldList(AFields, FFilterFields);
          for I := 0 to Fields.Count - 1 do
          if AFields.IndexOf(Fields[I]) >= 0 then
          FilterForm.cbFields.Items.AddObject(Fields[I].DisplayLabel,Fields[I]);
          //wzm add
          for i := 0 to DBGrid.Columns.Count - 1 do
          begin
          if DBGrid.Columns[i].Visible = true then
          begin
          FilterForm.cbFieldsTitle.Items.AddObject(DBGrid.Columns[i].Title.Caption,DBGrid.Columns[i]);
          end;
          end;
          FilterForm.cbFieldsTitle.ItemIndex:=0;
        end;
      finally
        AFields.Free;
      end;
    end;

    //      while FieldName <> '' do
    //      begin
    //        FilterForm.cbFields.Items.Add(FDataSource.DataSet.FieldByName(FieldName).DisplayLabel);
    //        FieldName := ExtractFieldName(FFilterFields, I);
    //      end
    //    else
    //      while FieldName <> '' do
    //      begin
    //        FilterForm.cbFields.Items.Add(FieldName);
    //        FieldName := ExtractFieldName(FFilterFields, I);
    //      end
  end;

begin
  Result := False;
  if not Assigned(FDataSet) then
    raise Exception.Create('未设置数据集!');
  FilterForm := TKingFilter.Create(Self);
  with FilterForm do
  try
    Caption := FTitle;
    DataSet := FDataSet;
    FillFieldsComboBox;
    cbConditions.Items.Assign(FConditions);
    //.Items.CommaText := StringReplace(FConditions, ';', ',', [rfReplaceAll]);
//    lbFilter.Items.Assign(FFilterStrings);
    lbFilter.Items.Text := SaveTempFilterStr.Values[DataSet.Owner.Name + '.'
      + DataSet.Name];
    cbConditions.ItemIndex := 0;
    if cbFields.Items.Count > 0 then
    begin
      cbFields.ItemIndex := 0;
      cbFields.OnChange(cbFields);
    end;
    if ShowModal = mrOK then
    begin
        SaveTempFilterStr.Values[DataSet.Owner.Name + '.' + DataSet.Name] :=
          lbFilter.Items.Text;
      if lbFilter.Items.Count > 0 then
      begin
        SaveTempFilterStr.Objects[SaveTempFilterStr.IndexOf(DataSet.Owner.Name +
          '.' + DataSet.Name + '=' + lbFilter.Items.Text)];
        FFilterStrings.Assign(lbFilter.Items);
      end;
      Result := True;
    end;
  finally
    Free;
  end;
end;

procedure TKingFilterDialog.FilterStringsChange(Sender: TObject);
var
  DataSetFiltered: Boolean;
begin
  if not (dfdOnlyBuildFilter in FOptions) and Assigned(DataSet) then
  begin
    DataSetFiltered := DataSet.Filtered;
    DataSet.Filtered := False;
    if (FFilterStrings.Count > 0) or (DataSetFiltered and not FPreFiltered) then
      DataSet.Filtered := True;
    if DataSetFiltered and not FPreFiltered and not FSaveFiltered then
      FSaveFiltered := True;
    FPreFiltered := DataSet.Filtered;
  end;
end;

procedure TKingFilter.btNewClick(Sender: TObject);
var
  S: string;
begin
  S := IntToStr(cbLink.ItemIndex) + ';';
  //  S := S + TField(cbFields.Items.Objects[cbFields.ItemIndex]).FieldName{IntToStr(cbFields.ItemIndex)} + ';' +
  //    IntToStr(Integer(cbConditions.Items.Objects[cbConditions.ItemIndex])) + ';';
  s := s + TField(cbFields.Items.Objects[cbFields.ItemIndex]).FieldName + ';';
  S := S + IntToStr(Integer(cbConditions.Items.Objects[cbConditions.ItemIndex]))
    + ';';
  //  case nbValue.PageIndex of
  //    0: S := S + edtValue.Text;
  //    1: S := S + cbValue.Text;
  //    2: S := S + DateToStr(dtpDate.Date);
  //  end;
  s := s + cbValue.Text + ';';
  //    + edtValue.Text;
  //lbFilter.Items.AddObject(S, cbFields.Items.Objects[cbFields.ItemIndex]);
  lbFilter.Items.Add(S);
  lbFilter.ItemIndex := lbFilter.Items.Count - 1;
  //  lbFilter.Items.AddObject(cbFields.Text + ' ' + cbConditions.Text + ' ' +
  //    edtValue.Text, TObject(Ord(rbAnd.Checked)));
end;

procedure TKingFilter.btDelClick(Sender: TObject);
begin
  lbFilter.Items.Delete(lbFilter.ItemIndex);
  lbFilter.ItemIndex := lbFilter.Items.Count - 1;
end;

procedure TKingFilter.btOkClick(Sender: TObject);
begin
  if (lbFilter.Count = 0) and (MessageDlg('是否将定义的条件添加至列表?',
    mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
    btNew.Click;
  ModalResult := mrOK;
end;

procedure TKingFilter.btCancelClick(Sender: TObject);
begin
  ModalResult := mrCancel;
end;

procedure TKingFilter.btClearClick(Sender: TObject);
begin
  lbFilter.Clear;
end;

procedure TKingFilter.btReplaceClick(Sender: TObject);
begin
  btDel.Click;
  btNew.Click;
end;

procedure TKingFilter.FormActivate(Sender: TObject);
begin
  //  cbFieldsChange(cbFields);
end;

//wzm add
procedure TKingFilter.cbFieldsTitleChange(Sender: TObject);
begin
cbFields.ItemIndex:=cbFields.Items.IndexOf(
     FFilterDialog.DBGrid.Columns[cbFieldsTitle.ItemIndex].FieldName);
cbFieldsChange(nil);
end;

initialization
  SaveTempFilterStr := TStringList.Create;
finalization
  FreeAndNil(SaveTempFilterStr);

end.
第一页 上一页 下一页 最后页 有 31 条纪录 共2页 1 - 20
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表