捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:MIS工具 v1.4 (网格编辑+万能过滤/查询+最佳网格宽度)
kingjit 22018 2006/3/10 10:29:22
征求一下意见:
如果有1.5版,您想要些什么???

请积极发言喔!
eastasp 22010 2006/3/9 23:49:36
希望能够继续努力,早日看到1.5
txwhz 21703 2006/2/22 19:42:36
看到 最后好象 有1.5版了啦 贪心一点老大是不是可以
txwhz@163.com来一份 真心感谢
txwhz 21702 2006/2/22 19:38:44
刚下好 还没装 但愿没问题  
谢谢 
支持。。
学习中。。。。。。。
kingjit 20831 2006/1/10 18:07:58
兄弟們,我也想啊,但是沒有時間啊!里面通不過的代碼就注釋掉,不能用的函數就刪除,如cs函數,我是做簡繁轉換用的,ku沒有,也不要緊的,刪除它即可!

這次真的是可以用了,只不過聽說過濾float字段會有問題,我還沒有測試出來!

不要總是期望別人幫你做好啊,東西都在那了,自已挑挑揀揀就有好東東了!而且還包含了把條件保存到數據庫的功能,看一看就會明白的了!


有問題就發郵件給我

相信你馬上就會在你的系統中使用了!

對了,好象還加了對輸入的值的類型的判斷,以防止輸入 2005-50-32 這樣的值了
wflkxj 20821 2006/1/10 13:44:33
老大,没有办法和原来的一起用,如果方便的话能否发给我一份。我的邮箱是wflkxj@tom.com .我已经研究你的源码2个多星期了还是不知怎么弄。
万分感谢
hoohooliu 20820 2006/1/10 13:41:09
感谢kingjit,不过,我想您发一些完整的包上来比较好吧,ku.dcu没找到,运行不了您的东东...
我能有您的程序吗?非常感谢!hoo_hoo@263.net
wflkxj 20819 2006/1/10 13:27:23
感谢 kingjit 这种精神
你说的问题我发现了,研究源码也没找到原因。
谢谢分享
kingjit 20785 2006/1/9 21:39:13
我的系统中用的过滤原代码,解决BOOLEAN型字段及多条件过滤失效问题!
并且我是加入了保存过滤的代码到数据库的功能,请自行研究吧,我就不另外发布了
unit uKingFilter;

interface

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

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)
    gbDefineCondition: TGroupBox;
    cbFields: TComboBox;
    Label1: TLabel;
    cbConditions: TComboBox;
    Label2: TLabel;
    Label3: TLabel;
    cbLink: TComboBox;
    cbValue: TComboBox;
    GroupBox1: TGroupBox;
    btNew: TSpeedButton;
    btDel: TSpeedButton;
    btOk: TSpeedButton;
    btCancel: TSpeedButton;
    btClear: TSpeedButton;
    btReplace: TSpeedButton;
    gbFilterConditions: TGroupBox;
    lbFilter: TListBox;
    Panel1: TPanel;
    Label4: TLabel;
    btAddtodb: TSpeedButton;
    btDelFromDb: TSpeedButton;
    cbSavedList: TComboBox;
    procedure lbFilterDrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure lbFilterDblClick(Sender: TObject);
    procedure edtValueChange(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 cbSavedListChange(Sender: TObject);
    procedure btAddtodbClick(Sender: TObject);
    procedure btDelFromDbClick(Sender: TObject);
    procedure cbFieldsChange(Sender: TObject);
    procedure checkValueType(Sender: TObject);
  private
    { Private declarations }
    FFilterDialog: TKingFilterDialog;
  public
    DataSet: TDataSet;
    procedure LoadDBCondition;

    { 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;
    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 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 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(Dataset: TDataset);

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

implementation

uses StrUtils, UserManager;

{$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(Dataset: TDataset);
var
  kFilter: TKingFilterDialog;
begin
  kFilter := TKingFilterDialog.Create(nil);
  try
    kFilter.DataSet := Dataset;
    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);
end;

procedure TKingFilter.edtValueChange(Sender: TObject);
begin
  //  btnAddToList.Enabled := TEdit(Sender).Text <> '';
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): Double;
  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:
        Result := AnsiCompareStr(Trim(Field.DisplayText), Value);
      // Result := Field.AsFloat - StrToFloat(Value);
   //        Result := FilterCondition in [fcEqual, fcNotEqual, fcGreat, fcGreatEqual,
   //          fcLess, fcLessEqual];
      ftBoolean: if (Field.AsBoolean = StrToBoolDef(Value, True)) 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
  st: TStringList; //用来存放当前DATASET的FILTER条件
begin
  //这个函数就厉害了,它是用数据集的onfilter事件做过滤的,而且还能保存其原有的过滤代码
  Accept := True;
  //  if Accept = False then ShowMessage('Accept');
//如果用户已经指定了数据集的过滤事件,则先调用

//if Assigned(FSaveOnFilterRecord) then
//  FSaveOnFilterRecord(DataSet, Accept);

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

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

        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;
  finally
    FreeAndNil(st);
  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;

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]);
        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;
    LoadDBCondition; //装入预存在数据库中的预设条件
    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
  checkValueType(nil);
  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
  checkValueType(nil);
  btDel.Click;
  btNew.Click;
end;

procedure TKingFilter.cbSavedListChange(Sender: TObject);
var
  s: string;
begin
  if cbSavedList.ItemIndex = -1 then
    exit;
  if lbFilter.Items.Count > 0 then
    if MessageDlg('是否覆盖当前的条件?', mtWarning, [mbYes, mbNo], 0) = mrNo
      then
    begin
      cbSavedList.ItemIndex := -1;
      exit;
    end;
  lbFilter.Items.Text :=
    ku.GetFieldStr(Format('select Data from TFilterStore where sid=%s',
    [IntToStr(Integer(cbSavedList.Items.objects[cbSavedList.ItemIndex]))]));

end;

procedure TKingFilter.btAddtodbClick(Sender: TObject);
var
  s: string;
const
  sql = 'insert TFilterStore(UserID,DatasetID,Title,Data) values(%s,%s,%s,%s)';
  //新增到数据库中的语句
begin
  if lbFilter.Items.Count = 0 then
  begin
    MSG_OK('请先设置筛选条件!', MB_ICONERROR);
    Exit;
  end;
  s := InputBox('输入', '请输入预设条件的标题', '新的预设条件');
  if cbSavedList.Items.IndexOf(s) > 0 then
    if MSG_YESNO('预设条件已经存在,是否替换?') then
    begin //删除旧的预设条件
      cbSavedList.ItemIndex := cbSavedList.Items.IndexOf(s);
      btDelFromDb.Click;
    end;

  if ExecSql(Format(sql, [q(UserMan.UserID), q(DataSet.Owner.Name + '.' +
      DataSet.Name), Q(S), Q(lbFilter.Items.Text)])) then
  begin
    LoadDBCondition;
    cbSavedList.ItemIndex := cbSavedList.Items.IndexOf(s);
  end;

end;

procedure TKingFilter.LoadDBCondition;
var
  ads: TAdoDataset;
begin
  ads := TAdoDataset.create(Self);
  try
    with ads do
    begin
      Connection := ku.ActiveConn;
      CommandText :=
        Format('select sid,title from TFilterStore where UserID=%s and DatasetID=%s',
        [q(UserMan.UserID), q(DataSet.Owner.Name + '.' + DataSet.Name)]);
      Open;
      cbSavedList.Clear;
      while not Eof do
      begin
        cbSavedList.AddItem(fieldByName('title').AsString,
          TObject(FieldByName('sid').asinteger));
        Next;
      end;
    end;
  finally
    FreeAndNil(ads);
  end;

end;

procedure TKingFilter.btDelFromDbClick(Sender: TObject);
const
  sql = 'Delete from TFilterStore where sid = %s ';
begin
  if cbSavedList.ItemIndex = -1 then
    exit;
  if MSG_YESNO('确定要删除吗?', MB_ICONWARNING) then
  begin
    if ExecSql(Format(sql,
      [IntToStr(Integer(cbSavedList.Items.objects[cbSavedList.ItemIndex]))]))
        then
      LoadDBCondition;
  end;
end;

procedure TKingFilter.cbFieldsChange(Sender: TObject);
const
  maxtime = 500; //如果1000毫秒内还未完成填充动作,则就不再填充
var
  I: Integer;
  d: DWORD;
  bm: 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;
        if TField(cbFields.Items.Objects[cbFields.ItemIndex]).DataType =
          ftBoolean then
        begin
          cbValue.Items.Add('True');
          cbValue.Items.Add('False');
        end;
        while not Eof do
        begin
          //填充值到cbValue中了
          if (TField(cbFields.Items.Objects[cbFields.ItemIndex]).AsString <> '')
          and
          (cbValue.Items.IndexOf(TField(cbFields.Items.Objects[cbFields.ItemIndex]).AsString) = -1) then
          cbValue.Items.Add(TField(cbFields.Items.Objects[cbFields.ItemIndex]).AsString);
          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;

procedure TKingFilter.checkValueType(Sender: TObject);
var
  s: string;
  f: TObject;
begin //检测所输入的内容,是否符合指定字段的类型
  s := cbValue.Text;
  if s = '' then
    exit;
  f := cbFields.Items.Objects[cbFields.ItemIndex];
  if Assigned(f) then
  begin
    try
      case TField(F).DataType of
        ftSmallint, ftInteger, ftWord, ftFloat, ftCurrency, ftBCD, ftBytes,
          ftVarBytes, ftAutoInc, ftLargeint:
          StrToFloat(s);
        ftBoolean:
          StrToBool(s);
        ftDate, ftTime, ftDateTime:
          StrToDateTime(s);
      end;
    except
      MessageDlg('输入的值类型不正确!', mtError, [mbOK], 0);
      cbValue.SelectAll;
      cbValue.SetFocus;
      Abort;
    end;
  end;
end;

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

end.

object KingFilter: TKingFilter
  Left = 260
  Top = 190
  BorderStyle = bsDialog
  Caption = #33258#23450#20041#31579#36873
  ClientHeight = 299
  ClientWidth = 498
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -15
  Font.Name = #23435#20307
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 15
  object gbDefineCondition: TGroupBox
    Left = 0
    Top = 0
    Width = 498
    Height = 65
    Align = alTop
    TabOrder = 0
    object Label1: TLabel
      Left = 69
      Top = 14
      Width = 62
      Height = 15
      Caption = #39033#30446'(&I):'
      FocusControl = cbFields
    end
    object Label2: TLabel
      Left = 216
      Top = 14
      Width = 62
      Height = 15
      Caption = #26465#20214'(&C):'
      FocusControl = cbConditions
    end
    object Label3: TLabel
      Left = 328
      Top = 14
      Width = 47
      Height = 15
      Caption = #20540'(&V):'
      FocusControl = cbValue
    end
    object cbFields: TComboBox
      Left = 69
      Top = 30
      Width = 141
      Height = 23
      BevelInner = bvNone
      BevelKind = bkFlat
      BevelOuter = bvRaised
      Style = csDropDownList
      ItemHeight = 15
      TabOrder = 0
      OnChange = cbFieldsChange
    end
    object cbConditions: TComboBox
      Left = 216
      Top = 30
      Width = 105
      Height = 23
      BevelInner = bvNone
      BevelKind = bkFlat
      BevelOuter = bvRaised
      Style = csDropDownList
      DropDownCount = 12
      ItemHeight = 15
      TabOrder = 1
      Items.Strings = (
        #31561#20110
        #19981#31561#20110
        #22823#20110
        #22823#20110#25110#31561#20110
        #23567#20110
        #23567#20110#25110#31561#20110
        #22987#20110
        #24182#38750#36215#22987#20110
        #27490#20110
        #24182#38750#32467#26463#20110
        #21253#21547
        #19981#21253#21547)
    end
    object cbLink: TComboBox
      Left = 8
      Top = 30
      Width = 54
      Height = 23
      BevelInner = bvNone
      BevelKind = bkFlat
      BevelOuter = bvRaised
      Style = csDropDownList
      DropDownCount = 12
      ItemHeight = 15
      ItemIndex = 0
      TabOrder = 2
      Text = #24182#19988
      Items.Strings = (
        #24182#19988
        #25110#32773)
    end
    object cbValue: TComboBox
      Left = 328
      Top = 30
      Width = 161
      Height = 23
      BevelInner = bvNone
      BevelKind = bkFlat
      BevelOuter = bvRaised
      ItemHeight = 15
      Sorted = True
      TabOrder = 3
      OnExit = checkValueType
    end
  end
  object GroupBox1: TGroupBox
    Left = 369
    Top = 65
    Width = 129
    Height = 234
    Align = alRight
    Caption = #25805#20316
    TabOrder = 1
    object btNew: TSpeedButton
      Left = 8
      Top = 86
      Width = 113
      Height = 33
      Caption = #28155#21152#26465#20214
      Flat = True
      Glyph.Data = {
        4E010000424D4E010000000000760000002800000013000000120000000100
        040000000000D8000000C40E0000C40E000010000000000
        80000080000000808000800000008000800080800000C0C0C000808080000000
        FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF003333333333
        3333333000003333333333000003333333333000003333
        333A44433333333000003333333A22433333333000003333333A224333333330
        00003333333A22433333333000003333333A224333333330000033A4444A2244
        44443330000033A222222222243330000033A222222222243330000033AA
        AAAA224AAAA4333000003333333A22433333333000003333333A224333333330
        00003333333A22433333333000003333333A22433333333000003333333AAA43
        333333300000333333333300000}
      OnClick = btNewClick
    end
    object btDel: TSpeedButton
      Left = 8
      Top = 122
      Width = 113
      Height = 33
      Caption = #21024#38500#26465#20214
      Flat = True
      Glyph.Data = {
        4E010000424D4E010000000000760000002800000013000000120000000100
        040000000000D8000000C40E0000C40E000010000000000
        80000080000000808000800000008000800080800000C0C0C000808080000000
        FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF003333333333
        3333333000003333333333000003333333333000003333
        33333333330000033333333330000033333333330
        0000333333333300000333333333300000338888888888
        888833300000339111111111183330000033911111111118333000003399
        99999999993330000033333333330000033333333330
        00003333333333000003333333333000003333333333
        333333300000333333333300000}
      OnClick = btDelClick
    end
    object btOk: TSpeedButton
      Left = 8
      Top = 157
      Width = 113
      Height = 33
      Caption = #31579'    '#36873
      Flat = True
      Glyph.Data = {
        DE010000424DDE010000000000760000002800000024000000120000000100
        0400000000006801000000000010000000000
        80000080000000808000800000008000800080800000C0C0C000808080000000
        FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF003333333333
        333333333300003333333333F3333333333
        00003333344333333333388F33333333330000333342243333333333
        338338F33333333300003334222243333333333833338F3333333300003342
        222224333333333383333338F3333333000034222A22224333333338F338F333
        8F33333300003222A3A2224333333338F3838F338F33333300003A2A333A2224
        33333338F83338F338F33333000033A33333A222433333338333338F338F3333
        0000333333333A222433333333338F338F33300003333333333A222433333
        333333338F338F3300003333333333A222433333333338F338F300003333
        33333333A222433333333338F338F00003333333333A2243333333333
        3338F38F00003333333333A2233333333338F8300003333333333
        333A333333333383300003333333333
        0000}
      NumGlyphs = 2
      OnClick = btOkClick
    end
    object btCancel: TSpeedButton
      Left = 8
      Top = 192
      Width = 113
      Height = 38
      Caption = #36864'    '#20986
      Flat = True
      Glyph.Data = {
        DE010000424DDE010000000000760000002800000024000000120000000100
        0400000000006801000000000010000000000
        80000080000000808000800000008000800080800000C0C0C000808080000000
        FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF003333333333
        333333333300003333883333333333F3333333333
        0000333911833333983333333388F333333F3333000033391118333911833333
        38F38F333F88F33300003339111183911118333338F338F3F8338F3300003333
        911118111118333338F3338F833338F3000033333911111111833333338F3338
        3333F8330000333333911111183333333338F333333F83330000333333311111
        833333333338F33333833330000333333391111833333333338F333833333
        000033333391111183333333333833338F3333000033333911181118333333
        33338333338F333300003333911183911183333333383338F338F33300003333
        9118333911183333338F33838F338F33000033333913333391113333338FF833
        38F338F300003333333333919333333388333338FFF8300003333333333
        33333333338883300003333333333
        0000}
      NumGlyphs = 2
      OnClick = btCancelClick
    end
    object btClear: TSpeedButton
      Left = 8
      Top = 16
      Width = 113
      Height = 33
      Caption = #28165#38500#26465#20214
      Flat = True
      Glyph.Data = {
        36030000424D36030000000000360000002800000010000000100000000100
        18000000000030000000000FF00FFFF00FF
        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
        0000000000
        00FF00FFFF00FFFF00FFFF00FFFF00FF000000FFFFFFFFFF
        FFFFFFFFFF000000FF00FFFF00FFFF00FFFF00FFFF00FF
        000000FFFFFFFFFF0000
        00FF00FFFF00FFFF00FFFF00FFFF00FF000000FFFFFFFFFF
        FFFFFFFFFF000000FF00FFFF00FFFF00FFFF00FFFF00FF
        000000FFFFFFFFFF0000
        00FF00FFFF00FFFF00FFFF00FFFF00FF000000FFFFFFFFFF
        FFFFFFFFFF000000FF00FFFF00FFFF00FFFF00FFFF00FF
        000000FFFFFFFFFF0000
        00FF00FFFF00FFFF00FFFF00FFFF00FF000000FFFFFFFFFF
        FFFFFFFFFF000000FF00FFFF00FFFF00FFFF00FFFF00FF
        000000FFFFFFFFFF0000
        00FF00FFFF00FFFF00FFFF00FFFF00FF000000FFFFFFFFFF
        FFFFFFFFFF0000000000FF00FFFF00FFFF00FFFF00FFFF00FF
        000000FFFFFFFFFF000000FFFFFF000000FF00
        FFFF00FFFF00FFFF00FFFF00FFFF00FF000000FFFFFFFFFF
        FFFFFFFFFF0000000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
        0000000000FF00FFFF00FFFF00
        FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
        00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
      OnClick = btClearClick
    end
    object btReplace: TSpeedButton
      Left = 8
      Top = 51
      Width = 113
      Height = 33
      Caption = #26367#25442#26465#20214
      Flat = True
      Glyph.Data = {
        36030000424D36030000000000360000002800000010000000100000000100
        18000000000030000000000FF00FFFF00FF
        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF8484840000008484
        84FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
        00FF8484840000000000C6C6C60000000000848484FF00FFFF00FFFF00FF
        FF00FFFF00FFFF00FFFF00FFFF00FF848484000000FFFF00FFFF00FFFFFFFFFF
        00FF0000000000848484FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00
        0000FFFF00FFFF00FFFF00848484FF0000FFFF00FF0000000000FF00FFFF00FF
        FF00FFFF00FFFF00FFFF00FFFF00FF000000FFFF00FFFF00848484C6C6C68484
        84FF0000FFFF00000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00
        0000848484848484FFFF00FFFFFFFFFF00848484848484000000FF00FFFF00FF
        FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF000000FFFF00FFFFFFFFFF00FFFF
        FFFFFF00000000FF00FFFF00FFFF00FFFF00FF0000000000FF00FFFF
        00FFFF00FF0000000000FFFF0000000000FF00FFFF00FFFF00FF000000
        0000000000FF0000840000FF0000000000FF00FFFF00FFFF00FF000000FF00
        FFFF00FFFF00FFFF00FFFF00FF0000000000FF0000FF0000FF0000FF0000FF00
        0000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF000000FFFFFF
        0000FFFFFFFFFF0000FF0000FF000000FF00FFFF00FFFF00FF8400
        00840000FF00FFFF00FF000000FFFFFF0000FF0000FF0000FF0000FF0000FF00
        0084000000FF00FFFF00FFFF00FF840000840000FF00FFFF00FF000000FFFFFF
        0000FFFFFFFFFF0000FF0000FF000000FF00FF8400008400008400
        00840000840000840000FF00FF000000FFFFFF0000FF0000FF0000FF0000FF00
        0000FF00FFFF00FF840000840000840000840000840000840000FF00FF000000
        000000FFFFFFFFFF0000000000FF00FFFF00FFFF00FFFF00FF8400
        00840000FF00FFFF00FFFF00FFFF00FFFF00FF0000000000FF00FFFF
        00FFFF00FFFF00FFFF00FFFF00FF840000840000FF00FFFF00FF}
      OnClick = btReplaceClick
    end
  end
  object gbFilterConditions: TGroupBox
    Left = 0
    Top = 65
    Width = 369
    Height = 234
    Align = alClient
    Caption = #31579#36873#26465#20214'(&T)'
    TabOrder = 2
    object lbFilter: TListBox
      Left = 2
      Top = 17
      Width = 365
      Height = 174
      Style = lbOwnerDrawFixed
      Align = alClient
      BevelEdges = []
      BevelInner = bvNone
      BevelKind = bkFlat
      BevelOuter = bvNone
      Ctl3D = False
      ItemHeight = 16
      ParentCtl3D = False
      TabOrder = 0
      OnDblClick = lbFilterDblClick
      OnDrawItem = lbFilterDrawItem
    end
    object Panel1: TPanel
      Left = 2
      Top = 191
      Width = 365
      Height = 41
      Align = alBottom
      BevelOuter = bvNone
      TabOrder = 1
      object Label4: TLabel
        Left = 10
        Top = 13
        Width = 60
        Height = 15
        Caption = #39044#35774#26465#20214
      end
      object btAddtodb: TSpeedButton
        Left = 266
        Top = 8
        Width = 41
        Height = 25
        Hint = #22686#21152#39044#35745#26465#20214
        Flat = True
        Glyph.Data = {
          4E010000424D4E010000000000760000002800000013000000120000000100
          040000000000D8000000C40E0000C40E000010000000000
          80000080000000808000800000008000800080800000C0C0C000808080000000
          FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF003333333333
          3333333000003333333333000003333333333000003333
          333A44433333333000003333333A22433333333000003333333A224333333330
          00003333333A22433333333000003333333A224333333330000033A4444A2244
          44443330000033A222222222243330000033A222222222243330000033AA
          AAAA224AAAA4333000003333333A22433333333000003333333A224333333330
          00003333333A22433333333000003333333A22433333333000003333333AAA43
          333333300000333333333300000}
        OnClick = btAddtodbClick
      end
      object btDelFromDb: TSpeedButton
        Left = 314
        Top = 8
        Width = 41
        Height = 25
        Hint = #21024#38500#39044#35774#26465#20214
        Flat = True
        Glyph.Data = {
          4E010000424D4E010000000000760000002800000013000000120000000100
          040000000000D8000000C40E0000C40E000010000000000
          80000080000000808000800000008000800080800000C0C0C000808080000000
          FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF003333333333
          3333333000003333333333000003333333333000003333
          33333333330000033333333330000033333333330
          0000333333333300000333333333300000338888888888
          888833300000339111111111183330000033911111111118333000003399
          99999999993330000033333333330000033333333330
          00003333333333000003333333333000003333333333
          333333300000333333333300000}
        OnClick = btDelFromDbClick
      end
      object cbSavedList: TComboBox
        Left = 74
        Top = 9
        Width = 185
        Height = 23
        BevelInner = bvNone
        BevelKind = bkFlat
        BevelOuter = bvRaised
        Style = csDropDownList
        DropDownCount = 12
        ItemHeight = 15
        TabOrder = 0
        OnChange = cbSavedListChange
        Items.Strings = (
          #31561#20110
          #19981#31561#20110
          #22823#20110
          #22823#20110#25110#31561#20110
          #23567#20110
          #23567#20110#25110#31561#20110
          #22987#20110
          #24182#38750#36215#22987#20110
          #27490#20110
          #24182#38750#32467#26463#20110
          #21253#21547
          #19981#21253#21547)
      end
    end
  end
end
cexo255 20222 2005/12/21 16:00:48
最近又加了一些功能:
1.自定義計算字段
2.界面控件的位置編輯,標題編輯
3.所有控件的屬性的保存(數據庫中)

但是,我不打算整理發上來了,因為我覺得這樣的勞動得不到一點的回報和收獲,對我個人的提高也得不到一點幫助!

還是搞出來一點東西之后就自已用吧!


这么说就见外了
kingjit 19937 2005/12/12 13:54:23
最近又加了一些功能:
1.自定義計算字段
2.界面控件的位置編輯,標題編輯
3.所有控件的屬性的保存(數據庫中)

但是,我不打算整理發上來了,因為我覺得這樣的勞動得不到一點的回報和收獲,對我個人的提高也得不到一點幫助!

還是搞出來一點東西之后就自已用吧!
wflkxj 19868 2005/12/10 16:31:07
老兄,怎么样了,1.5版的出炉了吗?期待中..........
zql0913 19668 2005/12/1 13:14:00
一个字.强~~~~~
dfw@158926 19581 2005/11/28 14:33:56
好,学习
kingjit 19547 2005/11/27 14:38:33
TO:CTX
1.你可能没有仔细看源码吧!查找或是过滤的时候,如果你设置了displaylabel,即标题,则让用户看到的就是你设置的中文了,如果没有,那我也没有办法,只能显示原始的字段名了!我的例子中是没有设置的情况的,你可用网格编辑先设置成中文名再查找或过滤看看!
2.公开源代码,也只是在我完成我的项目的基础上的,在我完成项目的同时,把功能给独立出来共享给大家,因为我的坏境和大家不同,也没有时间再装一个干净的环境去检查!所以只能大家多多包含了!

原定1.5的计划没有完成,但完成了客户想要的 数据转入转出功能,是整个SQLSERVER转入到ACCESS,再从ACCESS转入到SQLSERVER
这个功能看起来简单,但细想一下,真得很麻烦哩!
1.两个库结构不一样
2.触发器
3.自增值字段(花了很多时间)
4.主外键的关联约束(花我最多时间)
5.BLOB字段的处理


整整费了我9个小时,才有一个初步的东西,先放一个EXE让大家看看!

下载试用地址:
http://down1.tomore.com:81/source/20051127/200511271437237200.rar

TOMORE被我当成暂存地了!哈哈
ctx 19532 2005/11/26 18:06:14
给你点建议,经常会遇到表的字段是拼音或是英文,字段是拼音或英文让用户使用很不方便,在查找时有一个对照的中文意思,这样让最终用户使用起来会很方便。

既然公开的源代码,为什么不给大家一个可以直接编译的东西。
luckypig 19522 2005/11/26 0:55:16
看到楼主把这么好的控件贡献出来,真是高兴!另有一个问题,不知道楼主对于DBGrid中显示行号(即像用友系统中那样的效果)有没有什么好的东东可以给大家开开眼界呢?先谢了!
aac 19510 2005/11/25 11:02:42
to kingjit:
你既然前面的记录都存到数据库里了,默认名称也存到数据库好了。呵呵
kingjit 19509 2005/11/25 10:37:41
V1.5難產中。。。
因為忙啊,得吃飯啊,所以大家再等等吧,有空了我就整理
kingjit 19508 2005/11/25 10:35:46
TO:AAC
功能是有一些凌亂了,是要整理整理了

保存篩選記錄,我是存到數據庫中的
所有的界面設置,我是用PropStorageEh存到數據庫中的,因此沒有針對GRID做設計,這樣更通用一些!

不過,系統默認名稱這個東東還真是沒有地方保存呢,只能清除所有設置才會出現,你有沒有什麼好的想法,能保存舊的名稱
第一页 上一页 下一页 最后页 有 53 条纪录 共3页 21 - 40
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表