亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ukingfilter.pas

?? MIS工具 萬能過濾 查詢 網格編輯器S_CXV
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
unit uKingFilter;

interface

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

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;
    Label4: TLabel;
    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);
  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;
    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;

{$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;

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;
        while not Eof do
        begin
          //填充值到cbValue中了
          if
            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;

{ 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 := Field.AsFloat - StrToFloat(Value);
      //        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');
//如果用戶已經指定了數據集的過濾事件,則先調用

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区观看视频| 精品国产伦一区二区三区观看方式| 午夜欧美在线一二页| 国产精品盗摄一区二区三区| 久久欧美一区二区| 欧美国产97人人爽人人喊| 久久精品这里都是精品| 国产欧美中文在线| 亚洲欧洲美洲综合色网| 亚洲图片你懂的| 亚洲夂夂婷婷色拍ww47| 五月激情六月综合| 日本sm残虐另类| 国产一区亚洲一区| av在线一区二区| 欧美精品三级日韩久久| 精品免费国产二区三区| 中文乱码免费一区二区| 一区二区三区国产精品| 日韩高清中文字幕一区| 狠狠色狠狠色综合系列| 成人av片在线观看| 欧美日韩国产欧美日美国产精品| 69堂精品视频| 久久精品亚洲精品国产欧美| 国产精品福利av| 一区二区三区蜜桃| 亚洲一区在线观看免费观看电影高清| 午夜精品久久久久久久久久| 精品亚洲porn| 色哟哟在线观看一区二区三区| 欧美日韩国产精品自在自线| 在线观看国产一区二区| 日韩免费观看高清完整版在线观看| 精品精品欲导航| 亚洲日本丝袜连裤袜办公室| 免费精品视频最新在线| 91在线观看地址| 欧美tk—视频vk| 亚洲欧美电影一区二区| 久久成人免费网站| 欧美日韩激情一区二区| 欧美国产97人人爽人人喊| 午夜国产精品一区| 9l国产精品久久久久麻豆| 精品国精品国产| 亚洲国产中文字幕| 成人av电影在线播放| 26uuu国产在线精品一区二区| 亚洲欧美色图小说| 国产91精品久久久久久久网曝门 | 欧美日韩国产一区| 中文字幕 久热精品 视频在线 | xf在线a精品一区二区视频网站| 亚洲欧洲国产日韩| 九九**精品视频免费播放| 欧美视频精品在线观看| 自拍偷拍欧美激情| 成人免费毛片嘿嘿连载视频| 日韩免费高清电影| 日韩精品成人一区二区三区| 成人av网站大全| 日本一区二区免费在线观看视频| 日韩精品乱码免费| 91麻豆精品91久久久久同性| 亚洲成人自拍网| 91蜜桃在线免费视频| 国产精品午夜久久| 福利一区福利二区| 国产精品乱码妇女bbbb| 国产a视频精品免费观看| 国产亚洲欧美一区在线观看| 水蜜桃久久夜色精品一区的特点| 欧美午夜精品久久久久久超碰| 亚洲天堂av老司机| 日本高清成人免费播放| 一区二区三区在线观看动漫| 日本韩国一区二区三区| 亚洲国产精品尤物yw在线观看| 欧美在线一二三| 婷婷国产v国产偷v亚洲高清| 欧美精品在线一区二区三区| 午夜精品久久久久久久久| 69堂精品视频| 国产麻豆成人精品| 中文一区二区在线观看| 91免费看片在线观看| 一区二区三区国产精华| 欧美日韩电影一区| 美国一区二区三区在线播放| 久久久久久一级片| 国产精品亚洲视频| 中日韩av电影| 欧美精选一区二区| 亚洲一级电影视频| 一本色道久久综合狠狠躁的推荐 | 欧美色大人视频| 亚洲欧美偷拍三级| 欧美日本一道本| 久久99精品国产91久久来源| 久久蜜桃av一区精品变态类天堂 | 蜜桃一区二区三区在线| 久久综合色综合88| 99re这里只有精品视频首页| 亚洲成人av福利| 精品国产乱码久久久久久老虎 | 国产偷国产偷精品高清尤物 | 风流少妇一区二区| 色老汉av一区二区三区| 欧美日韩国产高清一区二区 | 婷婷综合五月天| 欧美性生交片4| 久久99精品国产.久久久久久 | 亚洲三级久久久| 日韩一卡二卡三卡四卡| 成人国产精品免费观看视频| 天堂精品中文字幕在线| 一区二区三区不卡视频在线观看| www精品美女久久久tv| 欧美日韩日日摸| 色哟哟欧美精品| 色综合av在线| 欧美日韩精品免费观看视频| 精品国产一区二区三区久久影院| 国产伦精品一区二区三区视频青涩 | 国产剧情一区二区三区| 综合分类小说区另类春色亚洲小说欧美| 欧美精品亚洲二区| 成人在线综合网| 日韩电影在线免费看| 日韩欧美美女一区二区三区| 亚洲一区免费观看| 日韩一区二区视频在线观看| 久久99精品国产91久久来源 | 欧美久久久久久久久| 色综合久久久久综合体| 久久久久综合网| 免费人成精品欧美精品| 国产精品久久福利| 国产日韩欧美制服另类| 26uuu国产在线精品一区二区| 91精品国产一区二区三区蜜臀| 在线亚洲免费视频| 亚洲靠逼com| 亚洲欧美另类久久久精品| 国产日韩欧美一区二区三区乱码| 国内精品嫩模私拍在线| 韩国女主播成人在线| 久久精品国产亚洲aⅴ| 亚洲最色的网站| 日韩激情视频网站| 天天综合网天天综合色| 亚洲少妇屁股交4| 综合色天天鬼久久鬼色| 国产精品久久久久久久久免费桃花 | 国产日韩精品视频一区| 成人免费看片app下载| 亚洲一区二区三区小说| 日韩免费高清视频| 91网站最新地址| 欧美怡红院视频| 7777女厕盗摄久久久| 日韩欧美一二区| 国产调教视频一区| 中文字幕成人av| 制服丝袜中文字幕一区| 欧美精品一区二区三区四区| 久久先锋影音av鲁色资源| 色婷婷综合视频在线观看| 欧美日韩国产一级二级| 欧美电影免费观看高清完整版在线| 成人晚上爱看视频| 日本不卡不码高清免费观看| 亚洲欧美aⅴ...| 久久久久成人黄色影片| 亚洲欧美怡红院| 天天亚洲美女在线视频| 国产在线麻豆精品观看| 成人免费视频免费观看| 精品综合久久久久久8888| 国产成人综合自拍| 欧美影院一区二区| 精品国产百合女同互慰| 亚洲精品中文字幕乱码三区 | 久久天堂av综合合色蜜桃网| 中文字幕佐山爱一区二区免费| 欧美精品一区二区在线播放| 91精品国产综合久久福利软件| 2023国产精品视频| 亚洲综合成人在线视频| 国产精品久久福利| 国产欧美综合在线观看第十页 | 国产亚洲成aⅴ人片在线观看| 国产精品不卡一区| 国产精品国产三级国产aⅴ原创 | 欧美国产一区二区在线观看| 亚洲女与黑人做爰| 韩国女主播一区二区三区| 亚洲精品欧美专区| 亚洲精品免费看|