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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dbutilseh.pas

?? 針對(duì)Lib控件
?? PAS
?? 第 1 頁(yè) / 共 4 頁(yè)
字號(hào):
{*******************************************************}
{                                                       }
{                       EhLib v4.2                      }
{       Utilities to sort, filter data in DataSet       }
{                      Build 4.2.28                     }
{                                                       }
{      Copyright (c) 2002-2004 by Dmitry V. Bolshakov   }
{                                                       }
{*******************************************************}

{$I EhLib.Inc}

{$IFDEF EH_LIB_VCL}
unit DbUtilsEh {$IFDEF CIL} platform {$ENDIF};
{$ELSE}
unit QDbUtilsEh;
{$ENDIF}

interface

{$IFDEF EH_LIB_VCL}
uses
{$IFDEF EH_LIB_6} Variants, {$ENDIF}

{$IFDEF CIL}
  EhLibVCLNET,
  System.Runtime.InteropServices, System.Reflection,
{$ELSE}
  EhLibVCL,
{$ENDIF}

  DBGridEh, Db, SysUtils, Classes, TypInfo, Windows, Messages, ToolCtrlsEh;

{$ELSE}
uses
  Variants, QDBGridEh, Db, SysUtils, Classes, TypInfo;
{$ENDIF}

type

  TDateValueToSQLStringProcEh = function(DataSet: TDataSet; Value: Variant): String;

var

  STFilterOperatorsStrMapEh: array[TSTFilterOperatorEh] of String =
  ('', '=', '<>',
    '>', '<', '>=', '<=',
    '~', '!~',
    'In', '!In',
    {=}'Null', {<>}'Null',
    'AND', 'OR',
    '');

const

  STFldTypeMapEh: array[TFieldType] of TSTOperandTypeEh = (
    botNon, botString, botNumber, botNumber, botNumber,
    botBoolean, botNumber, botNumber, botNumber, botDateTime, botDateTime, botDateTime,
    botNon, botNon, botNumber, botNon, botString, botNon, botString,
    botNon, botNon, botNon, botNon, botString, botString,
    botNumber, botNon, botNon, botNon, botNon
{$IFDEF EH_LIB_5}
    ,botNon, botNon, botNon, botNon, botNon, botString
{$ENDIF}
{$IFDEF EH_LIB_6}, botDateTime, botNumber{$ENDIF}
{$IFDEF EH_LIB_10}
    ,botString, botString, botNon, botString
{$ENDIF}
    );

  STFilterOperatorsSQLStrMapEh: array[TSTFilterOperatorEh] of String =
  ('', '=', '<>',
    '>', '<', '>=', '<=',
    'LIKE', 'NOT LIKE',
    'IN', 'NOT IN',
    'IS NULL', 'IS NOT NULL',
    'AND', 'OR',
    '');

procedure InitSTFilterOperatorsStrMap;

{ FilterExpression }

function ParseSTFilterExpressionEh(Exp: String; var FExpression: TSTFilterExpressionEh): Boolean;
procedure ClearSTFilterExpression(var FExpression: TSTFilterExpressionEh);

type
  TOneExpressionFilterStringProcEh = function(O: TSTFilterOperatorEh; v: Variant;
    FieldName: String; DataSet: TDataSet;
    DateValueToSQLStringProc: TDateValueToSQLStringProcEh;
    SupportsLike: Boolean): String;

{ Useful routines to form filter string for dataset }

function GetExpressionAsFilterString(AGrid: TCustomDBGridEh;
  OneExpressionProc: TOneExpressionFilterStringProcEh;
  DateValueToSQLStringProc: TDateValueToSQLStringProcEh;
  UseFieldOrigin: Boolean = False;
  SupportsLocalLike: Boolean = False): String;

function GetOneExpressionAsLocalFilterString(O: TSTFilterOperatorEh;
  v: Variant; FieldName: String; DataSet: TDataSet;
  DateValueToSQLStringProc: TDateValueToSQLStringProcEh;
  SupportsLike: Boolean): String;

function GetOneExpressionAsSQLWhereString(O: TSTFilterOperatorEh; v: Variant;
  FieldName: String; DataSet: TDataSet;
  DateValueToSQLStringProc: TDateValueToSQLStringProcEh; SupportsLike: Boolean): String;

function DateValueToDataBaseSQLString(DataBaseName: String; v: Variant): String;

procedure ApplyFilterSQLBasedDataSet(Grid: TCustomDBGridEh;
  DateValueToSQLString: TDateValueToSQLStringProcEh; IsReopen: Boolean;
  SQLPropName: String);

{ DatasetFeatures }

type

  TDataSetClass = class of TDataSet;

  TDatasetFeaturesEh = class
  private
    FDataSetClass: TDataSetClass;
  public
    constructor Create; virtual;
    function LocateText(AGrid: TCustomDBGridEh; const FieldName: string;
      const Text: String; AOptions: TLocateTextOptionsEh; Direction: TLocateTextDirectionEh;
      Matching: TLocateTextMatchingEh; TreeFindRange: TLocateTextTreeFindRangeEh): Boolean; virtual;
    function MoveRecords(Sender: TObject; BookmarkList: TStrings; ToRecNo: Longint; CheckOnly: Boolean): Boolean; virtual;
    procedure ApplySorting(Sender: TObject; DataSet: TDataSet; IsReopen: Boolean); virtual;
    procedure ApplyFilter(Sender: TObject; DataSet: TDataSet; IsReopen: Boolean); virtual;
    procedure ExecuteFindDialog(Sender: TObject; Text, FieldName: String; Modal: Boolean); virtual;
  end;

  TSQLDatasetFeaturesEh = class(TDatasetFeaturesEh)
  private
    FSortUsingFieldName: Boolean;
    FSQLPropName: String;
    FDateValueToSQLString: TDateValueToSQLStringProcEh;
    FSupportsLocalLike: Boolean;
  public
    constructor Create; override;
    procedure ApplySorting(Sender: TObject; DataSet: TDataSet; IsReopen: Boolean); override;
    property SortUsingFieldName: Boolean read FSortUsingFieldName write FSortUsingFieldName;
    procedure ApplyFilter(Sender: TObject; DataSet: TDataSet; IsReopen: Boolean); override;
    property SQLPropName: String read FSQLPropName  write FSQLPropName;
    property DateValueToSQLString: TDateValueToSQLStringProcEh read
      FDateValueToSQLString write FDateValueToSQLString;
    property SupportsLocalLike: Boolean read FSupportsLocalLike write FSupportsLocalLike;
  end;

  TCommandTextDatasetFeaturesEh = class(TSQLDatasetFeaturesEh)
  public
    constructor Create; override;
  end;

  TDatasetFeaturesEhClass = class of TDatasetFeaturesEh;

{ Register/Unregister DatasetFeatures }

procedure RegisterDatasetFeaturesEh(DatasetFeaturesClass: TDatasetFeaturesEhClass;
  DataSetClass: TDataSetClass);
procedure UnregisterDatasetFeaturesEh(DataSetClass: TDataSetClass);
function GetDatasetFeaturesForDataSet(DataSet: TDataSet): TDatasetFeaturesEh;
function GetDatasetFeaturesForDataSetClass(DataSetClass: TClass): TDatasetFeaturesEh;


function IsSQLBasedDataSet(DataSet: TDataSet; var SQL: TStrings): Boolean;
function IsDataSetHaveSQLLikeProp(DataSet: TDataSet; SQLPropName: String; var SQLPropValue: WideString): Boolean;

procedure ApplySortingForSQLBasedDataSet(Grid: TCustomDBGridEh; DataSet: TDataSet;
  UseFieldName: Boolean; IsReopen: Boolean; SQLPropName: String);

function LocateDatasetTextEh(AGrid: TCustomDBGridEh;
  const FieldName, Text: String; AOptions: TLocateTextOptionsEh;
  Direction: TLocateTextDirectionEh; Matching: TLocateTextMatchingEh;
  TreeFindRange: TLocateTextTreeFindRangeEh): Boolean;

var
  SQLFilterMarker: String = '/*FILTER*/';

resourcestring

  // Filter expression operators
  SNotOperatorEh = 'Not';
  SAndOperatorEh = 'AND';
  SOrOperatorEh = 'OR';
  SLikePredicatEh = ''; // 'Like sign' //Use default sign '~'
  SInPredicatEh = 'In';
  SNullConstEh = 'Null';

  // Error message
  SQuoteIsAbsentEh = 'Quote is absent: ';
  SLeftBracketExpectedEh = '''('' expected: ';
  SRightBracketExpectedEh = ''')'' expected: ';
  SErrorInExpressionEh = 'Error in expression: ';
  SUnexpectedExpressionBeforeNullEh = 'Unexpected expression before Null: ';
  SUnexpectedExpressionAfterOperatorEh = 'Unexpected expression after operator: ';
  SIncorrectExpressionEh = 'Incorrect expression: ';
  SUnexpectedANDorOREh = 'Unexpected AND or OR: ';

implementation

uses
  DBConsts, DBGridEhFindDlgs, Contnrs, WideStrings;
  
procedure SetDataSetSQLLikeProp(DataSet: TDataSet; SQLPropName: String; SQLPropValue: WideString);
var
  FPropInfo: PPropInfo;
begin
  FPropInfo := GetPropInfo(DataSet.ClassInfo, SQLPropName);
  if FPropInfo = nil then Exit;
  if PropType_getKind(PropInfo_getPropType(FPropInfo)) = tkString then
    SetStrProp(DataSet, FPropInfo, SQLPropValue)
{$IFDEF EH_LIB_6}
  else if PropType_getKind(PropInfo_getPropType(FPropInfo)) = tkWString then
    SetWideStrProp(DataSet, FPropInfo, SQLPropValue)
{$ELSE}
  else if PropType_getKind(PropInfo_getPropType(FPropInfo)) = tkWString then
    SetStrProp(DataSet, FPropInfo, SQLPropValue)
{$ENDIF}
  else if PropType_getKind(PropInfo_getPropType(FPropInfo)) = tkClass then
    //if (TObject(GetOrdProp(DataSet, FPropInfo)) as TStrings) <> nil then
    //  (TObject(GetOrdProp(DataSet, FPropInfo)) as TStrings).Text := SQLPropValue;
    if TObject(GetOrdProp(DataSet, FPropInfo)) is TStrings then
      (TObject(GetOrdProp(DataSet, FPropInfo)) as TStrings).Text := SQLPropValue
    else if TObject(GetOrdProp(DataSet, FPropInfo)) is TWideStrings then
      (TObject(GetOrdProp(DataSet, FPropInfo)) as TWideStrings).Text := SQLPropValue;
end;

procedure ClearSTFilterExpression(var FExpression: TSTFilterExpressionEh);
begin
  FExpression.Operator1 := foNon;
  FExpression.Operand1 := Null;
  FExpression.Relation := foNon;
  FExpression.Operator2 := foNon;
  FExpression.Operand2 := Null;
end;

procedure InitSTFilterOperatorsStrMap;
var
  NotOperator: String;
begin
  if SNotOperatorEh <> ''
    then NotOperator := SNotOperatorEh + ' '
    else NotOperator := 'Not ';
  if SLikePredicatEh <> '' then
  begin
    STFilterOperatorsStrMapEh[foLike] := SLikePredicatEh;
    STFilterOperatorsStrMapEh[foNotLike] := NotOperator + SLikePredicatEh;
  end;
  if SInPredicatEh <> '' then
  begin
    STFilterOperatorsStrMapEh[foIn] := SInPredicatEh;
    STFilterOperatorsStrMapEh[foNotIn] := NotOperator + SInPredicatEh;
  end;
  if SNullConstEh <> '' then
  begin
    STFilterOperatorsStrMapEh[foNull] := SNullConstEh;
    STFilterOperatorsStrMapEh[foNotNull] := SNullConstEh;
  end;
  if SAndOperatorEh <> '' then
    STFilterOperatorsStrMapEh[foAND] := SAndOperatorEh;
  if SOrOperatorEh <> '' then
    STFilterOperatorsStrMapEh[foOR] := SOrOperatorEh;
end;

{$IFNDEF EH_LIB_6}
function StrCharLength(const Str: PChar): Integer;
begin
  if SysLocale.FarEast then
    Result := Integer(CharNext(Str)) - Integer(Str)
  else
    Result := 1;
end;

function NextCharIndex(const S: string; Index: Integer): Integer;
begin
  Result := Index + 1;
  assert((Index > 0) and (Index <= Length(S)));
  if SysLocale.FarEast and (S[Index] in LeadBytes) then
    Result := Index + StrCharLength(PChar(S) + Index - 1);
end;
{$ENDIF}

{ ParseSTFilterExpression }

type
  TOperator = (
    opNon, opEqual, opNotEqual,
    opGreaterThan, opLessThan, opGreaterOrEqual, opLessOrEqual,
    opLike,
    opIn,
    opAND, opOR,
    opValue,
    opNot, opComma, opOpenBracket, opCloseBracket, opQuote, opNullConst);

const
  OperatorAdvFilterOperatorMap: array[TOperator] of TSTFilterOperatorEh = (
    foNon, foEqual, foNotEqual,
    foGreaterThan, foLessThan, foGreaterOrEqual, foLessOrEqual,
    foLike,
    foIn,
    foAND, foOR,
    foValue,
    foNon, foNon, foNon, foNon, foNon, foNull);


function GetLexeme(S: String; var Pos: Integer; var Operator: TSTFilterOperatorEh;
  PreferCommaForList: Boolean): Variant; forward;

function GetOperatorByWord(TheWord: String): TOperator;
begin
  Result := opNon;
  TheWord := AnsiUpperCase(TheWord);
  if (TheWord = 'NOT') or
     ((SNotOperatorEh <> '') and (TheWord = AnsiUpperCase(SNotOperatorEh))) then
    Result := opNot
  else if (TheWord = 'AND') or
          ((SAndOperatorEh <> '') and (TheWord = AnsiUpperCase(SAndOperatorEh))) then
    Result := opAND
  else if (TheWord = 'OR') or
          ((SOrOperatorEh <> '') and (TheWord = AnsiUpperCase(SOrOperatorEh))) then
    Result := opOR
  else if (TheWord = 'LIKE') or
          ((SLikePredicatEh <> '') and (TheWord = AnsiUpperCase(SLikePredicatEh))) then
    Result := opLIKE
  else if (TheWord = 'IN') or
          ((SInPredicatEh <> '') and (TheWord = AnsiUpperCase(SInPredicatEh))) then
    Result := opIN
  else if (TheWord = 'NULL') or
          ((SNullConstEh <> '') and (TheWord = AnsiUpperCase(SNullConstEh))) then
    Result := opNullConst;
end;

procedure ConvertVarStrValues(var v: Variant; ot: TSTOperandTypeEh);
var
  i: Integer;
begin
  if ot = botNumber then
  begin
    if not VarIsNull(v) then
      if VarIsArray(v) then
        for i := VarArrayLowBound(v, 1) to VarArrayHighBound(v, 1) do
          v[i] := StrToFloat(v[i])
      else
        v := StrToFloat(v);
  end
  else if ot = botDateTime then
  begin
    if not VarIsNull(v) then
      if VarIsArray(v) then
        for i := VarArrayLowBound(v, 1) to VarArrayHighBound(v, 1) do
          v[i] := StrToDateTime(v[i])
      else
        v := StrToDateTime(v);
  end;
end;

function SkipBlanks(s: String; Pos: Integer): Integer;
var
  i: Integer;
begin
  Result := Pos;
  for i := Pos to Length(s) do
    if s[i] <> ' ' then
    begin
      Result := i;
      Break;
    end
end;

procedure SetOperatorPos(var Pos: Integer; Increment: Integer; var Op: TOperator; NewOp: TOperator);
begin
  Inc(Pos, Increment);
  Op := NewOp;
end;

function CharAtPos(S: String; Pos: Integer): Char;
begin
  if Length(S) < Pos then
    Result := #0
  else
    Result := S[Pos];
end;

function ReadValue(S: String; var Pos: Integer; PreferCommaForList: Boolean): Variant;

  function CheckForOperand(S: String; Pos: Integer): Boolean;
  var
    Operator: TSTFilterOperatorEh;
  begin
    GetLexeme(S, Pos, Operator, PreferCommaForList);
    if Operator in [foEqual..foOR] then
      Result := True
    else
      Result := False;
  end;

var
  i: Integer;
begin
  Result := Null;
  if Pos > Length(S) then

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人伊人久久综合网| 欧美一区二区私人影院日本| 午夜视频在线观看一区二区 | 亚洲一区二区三区中文字幕| 欧美一区二区三区影视| 成人爽a毛片一区二区免费| 亚洲一区二区三区中文字幕| 欧美激情一区二区在线| 91麻豆精品国产无毒不卡在线观看| 亚洲欧美国产三级| 日韩三级视频中文字幕| 色婷婷久久久久swag精品| 国内精品视频一区二区三区八戒| 亚洲精品大片www| 国产精品女主播在线观看| 欧美一级搡bbbb搡bbbb| 欧洲一区二区三区免费视频| 国产盗摄一区二区| 卡一卡二国产精品 | av午夜一区麻豆| 激情综合五月婷婷| 日韩电影免费在线观看网站| 亚洲视频在线一区二区| 日本一区二区视频在线观看| 欧美成人伊人久久综合网| 欧美日韩综合不卡| 色88888久久久久久影院野外| 成人手机在线视频| 成人午夜在线免费| 国产.精品.日韩.另类.中文.在线.播放| 免费观看在线色综合| 香蕉乱码成人久久天堂爱免费| 亚洲色图视频网站| 亚洲三级在线观看| 亚洲人成人一区二区在线观看| 中文字幕第一区| 国产精品三级av在线播放| 国产欧美中文在线| 国产精品天干天干在线综合| 一区二区成人在线| 日本精品视频一区二区三区| 99re热这里只有精品视频| jlzzjlzz亚洲女人18| 成人午夜私人影院| 99九九99九九九视频精品| 成人免费视频国产在线观看| 国产激情精品久久久第一区二区| 国产一二精品视频| 国产成人a级片| 成人h版在线观看| 91丨九色丨国产丨porny| 色婷婷亚洲精品| 欧美色涩在线第一页| 欧美日韩大陆一区二区| 欧美一区二区三区在线电影| 欧美va亚洲va| 中文字幕久久午夜不卡| 亚洲色图在线看| 同产精品九九九| 日韩精品国产欧美| 毛片基地黄久久久久久天堂| 国内精品伊人久久久久av影院| 国产精品一区二区免费不卡| 成人avav影音| 色先锋aa成人| 91麻豆精品国产自产在线| 精品国产三级电影在线观看| 亚洲国产精品精华液ab| 中文字幕一区视频| 五月天一区二区三区| 久久电影网电视剧免费观看| 国产成人无遮挡在线视频| 91免费在线看| 91精品婷婷国产综合久久| 国产午夜三级一区二区三| 亚洲成人激情自拍| 中文字幕在线播放不卡一区| 亚洲国产wwwccc36天堂| 日本中文字幕不卡| 成人激情动漫在线观看| 欧美日韩在线一区二区| 精品国产91九色蝌蚪| 亚洲婷婷国产精品电影人久久| 首页亚洲欧美制服丝腿| 国产乱码精品一区二区三区五月婷| 粉嫩嫩av羞羞动漫久久久| 欧美日韩视频在线观看一区二区三区 | 制服丝袜一区二区三区| 亚洲精品一区二区三区四区高清| 日本一二三四高清不卡| 天使萌一区二区三区免费观看| 国产伦精一区二区三区| 欧美性三三影院| 国产亚洲欧洲997久久综合 | 国产黄色精品网站| 欧美日韩在线观看一区二区 | 色悠悠亚洲一区二区| 日韩欧美不卡在线观看视频| 亚洲日本在线视频观看| 美女久久久精品| 色一区在线观看| 国产网红主播福利一区二区| 亚欧色一区w666天堂| 紧缚奴在线一区二区三区| 欧洲生活片亚洲生活在线观看| 久久这里只精品最新地址| 狠狠色丁香久久婷婷综| 午夜不卡av免费| 99视频在线精品| 久久久无码精品亚洲日韩按摩| 性做久久久久久免费观看| 99re在线视频这里只有精品| 精品成人在线观看| 日本亚洲一区二区| 欧美特级限制片免费在线观看| 国产精品久久久久影院亚瑟| 久久草av在线| 6080日韩午夜伦伦午夜伦| 亚洲激情图片小说视频| 国产白丝精品91爽爽久久| 日韩免费看网站| 视频一区视频二区在线观看| 在线区一区二视频| 亚洲欧美经典视频| 成人18视频日本| 欧美极品少妇xxxxⅹ高跟鞋| 久久国产尿小便嘘嘘尿| 91精品国产综合久久久久久 | 国产亚洲一区二区三区四区| 久久精品国产99久久6| 欧美日韩第一区日日骚| 亚洲午夜一区二区| 在线观看成人免费视频| 亚洲精品国产视频| 色噜噜狠狠成人网p站| ●精品国产综合乱码久久久久| 高清av一区二区| 国产欧美一区二区三区沐欲| 国产一区二区中文字幕| 久久综合色婷婷| 激情亚洲综合在线| 久久久青草青青国产亚洲免观| 久久国产夜色精品鲁鲁99| 日韩精品最新网址| 在线亚洲人成电影网站色www| 色欧美片视频在线观看在线视频| 国产精品第四页| 91亚洲国产成人精品一区二三 | 视频在线观看一区二区三区| 欧美日韩视频在线观看一区二区三区| 亚洲综合免费观看高清完整版 | 91蜜桃免费观看视频| 日韩理论片网站| 欧美视频完全免费看| 天天综合色天天| 欧美成人一级视频| 丁香婷婷综合色啪| 亚洲欧美国产高清| 9191成人精品久久| 精品一区二区影视| 国产精品女人毛片| 色婷婷综合久久| 日本女优在线视频一区二区| 精品剧情在线观看| www.日韩av| 亚洲国产成人tv| 欧美精品一区二区不卡| 北条麻妃一区二区三区| 亚洲自拍偷拍网站| 欧美日韩一区二区三区高清| 免费av成人在线| 国产精品入口麻豆九色| www.欧美日韩国产在线| 日韩一区精品视频| 久久精品一级爱片| 色天天综合色天天久久| 九九视频精品免费| 综合中文字幕亚洲| 日韩欧美一级精品久久| 成人永久aaa| 午夜成人在线视频| 国产精品免费久久| 色综合久久久久久久| 奇米四色…亚洲| 国产精品蜜臀在线观看| 91精品国产全国免费观看| 国产999精品久久久久久绿帽| 一区二区三区国产精品| 久久这里只有精品视频网| 欧洲av在线精品| 国产乱子伦一区二区三区国色天香| 自拍视频在线观看一区二区| 91精品国产色综合久久不卡蜜臀 | 91在线视频播放地址| 日本系列欧美系列| 亚洲日本在线a| 国产欧美日产一区| 欧美一区二区成人| 99国产精品99久久久久久| 精品写真视频在线观看 |