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

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

?? ucommon.pas

?? 抽象三層訪問數據庫示例
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
{*******************************************************}
{       軟件名稱: --通用--                              }
{       單元名稱: uCommon.pas                           }
{       中文名稱: 公共單元                              }
{       單元描述:                                       }
{       創    建: SamonHua                              }
{       創建日期: 2007-12-18                            }
{       修    改: 參見VSS記錄                           }
{       版權所有 (C)2002-2007 深圳壹平臺信息技術有限公司}
{*******************************************************}
unit uCommon;

interface

uses
  Windows, Messages, SysUtils, Classes, StrUtils, Variants, WinSock, Math,
  DB, DBClient;

type
  //文件版本號
  TVersionNumber = packed record
    Minor: Word;
    Major: Word;
    Build: Word;
    Release: Word;
  end;

  //取字符串中的參數值
function GetParamValue(const AParams: string; const ParamName: string; IgnoreCase: boolean = false; ASplitStr: string = ';'; AEqualStr: string = '='): string; overload;
//向字符串中寫參數值
function SetParamValue(var AParams: string; const ParamName, ParamValue: string; AddFlag: boolean = false; IgnoreCase: boolean = false; ASplitStr: string = ';'; AEqualStr: string = '='): boolean;
//檢查字符串中某參數是否存在
function ParamExists(const AParams, ParamName: string; IgnoreCase: boolean = false; ASplitStr: string = ';'; AEqualStr: string = '='): boolean;
function CopySubStr(const AParentStr: string; const AIndex: integer = 0; const ASplitStr: string = ';'; const DefStr: string = ''): string;
function SubStrCount(const AParentStr: string; const ASplitStr: string = ';'): integer; //取子串數量
procedure SearchFiles(AResultFileList: TStrings; const FilePath: string;
  const FileNameSpecifier: string = '*.*'; RecursiveSubDir: boolean = true); //查找文件
//取文件版本號
function GetFileVersionNumber(const FileName: string): TVersionNumber;
//取文件版本字符串
function GetFileVersionStr(const FileName: string): string;
function GetGUID: string;
function GetTempDirectory: string;
function GetSysDirectory: String;
function DeleteDirectory(Dir: string): boolean;
function ZipFile(AZipFileName: string; AFileNames: string; AParams: string = ''): boolean;
function UnZipFile(AZipFileName: string; AFilePath: string; AParams: string = ''): boolean;
procedure GetComputerIPName(var AIP, AName: string);
procedure CopyStringToPChar(Source: string; Target: PChar; TargetSize: Integer);
procedure CopyWideStringToPWideChar(Source: WideString; Target: PWideChar; TargetSize: Integer);
function StringToArray(Source: string): Variant;
function GetWideString(const s: string): WideString;
function GetString(const s: WideString): string;
function GetCurrentModuleFileName: string;
//異常信息處理
function GetLastErrorCode: Integer;
function GetLastErrorMessage: string;
function GetRaiseException: boolean;
procedure SetLastErrorCode(const Value: Integer);
procedure SetLastErrorMessage(const Value: string);
procedure SetLastError(const ErrorMessage: string = ''; const ErrorCode: Integer = 0);
procedure SetRaiseException(const Value: boolean);
procedure SetLastErrorInfo(AException: Exception; const ErrorCode: Integer = 0); overload;
procedure SetLastErrorInfo(const ErrorMessage: string = ''; const ErrorCode: Integer = 0); overload;
procedure SetLastErrorInfo(const ErrorMessageFormat: string; const Args: array of const; const ErrorCode: Integer = 0); overload;
//數據集操作
function GetDataSetActiveIndex(DataSet: TDataSet): integer;
function GetDataSetFieldValue(DataSet: TDataSet; FieldNames: string; RecordIndex: Integer): Variant;
function CreateClientDataSet(SourceDataSet, TargetDataSet: TCustomClientDataSet): boolean;
//清空列表對象
procedure ClearList(List: TList; FreeItems: Boolean = false);

implementation

var
  //定義DLL異常變量,而不直接把異常拋出DLL。外面無法捕獲到原始的錯誤信息。
  GlobalLastErrorCode: integer;
  GlobalLastErrorMessage: string;
  GlobalRaiseException: boolean;

function GetParamValue(const AParams, ParamName: string;
  IgnoreCase: boolean; ASplitStr, AEqualStr: string): string;
var
  strParams, strParamsOriginal, strParamName, strSplitStr, strEqualStr, strWildcard: string;
  ParamPos, EqualPos, SplitPos: integer;
begin
  //得到"abc=123;xyz=666;mnq=888"這類字符串中的某項的值,如ParamName="xyz"返回"666"
  result := '';
  strParamsOriginal := trim(AParams);
  //檢查AEqualStr的通配符(如果AEqualStr為"=",那么參數值中有"="符號就可用"=="代替),ASplitStr不支持通配符
  strWildcard := '?';
  if strWildcard = AEqualStr then
    AEqualStr := '^';
  strParamsOriginal := StringReplace(strParamsOriginal, AEqualStr + AEqualStr, DupeString(strWildcard, 5), [rfReplaceAll]);
  if IgnoreCase then
  begin
    strParams := lowercase(trim(AParams));
    strParamName := lowercase(ParamName);
    strSplitStr := lowercase(ASplitStr);
    strEqualStr := lowercase(AEqualStr);
  end
  else
  begin
    strParams := trim(AParams);
    strParamName := ParamName;
    strSplitStr := ASplitStr;
    strEqualStr := AEqualStr;
  end;
  if strParams = '' then
    exit;
  strParams := StringReplace(strParams, strEqualStr + strEqualStr, DupeString(strWildcard, 5), [rfReplaceAll]);
  if copy(strParams, 1, length(strSplitStr)) <> strSplitStr then
  begin
    strParams := strSplitStr + strParams;
    strParamsOriginal := strSplitStr + strParamsOriginal;
  end;
  if copy(strParams, length(strParams) - length(strSplitStr) - 1, length(strSplitStr)) <> strSplitStr then
  begin
    strParams := strParams + strSplitStr;
    strParamsOriginal := strParamsOriginal + strSplitStr;
  end;
  ParamPos := pos(strSplitStr + strParamName + strEqualStr, strParams); //得到參數位置
  if ParamPos = 0 then
    exit;
  delete(strParams, 1, ParamPos);
  delete(strParamsOriginal, 1, ParamPos); //對原字符串進行同樣操作
  EqualPos := pos(strEqualStr, strParams);
  delete(strParams, 1, EqualPos + length(strEqualStr) - 1);
  delete(strParamsOriginal, 1, EqualPos + length(strEqualStr) - 1);
  SplitPos := pos(strSplitStr, strParams);
  delete(strParamsOriginal, SplitPos, MaxInt); //delete(strParams, SplitPos, MaxInt);
  result := strParamsOriginal;
  result := StringReplace(result, DupeString(strWildcard, 5), AEqualStr, [rfReplaceAll]);
end;

function SetParamValue(var AParams: string; const ParamName, ParamValue: string;
  AddFlag, IgnoreCase: boolean; ASplitStr, AEqualStr: string): boolean;
var
  strParams, strParamName, strRightStr: string;
  intPos: integer;
begin
  //AParams: 源字符串,形如"a=111;b=222;c;d=333"
  //AddFlag: 字符串中沒有該參數時,true表示自動新增,false則什么都不做返回false
  //IgnoreCase: 參數名忽略大小寫
  result := false;
  if (trim(AParams) = '') and not AddFlag then
    exit;
  strParams := ASplitStr + AParams + ASplitStr;
  strParamName := ParamName;
  if IgnoreCase then
  begin
    strParams := lowercase(strParams);
    strParamName := lowercase(strParamName);
  end;
  intPos := pos(ASplitStr + strParamName + AEqualStr, strParams);
  if intPos > 0 then
  begin
    intPos := intPos - length(ASplitStr);
    strRightStr := AParams;
    delete(strRightStr, 1, intPos + length(strParamName) + 1);
    if pos(ASplitStr, strRightStr) > 0 then
      delete(strRightStr, 1, pos(ASplitStr, strRightStr) - 1)
    else
      strRightStr := '';
    AParams := copy(AParams, 1, intPos + length(strParamName) + 1) + ParamValue + strRightStr;
  end
  else if AddFlag then
  begin
    if trim(AParams) <> '' then
      AParams := AParams + ASplitStr + ParamName + AEqualStr + ParamValue
    else
      AParams := ParamName + AEqualStr + ParamValue;
  end
  else
    exit;
  result := true;
end;

function ParamExists(const AParams, ParamName: string; IgnoreCase: boolean; ASplitStr, AEqualStr: string): boolean;
var
  strParams, strParamName: string;
begin
  //AParams: 源字符串,形如"a=111;b=222;c;d=333"
  //IgnoreCase: 參數名忽略大小寫
  //如"abc=124;efg=333"和"abc;efg=333"檢查"abc"都返回True
  result := false;
  if trim(AParams) = '' then
    exit;
  strParams := ASplitStr + AParams + ASplitStr;
  strParamName := ParamName;
  if IgnoreCase then
  begin
    strParams := lowercase(strParams);
    strParamName := lowercase(strParamName);
  end;
  result := (pos(ASplitStr + strParamName + AEqualStr, strParams) > 0) or (pos(ASplitStr + strParamName + ASplitStr, strParams) > 0);
end;

function CopySubStr(const AParentStr: string; const AIndex: integer;
  const ASplitStr, DefStr: string): string;
var
  strParentStr, strSplit: string;
  i, intPos, intOldPos, intCount, intLength: integer;
begin
  result := ''; //比原有算法快
  strParentStr := AParentStr;
  if (strParentStr = '') or (AIndex < 0) then
  begin
    result := DefStr;
    exit;
  end;
  if ASplitStr = '' then
  begin
    if AIndex = 0 then
      result := strParentStr
    else
      result := '';
    exit;
  end;
  strParentStr := strParentStr + ASplitStr;
  intLength := length(strParentStr);
  strSplit := '';
  intPos := 0;
  intOldPos := 0;
  intCount := 0;
  for i := 1 to intLength do
  begin
    if strSplit <> '' then
      strSplit := strSplit + strParentStr[i]
    else if strParentStr[i] = ASplitStr[1] then
      strSplit := strParentStr[i];
    if strSplit = ASplitStr then
    begin
      inc(intCount);
      intOldPos := intPos;
      intPos := i - length(strSplit) + 1;
      strSplit := '';
    end
    else if Copy(ASplitStr, 1, length(strSplit)) <> strSplit then
      strSplit := '';
    if intCount = (AIndex + 1) then
    begin
      if AIndex > 0 then
      begin
        intPos := intPos - intOldPos - length(ASplitStr);
        intOldPos := intOldPos + length(ASplitStr);
      end
      else
      begin
        intOldPos := 1;
        intPos := intPos - 1;
      end;
      result := copy(strParentStr, intOldPos, intPos);
      break;
    end;
  end;
  if result = '' then
    result := DefStr;
end;

function SubStrCount(const AParentStr, ASplitStr: string): integer;
var
  strParentStr: string;
  i: integer;
begin
  if AParentStr = '' then
  begin
    result := -1;
    exit;
  end;
  result := 0;
  strParentStr := AParentStr;
  i := pos(ASplitStr, strParentStr);
  while i <> 0 do
  begin
    delete(strParentStr, 1, i);
    i := pos(ASplitStr, strParentStr);
    inc(result);
  end;
end;

procedure SearchFiles(AResultFileList: TStrings; const FilePath: string;
  const FileNameSpecifier: string; RecursiveSubDir: boolean);
var
  strPath: string;
  srFindFile: TSearchRec;
  procedure AddFileToList;
  begin
    if (srFindFile.Name <> '.') and (srFindFile.Name <> '..')
      and (AResultFileList.IndexOf(strPath + srFindFile.Name) = -1) then
      AResultFileList.Add(strPath + srFindFile.Name);
    //application.ProcessMessages;
  end;

  procedure SearchSubDir;
  begin
    if (srFindFile.Name <> '.') and (srFindFile.Name <> '..') and ((srFindFile.attr and fadirectory) = fadirectory) then
      SearchFiles(AResultFileList, strPath + srFindFile.Name, FileNameSpecifier, RecursiveSubDir);
  end;
begin
  //AResultFileList: 保存查找到的文件列表
  //FilePath: 查找路徑
  //FileNameSpecifier: 查找文件名
  //RecursiveSubDir: 是否遞歸子路徑
  if AResultFileList = nil then
    exit;
  if FilePath[length(FilePath)] <> '\' then
    strPath := FilePath + '\'
  else
    strPath := FilePath;
  try
    if FindFirst(strPath + FileNameSpecifier, faAnyFile and faDirectory, srFindFile) = 0 then
    begin
      AddFileToList;
      while FindNext(srFindFile) = 0 do
        AddFileToList;
    end;
  finally
    FindClose(srFindFile);
  end;
  try
    if RecursiveSubDir and (0 = FindFirst(strPath + '*', faAnyFile, srFindFile)) then
    begin
      SearchSubDir;
      while FindNext(srFindFile) = 0 do
        SearchSubDir;
    end;
  finally
    FindClose(srFindFile);
  end;
end;

function GetFileVersionNumber(const FileName: string): TVersionNumber;
var
  VersionInfoBufferSize: DWORD;
  dummyHandle: DWORD;
  VersionInfoBuffer: Pointer;
  FixedFileInfoPtr: PVSFixedFileInfo;
  VersionValueLength: UINT;
begin
  FillChar(Result, SizeOf(Result), 0);
  if not FileExists(FileName) then
    Exit;

  VersionInfoBufferSize := GetFileVersionInfoSize(PChar(FileName), dummyHandle);
  if VersionInfoBufferSize = 0 then
    Exit;

  GetMem(VersionInfoBuffer, VersionInfoBufferSize);
  try
    try
      Win32Check(GetFileVersionInfo(PChar(FileName), dummyHandle,
        VersionInfoBufferSize, VersionInfoBuffer));
      Win32Check(VerQueryValue(VersionInfoBuffer, '\',
        Pointer(FixedFileInfoPtr), VersionValueLength));
    except
      Exit;
    end;
    Result.Major := FixedFileInfoPtr^.dwFileVersionMS shr 16;
    Result.Minor := FixedFileInfoPtr^.dwFileVersionMS;
    Result.Release := FixedFileInfoPtr^.dwFileVersionLS shr 16;
    Result.Build := FixedFileInfoPtr^.dwFileVersionLS;
  finally
    FreeMem(VersionInfoBuffer);
  end;
end;

function GetFileVersionStr(const FileName: string): string;
begin
  with GetFileVersionNumber(FileName) do
    Result := Format('%d.%d.%d.%d', [Major, Minor, Release, Build]);
end;

function GetGUID: string;
var
  recGUID: TGUID;
begin
  CreateGUID(recGUID);
  Result := GUIDToString(recGUID);
end;

function GetTempDirectory: string;
var
  TempDir: array[0..255] of Char;
begin
  GetTempPath(255, @TempDir);
  Result := StrPas(TempDir);
  if (Result <> '') and (Result[Length(Result)] <> '\') then
    Result := Result + '\';
end;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看不卡一区| 麻豆成人久久精品二区三区小说| 国产一区二区女| 久久免费精品国产久精品久久久久| 99这里都是精品| 国产精品成人一区二区三区夜夜夜| 大美女一区二区三区| 国产精品久久久久久久久动漫 | 国产亚洲欧美一级| 国产成人免费在线观看不卡| 国产精品视频在线看| 99精品视频在线播放观看| 亚洲视频小说图片| 538在线一区二区精品国产| 日韩电影免费一区| 久久久精品免费网站| 91污片在线观看| 日韩国产精品久久| 国产欧美日韩亚州综合| 色94色欧美sute亚洲线路二| 日韩高清不卡一区二区| 日本一区二区不卡视频| 欧亚一区二区三区| 激情伊人五月天久久综合| 国产精品久久久久一区| 精品视频999| 粉嫩绯色av一区二区在线观看| 最好看的中文字幕久久| 日韩欧美久久久| 色网站国产精品| 国产一区二区调教| 亚洲国产一区视频| 26uuu国产日韩综合| 色哟哟欧美精品| 美国十次了思思久久精品导航| 久久综合九色综合欧美就去吻| 成人av片在线观看| 亚洲午夜一区二区| 国产亚洲污的网站| 国产呦精品一区二区三区网站| 亚洲视频一区二区免费在线观看 | 亚洲高清免费在线| 2023国产精华国产精品| 韩国精品在线观看| 国产精品久久久久久久久久久免费看| 欧美剧在线免费观看网站| 国产一区二区免费在线| 亚洲三级小视频| 精品欧美一区二区三区精品久久 | 中文字幕精品综合| 欧美日韩国产bt| 99久久精品国产网站| 麻豆精品一区二区综合av| 欧美激情艳妇裸体舞| 日韩免费性生活视频播放| 99在线精品视频| 另类小说视频一区二区| 一区二区三区丝袜| 国产亚洲va综合人人澡精品| 欧美日韩高清不卡| 国产99久久久国产精品免费看| 91蜜桃免费观看视频| 在线观看三级视频欧美| xnxx国产精品| 成人手机在线视频| 亚洲国产精品成人久久综合一区| 亚洲午夜激情网站| 欧美亚洲一区二区在线观看| 亚洲美腿欧美偷拍| 欧美无人高清视频在线观看| 亚洲精品美国一| 国产精品一区二区三区乱码 | 欧美福利视频一区| 不卡区在线中文字幕| 久久91精品久久久久久秒播| 亚洲综合在线五月| 国产精品人人做人人爽人人添| 日韩女优毛片在线| 欧美美女一区二区三区| 欧美日韩久久久| 欧美午夜精品电影| 色成人在线视频| 色呦呦国产精品| 色狠狠桃花综合| 成人污污视频在线观看| 国产福利一区在线| 国产一区二区在线视频| 国产精品18久久久久久久久| 久久精品国产99国产精品| 久久精品国产久精国产| 捆绑调教一区二区三区| 免费观看91视频大全| 蜜臀av在线播放一区二区三区 | 精品久久久影院| 日韩久久精品一区| 精品国产网站在线观看| 亚洲精品一线二线三线无人区| 日韩一区二区影院| 精品免费国产二区三区| 欧美精品一区男女天堂| 日韩欧美美女一区二区三区| 欧美精品一区二区三| 91精品国产丝袜白色高跟鞋| 欧美一级欧美三级| 久久综合精品国产一区二区三区 | 福利一区在线观看| 成人深夜视频在线观看| 99re热视频这里只精品| aaa欧美色吧激情视频| 欧美日韩国产一区| 日韩视频在线观看一区二区| 精品福利在线导航| 欧美激情综合网| 一区二区三区高清在线| 日韩精品1区2区3区| 毛片av一区二区| 国产一区二区三区美女| 91丨九色丨黑人外教| 欧美在线观看一区二区| 91麻豆精品国产自产在线观看一区| 欧美一个色资源| 国产欧美精品日韩区二区麻豆天美| 一区在线播放视频| 亚洲18影院在线观看| 麻豆成人免费电影| 97se亚洲国产综合在线| 欧美日韩电影在线播放| 日韩欧美中文字幕一区| 国产农村妇女精品| 亚洲一区中文在线| 经典三级一区二区| 99久久伊人精品| 日韩欧美一级精品久久| 国产精品麻豆视频| 日韩不卡一区二区三区| 成人黄色小视频在线观看| 精品视频一区三区九区| 国产午夜亚洲精品理论片色戒 | 日韩免费观看高清完整版在线观看| 国产三级精品视频| 亚洲18色成人| 不卡的电影网站| 日韩免费看的电影| 国产精品美女视频| 国产综合一区二区| 欧美日韩国产精品成人| 国产精品福利一区| 毛片一区二区三区| 欧美视频一区在线| 中文字幕一区二区在线播放| 青青草精品视频| 在线视频亚洲一区| 国产精品第五页| 久久国产免费看| 欧美日韩国产高清一区| 一区在线观看视频| 国产精品一区不卡| 精品精品国产高清一毛片一天堂| 亚洲乱码国产乱码精品精98午夜| 国模冰冰炮一区二区| 欧美久久婷婷综合色| 亚洲日穴在线视频| 国产91精品欧美| 久久这里只有精品首页| 免费高清在线视频一区·| 在线欧美小视频| 国产精品三级视频| 日本成人中文字幕在线视频| 欧美日韩三级一区| 亚洲免费av在线| 99国产精品99久久久久久| 久久九九99视频| 韩国精品久久久| 26uuu色噜噜精品一区| 国产电影一区二区三区| 精品国产伦一区二区三区免费| 日韩成人av影视| 欧美精品高清视频| 日韩国产欧美一区二区三区| 精品视频一区二区三区免费| 夜夜嗨av一区二区三区中文字幕| 91丝袜高跟美女视频| 成人欧美一区二区三区在线播放| 色综合久久综合中文综合网| 国产精品欧美综合在线| 国产不卡视频在线观看| 日本一区二区综合亚洲| 成人v精品蜜桃久久一区| 国产精品久久久一区麻豆最新章节| 国产成人精品一区二区三区四区| 精品99一区二区三区| 国产成人av自拍| 国产欧美一区二区精品婷婷| 极品少妇xxxx偷拍精品少妇| 久久亚区不卡日本| 成人激情小说乱人伦| 亚洲三级电影网站| 欧美另类一区二区三区| 免费看黄色91| 国产欧美一区二区三区鸳鸯浴|