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

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

?? hwexprext.pas

?? 用于Delphi程序中嵌入公式解析
?? PAS
?? 第 1 頁 / 共 5 頁
字號:
            property FunctionName;
            property ResultType;
            property Description;
            property Syntax;
        end;

        { 預編譯型用戶函數算子 }
        TUserCompileFunction = class(TFunction)
        Private
            FUCFI: TUCFImplementation;
            procedure SetParams;
        Public
            constructor Create(const ucfi: TUCFImplementation; AParameterList: TParameterList);
            destructor Destroy; override;
            function AsBoolean: Boolean; override;
            function AsInteger: integer; override;
            function AsFloat: double; override;
            function AsString: string; override;
            function AsObject: TObject; override;
            //function CanReadAs(aType: TExprType): Boolean;
            function ExprType: TExprType; override;
            function TestParameters: Boolean; override;
        end;

{ ============================================================================
  >>>>   Class Implementation Begin                                       <<<<
  >>>>   Class Name  : TExtExprFunction
  >>>>   Description :
  >>>>   Create Date :
  ---------------------------------------------------------------------------- }
constructor TUserEvalFunction.Create(const ATemplate: TExprTemplate; ParameterList: TParameterList);
begin
        if ATemplate = nil then
            raise EExpression.Create('沒有指定函數模板,無法創建該函數執行體');

        inherited Create;
        Self.FTemplate := ATemplate;
        FPrivateParams := ParameterList;
        FValue := CreateExpression(ATemplate.Expression, Self.IDF);
end;

destructor TUserEvalFunction.Destroy;
begin
        FPrivateParams.Free;
        inherited Destroy;
end;


function TUserEvalFunction.IDF(Obj: IValue; const Identifier: string;
                               ParameterList: TParameterList): IValue;
var     i : Integer;
begin
        Result := nil;
        { 通過了測試的表達式函數中的符號都應該存在,符號檢查一般都沒有問題。 }
        if Identifier = FTemplate.FunctionName then
            raise EExpression.create('不支持遞歸調用!');

        { 首先檢查是否是私有變量 }
        i := FTemplate.IsParam(Identifier);
        if i <> -1 then
        begin
            Result := FPrivateParams.Param[i];
            Exit;
        end
        else
            Result := FTemplate.IdentContextSet.ExtIdent(Obj, Identifier, ParameterList);
end;

function TUserEvalFunction.AsBoolean: Boolean;
begin
        if FTemplate.ResultType = ttBoolean then
            Result := FValue.AsBoolean
        else
            Result := Inherited AsBoolean;
end;

function TUserEvalFunction.AsFloat: Double;
begin
        if FTemplate.ResultType = ttFloat then
            Result := FValue.AsFloat
        else
            Result := Inherited AsFloat;
end;

function TUserEvalFunction.AsInteger: integer;
begin
        if FTemplate.ResultType = ttInteger then
            Result := FValue.AsInteger
        else
            Result := inherited AsInteger;
end;

function TUserEvalFunction.AsObject: TObject;
begin
        if FTemplate.ResultType = ttObject then
            Result := FValue.AsObject
        else
            raise EExpression.CreateFmt(Err_FuncCanntObject, [FTemplate.FunctionName]);
end;

function TUserEvalFunction.AsString: string;
begin
        if FTemplate.ResultType = ttString then
            Result := FValue.AsString
        else
            Result := inherited AsString;
end;

function TUserEvalFunction.ExprType: TExprType;
begin
        Result := FTemplate.ResultType;
end;

{ 檢測參數是否有效,由Parser調用 }
function TUserEvalFunction.TestParameters: Boolean;
var     i : Integer;
begin
        Result := False;
        if (FPrivateParams = nil) and (FTemplate.ParamsCount <> 0) then Exit;

        if (FPrivateParams = nil) and (FTemplate.ParamsCount = 0) then
        begin
            Result := True;
            Exit;
        end;

        if FPrivateParams.Count <> FTemplate.ParamsCount then Exit;
        { 逐一檢查參數類型是否與定義的一致 }
        for i := 0 to FTemplate.ParamsCount -1 do
        begin
            if not FPrivateParams.Param[i].CanReadAs(FTemplate.ParamsType[i]) then Exit
        end;

        Result := True;
end;

{ ============================================================================
  >>>>   Class Implementation Begin                                       <<<<
  >>>>   Class Name  : TExprTemplate
  >>>>   Description :
  >>>>   Create Date :
  ---------------------------------------------------------------------------- }
constructor TExprTemplate.Create(const AFuncName: string;
                                 const AResultType: TExprType;
                                 const DetailType: string = '');
begin
        inherited Create;
        SetFuncName(AFuncName);
        SetResultType(AResultType);
        FErrorString := TStringList.Create;
        FParamList := TList.Create;
        FUnknowSymbols := TStringList.Create;
        FNeedCheck := True;
        SetAdditionType(DetailType);
end;

destructor TExprTemplate.Destroy;
begin
        ClearParams;
        FParamList.Free;
        FErrorString.Free;
end;

function TExprTemplate.GetParamsCount: integer;
begin
        Result := FParamList.Count;
end;

function TExprTemplate.AddParam(const AParamName: string; const AParamType: TExprType): Integer;
var
        pparam: PParamRec;
begin
        New(PParam);
        pparam^.ParamName := AParamName;
        pparam^.ParamType := AParamType;
        FParamList.Add(PParam);
        FNeedCheck := True;
        Result := FParamList.Count;
end;

function TExprTemplate.IsParam(const Identifier: string): integer;
var     i : Integer;
        pParam: PParamRec;
begin
        Result := -1;
        if Self.FParamList.Count > 0 then
        for i := 0 to FParamList.Count -1 do
        begin
            pparam := PParamRec(FParamList.Items[i]);
            if UpperCase(pparam^.ParamName) = UpperCase(Identifier) then
            begin
                Result := i;
                Exit;
            end;
        end;
end;

function TExprTemplate.GetParamsName(Index: integer): String;
begin
        if (Index < 0) or (Index > FParamList.Count -1 ) then
            raise EExpression.Create('索引超出范圍');
        Result := PParamRec(FParamList.Items[Index])^.ParamName;
end;

function TExprTemplate.GetParamsType(Index: Integer): TExprType;
begin
        if (Index < 0) or (Index > FParamList.Count -1 ) then
            raise EExpression.Create('索引超出范圍');
        Result := PParamRec(FParamList.Items[Index])^.ParamType;
end;

function TExprTemplate.UnknowSymbols: TStrings;
begin
        if FNeedCheck then CheckExpression;
        Result := FUnknowSymbols;
end;

function TExprTemplate.UnknowSymbolsCount: integer;
begin
        if FNeedCheck then CheckExpression;
        Result := FUnknowSymbols.Count;
end;

function TExprTemplate.CheckExpression: Boolean;
var     testValue: IValue;
begin
        Result := False;
        FErrorString.Clear;
        FUnknowSymbols.Clear;
        FNeedCheck := True;
        if Trim(FExpression) = '' then
        begin
            FErrorString.Add('沒有設置表達式');
            Result := True;
            FNeedCheck := False;
            Exit;
        end;

        try
            testValue := CreateExpression(FExpression, VirtualParams);
            { 檢查返回值類型是否與定義的一致 }
            if testVAlue.ExprType <> Self.ResultType then
            begin
                Result := False;
                FErrorString.Add('表達式返回結果與函數定義中的返回結果不一致');
                FNeedCheck := True;
            end
            else
                Result := True;
            { 檢查結束 }
            if (FUnknowSymbols.Count = 0) then
                FNeedCheck := False
            else
                FErrorString.Add('表達式中含有未知符號');
        except
            on e : EExpression do
            begin
                FErrorString.Add('語法錯誤:' + e.Message);
            end;

            on e : Exception do
            begin
                FErrorString.Add('錯誤:' + e.Message);
            end;
        end;
end;

function TExprTemplate.ErrorMessage: String;
begin
        Result := FErrorString.Text;
end;

procedure TExprTemplate.DeleteParam(Index: integer);
begin
        if (Index >=0) and (Index < (FParamList.Count -1)) then
        begin
            dispose(FParamList.Items[Index]);
            FParamList.Delete(Index);
        end
        else
            raise EExpression.Create('索引值超出范圍');
end;

procedure TExprTemplate.DeleteParam(const AParamName: String);
var     i : Integer;
        uName: string;
begin
        if FParamList.Count = 0 then Exit;
        uName := Uppercase(AParamName);
        for i := 0 to FParamList.Count -1 do
        begin
            if UpperCase(PParamRec(FParamList.Items[i])^.ParamName) = uName then
            begin
                DeleteParam(i);
                Exit;
            end;
        end;
end;

procedure TExprTemplate.ClearParams;
var     i : Integer;
begin
        if FParamList.Count = 0 then Exit;
        for i := FParamList.Count -1 Downto 0 do
        begin
            Dispose(FParamList.Items[i]);
            FParamList.Delete(i);
        end;        // while
end;

{ 進行表達式檢查的時候,需要向表達式解釋解析器不識別的符號,因此本函數可以獲取
  未知的符號 }
function TExprTemplate.VirtualParams(Obj: IValue; const Identifier: string;
                                     ParameterList: TParameterList): IValue;
var     //i : Integer;
        IdentType: TExprType;
        FoundSym: Boolean;

        function FindParam(const Identifier: string; Var AExprType: TExprType): Boolean;
        var i : Integer;
        begin
            Result := False;
            if FParamList.Count =0 then Exit;
            for i := 0 to FParamList.Count -1 do
            begin
                if UpperCase(PParamRec(FParamList.Items[i])^.ParamName) = UpperCase(Identifier) then
                begin
                    Result := True;
                    AExprType := PParamRec(FParamList.Items[i])^.ParamType;
                    Exit;
                end;
            end;
        end;
begin
        Result := nil;
        FoundSym := False;
        { 首先檢查是否出現了遞歸調用 }
        if Identifier = FFuncName then
            raise EExpression.Create('不支持遞歸調用');

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区在线观看不卡| 成人黄动漫网站免费app| 国产一区二区三区免费在线观看 | 婷婷综合五月天| 国产久卡久卡久卡久卡视频精品| 欧美中文字幕一二三区视频| 久久久蜜桃精品| 免费成人小视频| 欧美猛男男办公室激情| 国产精品素人视频| 六月丁香综合在线视频| 91国在线观看| 中文字幕在线不卡一区| 久久aⅴ国产欧美74aaa| 欧美色电影在线| 亚洲欧美日韩电影| 99视频一区二区| 久久网站最新地址| 麻豆传媒一区二区三区| 欧美日韩国产综合视频在线观看| 自拍偷拍国产精品| 不卡av在线免费观看| 国产视频一区不卡| 国产精品亚洲人在线观看| 91麻豆精品国产自产在线观看一区| 亚洲精品国产高清久久伦理二区| 国产宾馆实践打屁股91| 国产午夜精品久久久久久免费视| 久久机这里只有精品| 日韩欧美在线影院| 激情六月婷婷久久| 2020国产精品自拍| 国产精品一区二区在线播放 | 国产日韩欧美亚洲| 国产精品一区免费在线观看| 久久精品亚洲国产奇米99| 国产在线精品一区二区三区不卡 | 欧美在线影院一区二区| 亚洲欧美视频在线观看| 色综合久久88色综合天天免费| 亚洲欧美另类图片小说| 99久久久免费精品国产一区二区| 国产精品美女久久久久aⅴ| 粉嫩在线一区二区三区视频| 国产精品麻豆视频| 色婷婷精品大在线视频| 亚洲一区影音先锋| 91精品国产综合久久久久| 久久精品免费观看| 久久一区二区视频| 成人国产免费视频| 亚洲在线观看免费| 日韩女优视频免费观看| 成人精品视频.| 亚洲欧美国产三级| 91精品免费在线| 国产一区二区三区美女| 亚洲欧美一区二区三区孕妇| 欧美日韩视频在线第一区| 蜜桃精品视频在线观看| 国产日产亚洲精品系列| 欧美影院一区二区三区| 精品一区二区在线看| 中文文精品字幕一区二区| 欧美三级韩国三级日本一级| 久久99国产精品久久99| 亚洲欧美一区二区久久| 日韩欧美成人一区| 91麻豆.com| 精品影视av免费| 亚洲午夜免费福利视频| 久久久91精品国产一区二区精品 | 亚洲国产一区在线观看| 精品福利二区三区| 91麻豆蜜桃一区二区三区| 秋霞影院一区二区| 亚洲天堂av老司机| 久久综合精品国产一区二区三区| 99久久久无码国产精品| 久久99在线观看| 一区二区三区日韩在线观看| 精品国产乱码久久久久久1区2区 | 蜜臀va亚洲va欧美va天堂| 国产精品福利一区二区三区| 日韩一区二区视频在线观看| 91麻豆免费观看| 成人小视频在线| 国产一区在线视频| 天堂资源在线中文精品| 亚洲日本电影在线| 久久精品人人做人人爽97| 在线播放欧美女士性生活| 99久久久无码国产精品| 国产精品一区二区男女羞羞无遮挡| 偷拍日韩校园综合在线| 亚洲精品日日夜夜| 国产精品理伦片| 欧美国产日韩一二三区| 2022国产精品视频| 欧美sm极限捆绑bd| 欧美一卡2卡3卡4卡| 欧美少妇bbb| 欧美又粗又大又爽| 91精品91久久久中77777| 成人午夜视频在线| 成人网在线免费视频| 国产精品影音先锋| 国产成人精品免费在线| 国产在线乱码一区二区三区| 日韩和欧美一区二区| 日日夜夜免费精品视频| 视频一区在线视频| 日韩在线播放一区二区| 日韩中文字幕av电影| 亚洲成年人网站在线观看| 亚洲高清视频在线| 午夜精品久久久久久久久| 亚洲图片欧美色图| 亚洲超丰满肉感bbw| 人人狠狠综合久久亚洲| 美女视频一区在线观看| 麻豆国产欧美一区二区三区| 久久99精品久久久久久国产越南 | 久久精品国产在热久久| 蜜桃一区二区三区四区| 国产一区二区不卡在线| 国产成人免费视频网站高清观看视频| 国产成人福利片| 激情另类小说区图片区视频区| 日韩av一二三| 精品综合免费视频观看| 国产麻豆9l精品三级站| 国产成人在线电影| 99免费精品在线| 欧美日韩大陆在线| 久久久99久久精品欧美| 中文字幕成人av| 亚洲一区在线免费观看| 美女精品一区二区| 国产mv日韩mv欧美| 色八戒一区二区三区| 91精品国产综合久久精品| 久久人人97超碰com| 亚洲欧美日韩一区| 日日夜夜一区二区| 国产成人在线视频网址| 色噜噜狠狠色综合中国| 日韩亚洲欧美成人一区| 国产女同互慰高潮91漫画| 一区二区三区在线视频观看| 久久精品国产免费看久久精品| 粉嫩一区二区三区性色av| 欧美三级中文字| 欧美经典三级视频一区二区三区| 亚洲韩国精品一区| 成人性色生活片| 日韩欧美国产电影| 一区二区久久久| 国产 欧美在线| 91麻豆精品国产91久久久使用方法| 久久五月婷婷丁香社区| 午夜精品久久久久影视| 国产精品99久久久久久久vr| 欧美区视频在线观看| 国产精品久久久久影院色老大| 日韩主播视频在线| 97久久久精品综合88久久| 欧美不卡视频一区| 亚洲电影视频在线| aaa欧美日韩| 久久久久久久久久久电影| 日韩二区三区在线观看| 一本久久精品一区二区| 国产日本一区二区| 久久99精品久久久| 91精品黄色片免费大全| 亚洲午夜一区二区三区| 91小视频在线| 国产精品久久久久久久久搜平片 | 视频精品一区二区| 在线一区二区三区做爰视频网站| 久久久久国产免费免费| 免费人成网站在线观看欧美高清| 色狠狠色噜噜噜综合网| 国产精品家庭影院| 成人蜜臀av电影| 久久久久久97三级| 国产一区激情在线| 日韩小视频在线观看专区| 性欧美疯狂xxxxbbbb| 欧美视频精品在线| 亚洲国产日韩综合久久精品| 91蜜桃免费观看视频| 亚洲视频香蕉人妖| 91香蕉视频mp4| 亚洲免费大片在线观看| 91一区二区在线观看| 亚洲美女视频一区| 欧美性猛交xxxxxxxx| 日日夜夜免费精品|