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

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

?? dbutilseh.pas

?? 一個功能強大的DBGRID控件
?? PAS
?? 第 1 頁 / 共 4 頁
字號:
  begin
    for i := Pos + 1 to Length(S) do
      if S[i] = '''' then
      begin
        Result := Copy(S, Pos + 1, i - Pos - 1);
        Pos := i + 1;
        Exit;
      end;
    raise Exception.Create(SQuoteIsAbsentEh + S);
  end
  else
  begin
    for i := Pos to Length(S) do
    begin
      if ((S[i] in [' ']) and CheckForOperand(S, SkipBlanks(S, i))) or
        ((S[i] in [')', '('])) or
        (PreferCommaForList and (S[i] = ',')) then
      begin
        Result := Copy(S, Pos, i - Pos);
        Pos := i;
        Exit;
      end;
    end;
    Result := Copy(S, Pos, MAXINT);
    Pos := Length(S) + 1;
  end;
end;

function ReadValues(S: String; var Pos: Integer; PreferCommaForList: Boolean): Variant;
var
  i: Integer;
  vArr: Variant;
begin
  i := 0;
  vArr := VarArrayCreate([0, 0], varVariant);
  while True do
  begin
    vArr[i] := ReadValue(S, Pos, PreferCommaForList);
    if vArr[i] = Null then
      Break;
    if PreferCommaForList and (CharAtPos(S, Pos) = ',') then
      Inc(Pos)
    else
      Break;
    Inc(i);
    VarArrayRedimEh(vArr, i);
  end;
  if i = 0 then
    Result := vArr[0]
  else
    Result := vArr;
end;

function GetLexeme(S: String; var Pos: Integer; var Operator: TSTFilterOperatorEh;
  PreferCommaForList: Boolean): Variant;
var
  Oper: TOperator;
  Operator1: TSTFilterOperatorEh;
  TheWord: String;

  function ReadWord(S: String; Pos: Integer): String;
  var
    c: Char;
    NextPos: Integer;
  begin
    Result := '';
    while True do
    begin
      c := CharAtPos(S, Pos);
      if (c < #32) or (c in [' ','(',')','>','<','=','!','~','&','|','.',',','''','"','+','-']) then
        Exit;
      NextPos := NextCharIndex(S,Pos);
      Result := Result + Copy(S,Pos,NextPos-Pos);
      Pos := NextPos;
    end;
  end;

begin
  Operator := foNon;
  Oper := opNon;
  Result := '';
  if Length(S) < Pos then
    Exit;
  if S[Pos] = '''' then
  begin
    Result := ReadValues(S, Pos, PreferCommaForList);
    Operator := foValue;
  end
  else
  begin
    case S[Pos] of

      '!':
        if CharAtPos(S, Pos + 1) = '=' then
          SetOperatorPos(Pos, 2, Oper, opNotEqual)
        else
          SetOperatorPos(Pos, 1, Oper, opNot);
      '=':
        SetOperatorPos(Pos, 1, Oper, opEqual);
      '(':
        SetOperatorPos(Pos, 1, Oper, opOpenBracket);

      '>':
        if CharAtPos(S, Pos + 1) = '=' then
          SetOperatorPos(Pos, 2, Oper, opGreaterOrEqual)
        else
          SetOperatorPos(Pos, 1, Oper, opGreaterThan);
      '<':
        if CharAtPos(S, Pos + 1) = '=' then
          SetOperatorPos(Pos, 2, Oper, opLessOrEqual)
        else if CharAtPos(S, Pos + 1) = '>' then
          SetOperatorPos(Pos, 2, Oper, opNotEqual)
        else
          SetOperatorPos(Pos, 1, Oper, opLessThan);
      '~':
        SetOperatorPos(Pos, 1, Oper, opLike);
      '&':
        SetOperatorPos(Pos, 1, Oper, opAnd); //And
      '|':
        SetOperatorPos(Pos, 1, Oper, opOr); // Or
    else
      TheWord := ReadWord(S,Pos);
      Oper := GetOperatorByWord(TheWord);
      if Oper <> opNon then
        Inc(Pos, Length(TheWord));
    end; //case

    if Oper = opNon then
    begin
      Result := ReadValues(S, Pos, PreferCommaForList);
      if VarIsNull(Result) then
        Operator := foNon
      else
        Operator := foValue;
      Exit;
    end;

    Pos := SkipBlanks(S, Pos);

    if Oper = opNot then
    begin
      GetLexeme(S, Pos, Operator1, PreferCommaForList);
      case Operator1 of
        foLike: Operator := foNotLike;
        foIn: Operator := foNotIn;
        foNull: Operator := foNotNull;
      end
    end
    else if Oper = opIn then
    begin
      if CharAtPos(S, Pos) = '(' then
        Inc(Pos)
      else
        raise Exception.Create(SLeftBracketExpectedEh + S);
      Operator := foIn;
    end
    else
      Operator := OperatorAdvFilterOperatorMap[Oper];
  end;
end;

function ParseSTFilterExpression(Exp: String; var FExpression: TSTFilterExpressionEh): Boolean;

var
  PreferCommaForList: Boolean;

  procedure ResetPreferCommaForList;
  begin
    if (FExpression.ExpressionType = botNumber) and (DecimalSeparator = ',') then
      PreferCommaForList := False
    else
      PreferCommaForList := True;
  end;

var
  v: Variant;
  op, op1: TSTFilterOperatorEh;
  p: Integer;
begin
  Result := False;

  ResetPreferCommaForList;

  FExpression.Operator1 := foNon;
  FExpression.Operand1 := Null;
  FExpression.Relation := foNon;
  FExpression.Operator2 := foNon;
  FExpression.Operand2 := Null;

  Exp := Trim(Exp);
  if Exp = '' then
    Exit;
  // 1 [Oper] + Values
  p := SkipBlanks(Exp, 1);
  v := GetLexeme(Exp, p, op, PreferCommaForList);
  if op = foValue then
  begin
    if VarIsArray(v) then
      FExpression.Operator1 := foIn
    else if FExpression.ExpressionType = botString then
      FExpression.Operator1 := foLike
    else
      FExpression.Operator1 := foEqual;
    FExpression.Operand1 := v;
  end
  else if (op = foNon) and (Length(Exp) <> 0) then
    raise Exception.Create(SErrorInExpressionEh + Exp)
  else
  begin
    if op in [foIn, foNotIn] then
      PreferCommaForList := True;
    p := SkipBlanks(Exp, p);
    v := GetLexeme(Exp, p, op1, PreferCommaForList);
    FExpression.Operator1 := op;
    if op1 = foNull then
      if op = foEqual then
        FExpression.Operator1 := foNull
      else if op = foNotEqual then
        FExpression.Operator1 := foNotNull
      else
        raise Exception.Create(SUnexpectedExpressionBeforeNullEh + Exp)
    else if op1 <> foValue then
      raise Exception.Create(SUnexpectedExpressionAfterOperatorEh + Exp);
    FExpression.Operand1 := v;
    if op in [foIn, foNotIn] then
    begin
      p := SkipBlanks(Exp, p);
      if CharAtPos(Exp, p) = ')' then
        Inc(p)
      else
        raise Exception.Create(SRightBracketExpectedEh + Exp);
      ResetPreferCommaForList;
    end;
  end;

  while True do
  begin
    // 2 And or Or
    p := SkipBlanks(Exp, p);
    v := GetLexeme(Exp, p, op, PreferCommaForList);
    if op = foNon then
      if p <> Length(Exp) + 1 then
        raise Exception.Create(SIncorrectExpressionEh + Exp)
      else
        Break;
    if not (op in [foAND, foOR]) then
      raise Exception.Create(SUnexpectedANDorOREh + Exp);
    FExpression.Relation := op;

    // 3 [Oper] + Values
    p := SkipBlanks(Exp, p);
    v := GetLexeme(Exp, p, op, PreferCommaForList);
    if op = foNon then
      if p <> Length(Exp) + 1 then
        raise Exception.Create(SIncorrectExpressionEh + Exp)
      else
        Break;
    if op = foValue then
    begin
      if VarIsArray(v) then
        FExpression.Operator2 := foIn
      else if FExpression.ExpressionType = botString then
        FExpression.Operator2 := foLike
      else
        FExpression.Operator2 := foEqual;
      FExpression.Operand2 := v;
    end
    else if (op = foNon) and (Length(Exp) <> 0) then
      raise Exception.Create(SErrorInExpressionEh + Exp)
    else
    begin
      if op in [foIn, foNotIn] then
        PreferCommaForList := True;
      p := SkipBlanks(Exp, p);
      v := GetLexeme(Exp, p, op1, PreferCommaForList);
      FExpression.Operator2 := op;
      if op1 = foNull then
        if op = foEqual then
          FExpression.Operator2 := foNull
        else if op = foNotEqual then
          FExpression.Operator2 := foNotNull
        else
          raise Exception.Create(SUnexpectedExpressionBeforeNullEh + Exp)
      else if op1 <> foValue then
        raise Exception.Create(SUnexpectedExpressionAfterOperatorEh + Exp);
      FExpression.Operand2 := v;
      ResetPreferCommaForList;
    end;
    Result := True;
    Break;
  end;

  if FExpression.Operator1 in [foEqual..foNotIn] then
    ConvertVarStrValues(FExpression.Operand1, FExpression.ExpressionType)
  else
    FExpression.Operand1 := Null;

  if FExpression.Operator2 in [foEqual..foNotIn] then
    ConvertVarStrValues(FExpression.Operand2, FExpression.ExpressionType)
  else
    FExpression.Operand2 := Null;
end;

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

var
  PreferCommaForList: Boolean;

  procedure ResetPreferCommaForList;
  begin
    if (FExpression.ExpressionType = botNumber) and (DecimalSeparator = ',') then
      PreferCommaForList := False
    else
      PreferCommaForList := True;
  end;

var
  v: Variant;
  op, op1: TSTFilterOperatorEh;
  p: Integer;
begin
  Result := False;

  ResetPreferCommaForList;

  FExpression.Operator1 := foNon;
  FExpression.Operand1 := Null;
  FExpression.Relation := foNon;
  FExpression.Operator2 := foNon;
  FExpression.Operand2 := Null;

  Exp := Trim(Exp);
  if Exp = '' then
    Exit;
  // 1 [Oper] + Values
  p := SkipBlanks(Exp, 1);
  v := GetLexeme(Exp, p, op, PreferCommaForList);
  if op = foValue then
  begin
    if VarIsArray(v) then
      FExpression.Operator1 := foIn
    else if FExpression.ExpressionType = botString then
      FExpression.Operator1 := foLike
    else
      FExpression.Operator1 := foEqual;
    FExpression.Operand1 := v;
  end
  else if (op = foNon) and (Length(Exp) <> 0) then
    raise Exception.Create(SErrorInExpressionEh + Exp)
  else
  begin
    if op in [foIn, foNotIn] then
      PreferCommaForList := True;
    p := SkipBlanks(Exp, p);
    v := GetLexeme(Exp, p, op1, PreferCommaForList);
    FExpression.Operator1 := op;
    if op1 = foNull then
      if op = foEqual then
        FExpression.Operator1 := foNull
      else if op = foNotEqual then
        FExpression.Operator1 := foNotNull
      else
        raise Exception.Create(SUnexpectedExpressionBeforeNullEh + Exp)
    else if op1 <> foValue then
      raise Exception.Create(SUnexpectedExpressionAfterOperatorEh + Exp);
    FExpression.Operand1 := v;
    if op in [foIn, foNotIn] then
    begin
      p := SkipBlanks(Exp, p);
      if CharAtPos(Exp, p) = ')' then
        Inc(p)
      else
        raise Exception.Create(SRightBracketExpectedEh + Exp);
      ResetPreferCommaForList;
    end;
  end;

  while True do
  begin
    // 2 And or Or
    p := SkipBlanks(Exp, p);
    v := GetLexeme(Exp, p, op, PreferCommaForList);
    if op = foNon then
      if p <> Length(Exp) + 1 then
        raise Exception.Create(SIncorrectExpressionEh + Exp)
      else
        Break;
    if not (op in [foAND, foOR]) then
      raise Exception.Create(SUnexpectedANDorOREh + Exp);
    FExpression.Relation := op;

    // 3 [Oper] + Values
    p := SkipBlanks(Exp, p);
    v := GetLexeme(Exp, p, op, PreferCommaForList);
    if op = foNon then
      if p <> Length(Exp) + 1 then
        raise Exception.Create(SIncorrectExpressionEh + Exp)
      else
        Break;
    if op = foValue then
    begin
      if VarIsArray(v) then
        FExpression.Operator2 := foIn

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91在线播放网址| 久久久高清一区二区三区| 欧美精品在线一区二区| 久久久精品人体av艺术| 亚洲成av人片在线观看无码| 国产麻豆精品在线| 91精品在线免费| 亚洲欧美色一区| 国产suv精品一区二区三区| 日韩欧美成人一区| 日韩影院免费视频| 欧美在线视频日韩| 亚洲人一二三区| 粉嫩一区二区三区性色av| 日韩免费成人网| 蜜桃视频在线一区| 91麻豆精品国产综合久久久久久| 亚洲欧美综合另类在线卡通| 国产剧情在线观看一区二区| 欧美一区二区三级| 日韩激情一二三区| 日韩一区二区电影| 日韩成人一区二区三区在线观看| 日本精品免费观看高清观看| 国产精品看片你懂得| 国产成人自拍高清视频在线免费播放| 日韩欧美国产午夜精品| 日韩1区2区3区| 欧美一区二区黄色| 久久成人免费网站| 精品国产乱码久久久久久老虎| 免费成人在线影院| 欧美va日韩va| 国产一区二区精品久久91| 26uuu亚洲综合色| 狠狠色狠狠色综合| 国产亚洲午夜高清国产拍精品| 国产一区二区福利视频| 久久综合色8888| 国产成人三级在线观看| 国产精品视频九色porn| 成人福利视频在线| 一区二区三区四区在线免费观看| 色噜噜偷拍精品综合在线| 亚洲伦理在线免费看| 欧美午夜理伦三级在线观看| 偷拍日韩校园综合在线| 日韩欧美一区在线观看| 精品一区二区三区av| 国产日韩欧美麻豆| 91蜜桃网址入口| 亚洲第一av色| 久久美女高清视频| 91小视频免费看| 亚洲风情在线资源站| 精品少妇一区二区三区视频免付费 | 欧美日韩aaa| 青娱乐精品视频在线| 久久久99精品免费观看| 91女神在线视频| 丝袜a∨在线一区二区三区不卡| 欧美一区二区人人喊爽| 成人在线视频一区二区| 亚洲午夜在线电影| 久久九九久久九九| 欧美系列亚洲系列| 国产尤物一区二区在线| 韩国理伦片一区二区三区在线播放| 欧美国产日韩亚洲一区| 欧美乱妇23p| 国产91高潮流白浆在线麻豆| 亚洲无线码一区二区三区| 精品国产三级电影在线观看| av影院午夜一区| 另类小说一区二区三区| 一区二区在线观看视频| 久久综合999| 欧美最猛性xxxxx直播| 国产精品一区二区久久不卡| 亚洲二区在线视频| 国产精品日日摸夜夜摸av| 日韩女优制服丝袜电影| 91亚洲男人天堂| 国产伦精品一区二区三区免费迷| 亚洲国产一区二区在线播放| 国产精品美女久久久久aⅴ| 欧美电影影音先锋| 欧美午夜片在线看| 色综合网色综合| 国产成人av影院| 精品一区二区三区日韩| 日韩中文字幕亚洲一区二区va在线| 国产免费成人在线视频| 26uuu欧美日本| 91精品国产色综合久久久蜜香臀| 99国产精品99久久久久久| 国产成人精品三级| 国产一区二区中文字幕| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲国产成人高清精品| 亚洲一区影音先锋| 亚洲综合精品自拍| 亚洲精品免费在线| 亚洲乱码一区二区三区在线观看| 国产精品久久久久aaaa| 日本一区二区三区久久久久久久久不| 日韩午夜电影在线观看| 欧美日韩精品一区二区三区蜜桃 | 国产精品久久久一本精品| 久久日韩粉嫩一区二区三区| 欧美一区二区三区电影| 日韩一级片在线观看| 91精品国产手机| 欧美一级理论片| 欧美zozozo| 亚洲精品一区二区三区在线观看 | 欧美乱熟臀69xxxxxx| 欧美夫妻性生活| 91精选在线观看| 欧美一级高清片在线观看| 日韩美女天天操| 久久嫩草精品久久久久| 国产精品系列在线| 国产精品电影院| 亚洲免费伊人电影| 石原莉奈在线亚洲二区| 日本欧美一区二区| 国产在线精品国自产拍免费| 国产一区二区三区四区五区美女| 国产成人午夜电影网| 成人av中文字幕| 欧美系列在线观看| 欧美大尺度电影在线| 国产三级一区二区三区| 亚洲手机成人高清视频| 午夜一区二区三区在线观看| 免费成人在线播放| 丰满亚洲少妇av| 欧美三级韩国三级日本三斤| 欧美变态口味重另类| 国产精品久久久久久久久图文区| 一区二区欧美视频| 九一九一国产精品| 99久久久久免费精品国产| 欧美美女直播网站| 久久电影国产免费久久电影| 国产河南妇女毛片精品久久久 | 捆绑变态av一区二区三区| 国产高清亚洲一区| 欧美四级电影网| 国产日产欧美一区二区视频| 亚洲一区二区四区蜜桃| 黄色资源网久久资源365| 91视频www| 日韩一区二区免费在线观看| 欧美激情一二三区| 调教+趴+乳夹+国产+精品| 国产激情视频一区二区在线观看 | 亚洲国产精品一区二区久久恐怖片| 免费在线视频一区| 99精品视频一区二区三区| 日韩一级精品视频在线观看| 国产精品久久久久久久裸模| 日本不卡1234视频| 在线欧美日韩国产| 中文字幕国产精品一区二区| 日本aⅴ免费视频一区二区三区| 成人一区二区三区视频在线观看 | 91网上在线视频| 精品国产一区二区精华| 一片黄亚洲嫩模| 成人丝袜视频网| 精品少妇一区二区三区在线视频| 亚洲一区二区偷拍精品| 波多野洁衣一区| 久久精品视频一区二区| 蜜桃久久精品一区二区| 精品视频在线视频| 亚洲欧美日韩在线不卡| 国产成人av资源| 久久久精品欧美丰满| 久久99久久久久久久久久久| 欧美日韩国产片| 亚洲五码中文字幕| 在线观看国产一区二区| 中文字幕中文字幕一区| 国产不卡视频在线播放| 久久久久99精品一区| 韩国一区二区在线观看| 欧美哺乳videos| 黑人巨大精品欧美黑白配亚洲| 日韩欧美国产成人一区二区| 日韩在线观看一区二区| 在线不卡a资源高清| 午夜久久久久久久久| 在线欧美日韩精品| 亚洲国产日韩在线一区模特| 在线观看不卡视频| 五月婷婷久久综合| 4438x亚洲最大成人网|