亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲成人动漫在线观看| 99精品国产热久久91蜜凸| 成人午夜激情视频| 欧美喷水一区二区| 亚洲国产高清在线观看视频| 日韩av在线发布| 日本韩国欧美在线| 国产视频视频一区| 乱一区二区av| 欧美三级中文字| 亚洲视频电影在线| 高潮精品一区videoshd| 欧美成人a视频| 亚洲一区二区三区美女| 菠萝蜜视频在线观看一区| 欧美一区二区三区视频免费 | 亚洲国产综合在线| 丁香六月综合激情| 久久久国际精品| 蜜臀精品一区二区三区在线观看| 91久久人澡人人添人人爽欧美| 久久女同性恋中文字幕| 奇米一区二区三区av| 91精彩视频在线| 亚洲精品欧美在线| 波多野结衣中文字幕一区| 中文字幕av一区二区三区| 国产成人av电影在线| 久久久久国产精品麻豆ai换脸 | 国产91精品精华液一区二区三区| 欧美一级在线免费| 天堂一区二区在线| 欧美精品在线一区二区| 日韩精品乱码av一区二区| 欧美精选午夜久久久乱码6080| 亚洲国产精品自拍| 欧美系列在线观看| 日韩制服丝袜先锋影音| 日韩视频一区二区三区在线播放| 奇米影视7777精品一区二区| 日韩一区二区三区四区| 精品一区二区三区不卡| 久久亚洲私人国产精品va媚药| 韩国毛片一区二区三区| 中文字幕第一页久久| av欧美精品.com| 亚洲综合色自拍一区| 欧美一级高清大全免费观看| 精品无码三级在线观看视频| 欧美激情一区在线| 91久久免费观看| 日韩av一级片| 国产欧美一区二区三区在线看蜜臀| 国产成人精品综合在线观看 | 91在线视频观看| 亚洲午夜在线视频| 日韩免费一区二区| www.亚洲国产| 午夜精品久久一牛影视| 欧美精品一区二区蜜臀亚洲| 成人激情小说乱人伦| 亚洲第一主播视频| 久久毛片高清国产| 色哟哟国产精品免费观看| 天堂资源在线中文精品| 国产午夜精品一区二区三区视频 | 国产成人av在线影院| 亚洲欧美日韩国产综合| 日韩欧美亚洲国产另类| 成人中文字幕电影| 日韩av电影天堂| 国产精品青草综合久久久久99| 欧美日韩国产综合久久| 久久www免费人成看片高清| 国产精品成人一区二区三区夜夜夜| 欧美色网一区二区| 国产成人精品影视| 日韩av一级电影| 成人免费在线视频| 精品国产伦一区二区三区观看体验 | 国产农村妇女毛片精品久久麻豆| 91美女精品福利| 久久国产三级精品| 亚洲国产精品久久人人爱| 国产亚洲精品免费| 欧美一级日韩不卡播放免费| av网站一区二区三区| 国产综合一区二区| 丝袜亚洲另类丝袜在线| 国产精品久久久久久久久搜平片| 56国语精品自产拍在线观看| 成人avav影音| 精品一区二区三区在线观看国产| 一区二区国产盗摄色噜噜| 久久精品免视看| 日韩一区二区三免费高清| 91免费版在线看| 成人精品一区二区三区四区 | 亚洲一区二区三区国产| 国产精品久久久久久久久免费丝袜 | 久久99国产乱子伦精品免费| 亚洲国产成人tv| 亚洲欧美日韩国产手机在线| 国产精品视频yy9299一区| 久久综合久久久久88| 7777精品伊人久久久大香线蕉超级流畅 | 欧美日韩精品三区| 欧美在线视频日韩| 在线中文字幕不卡| 色美美综合视频| 91亚洲大成网污www| 91视频在线观看免费| 91麻豆免费看片| 91视视频在线直接观看在线看网页在线看| 国产91丝袜在线播放0| 国产成人av电影在线播放| 国产suv精品一区二区883| 国产成人自拍网| 成人av在线观| 91香蕉视频在线| 在线观看日韩国产| 欧美人妖巨大在线| 日韩视频在线永久播放| 精品少妇一区二区三区视频免付费| 欧美成人激情免费网| 久久综合色8888| 中文字幕视频一区| 亚洲免费av在线| 午夜国产不卡在线观看视频| 蜜桃精品视频在线| 国产福利精品导航| 波多野结衣在线一区| 色av成人天堂桃色av| 欧美网站一区二区| 欧美r级电影在线观看| 久久综合狠狠综合久久综合88 | 在线观看视频一区二区| 在线一区二区三区四区五区| 欧美日韩1区2区| 久久嫩草精品久久久精品一| 欧美国产日韩a欧美在线观看| 亚洲人成在线观看一区二区| 香蕉av福利精品导航| 狠狠狠色丁香婷婷综合久久五月| 奇米影视一区二区三区小说| 成人av网站在线| 在线播放中文字幕一区| 欧美va在线播放| 国产精品三级av在线播放| 亚洲一卡二卡三卡四卡无卡久久 | 色综合色狠狠天天综合色| 欧美日韩成人综合在线一区二区| 精品久久久久香蕉网| 亚洲日本中文字幕区| 日韩高清国产一区在线| 丁香五精品蜜臀久久久久99网站| 欧美亚洲一区三区| 国产日韩欧美一区二区三区综合| 亚洲人快播电影网| 韩国毛片一区二区三区| 欧美少妇xxx| 国产精品久久福利| 麻豆91在线播放免费| 色综合久久88色综合天天| 日韩精品一区二区三区视频播放 | 欧美一级专区免费大片| 亚洲欧美在线观看| 久久成人久久爱| 欧美日韩黄色一区二区| 国产精品毛片久久久久久| 日产精品久久久久久久性色| 99精品视频在线观看| 亚洲精品在线电影| 日本不卡的三区四区五区| 在线观看亚洲一区| **网站欧美大片在线观看| 国产精品66部| 精品国产一区久久| 日韩电影网1区2区| 欧美日韩国产片| 一区二区三区美女| 色狠狠桃花综合| 国产精品久久久久久久久晋中| 国产一区二区三区国产| 538在线一区二区精品国产| 一区二区不卡在线播放| 99久久综合精品| 国产精品久久毛片| 国产不卡视频在线播放| 久久久久久久网| 国产一区二区美女诱惑| 日韩欧美亚洲一区二区| 狂野欧美性猛交blacked| 日韩一区二区免费高清| 蜜臀av一级做a爰片久久| 91精品国产一区二区三区蜜臀| 日韩精品国产精品| 在线播放91灌醉迷j高跟美女| 亚洲成a天堂v人片| 欧美精品乱码久久久久久|