亚洲欧美第一页_禁久久精品乱码_粉嫩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精品欧美一区| 亚洲五月六月丁香激情| 日韩理论在线观看| 蜜桃av噜噜一区| 在线观看日韩精品| 国产精品午夜电影| 国精产品一区一区三区mba桃花 | 91精品国产综合久久精品麻豆| 久久久不卡网国产精品一区| 午夜精品福利一区二区三区av| av毛片久久久久**hd| 久久亚洲一区二区三区四区| 免费成人性网站| 欧美精品乱码久久久久久| 国产精品第一页第二页第三页| 国产精品一区二区三区乱码| 欧美成人一区二区三区在线观看| 午夜欧美一区二区三区在线播放| 99re这里都是精品| 国产精品国产三级国产aⅴ无密码| 美女视频一区二区| 国产成人精品一区二| 日韩精品一区二区三区在线观看 | 国产嫩草影院久久久久| 蜜桃久久av一区| 日韩精品一区二区三区视频播放| 日韩不卡免费视频| 日韩一区国产二区欧美三区| 日韩电影在线一区| 日韩免费在线观看| 久草这里只有精品视频| 精品日韩99亚洲| 国产一区二区剧情av在线| 久久蜜臀精品av| 国产精品1区2区| 国产精品丝袜91| 99久久777色| 亚洲一区二区三区不卡国产欧美| 91美女视频网站| 亚洲综合在线第一页| 欧美日韩午夜在线视频| 美女www一区二区| 久久午夜色播影院免费高清| 成人看片黄a免费看在线| 国产精品剧情在线亚洲| 在线免费观看日本一区| 午夜激情一区二区三区| 精品国产91久久久久久久妲己| 黄网站免费久久| 亚洲欧洲成人av每日更新| 91黄视频在线| 蜜臀精品一区二区三区在线观看| 精品国产欧美一区二区| 波多野结衣的一区二区三区| 亚洲国产日韩在线一区模特 | 中文字幕第一区| 日本道在线观看一区二区| 亚洲高清久久久| 26uuu欧美| 色综合天天综合| 日本va欧美va欧美va精品| 成人欧美一区二区三区小说| 国产成人亚洲精品狼色在线| 国产精品女上位| 欧美视频在线观看一区二区| 另类成人小视频在线| 国产精品色在线观看| 在线观看免费成人| 国产精品一线二线三线精华| 一区二区三区蜜桃| 久久久久久亚洲综合| 在线观看免费亚洲| 亚洲高清免费视频| 精品国产一区二区三区不卡| 91小视频免费观看| 国产麻豆视频精品| 亚洲成人精品一区二区| 久久久久久久久久看片| 色哟哟国产精品免费观看| 精品一区二区久久| 亚洲大片精品永久免费| 国产人成一区二区三区影院| 欧美喷潮久久久xxxxx| 99精品欧美一区二区三区小说| 日韩av不卡一区二区| 一区二区三区四区亚洲| 久久精品男人的天堂| 欧美一区二区高清| 欧美日韩小视频| 91网站在线播放| 不卡的av在线播放| 国产精品99久久久久久久女警| 日本中文一区二区三区| 亚洲一区免费视频| 亚洲裸体在线观看| 欧美经典一区二区| 精品嫩草影院久久| 欧美一区二区三区免费视频| 在线观看国产日韩| 色综合久久中文字幕| av在线综合网| 成人做爰69片免费看网站| 国精产品一区一区三区mba视频 | 欧美一区二区福利在线| 欧美日韩一区二区三区在线看| 99re视频精品| 色一区在线观看| 99在线视频精品| 成人精品国产免费网站| 成人精品亚洲人成在线| 盗摄精品av一区二区三区| 国产精品一区二区在线播放 | 亚洲国产精品99久久久久久久久| 欧美v日韩v国产v| 精品美女在线播放| 26uuu精品一区二区在线观看| 日韩欧美中文一区| 精品成人免费观看| 久久久99精品免费观看不卡| 久久精品在这里| 国产清纯白嫩初高生在线观看91 | 久久久久国产免费免费| 欧美激情一区二区三区蜜桃视频 | 久久天天做天天爱综合色| 欧美成人艳星乳罩| 久久伊人蜜桃av一区二区| 久久亚洲春色中文字幕久久久| 久久夜色精品国产欧美乱极品| 欧美激情综合五月色丁香小说| 国产精品久久久久一区| 亚洲精品视频在线| 亚洲高清免费一级二级三级| 美日韩黄色大片| 国产不卡在线视频| 一本久道中文字幕精品亚洲嫩| 在线一区二区观看| 日韩一区二区在线播放| 欧美激情一区在线| 亚洲一级不卡视频| 久久99久久精品欧美| www.日韩精品| 欧美日韩dvd在线观看| 久久久久久免费| 亚洲精品免费在线观看| 热久久国产精品| jvid福利写真一区二区三区| 欧美日韩你懂得| 久久精品夜夜夜夜久久| 亚洲国产美国国产综合一区二区| 久久精品国产免费| 91国模大尺度私拍在线视频| 日韩亚洲国产中文字幕欧美| 国产精品区一区二区三区 | 亚洲精品自拍动漫在线| 美女诱惑一区二区| 91黄视频在线| 久久精品亚洲乱码伦伦中文| 亚洲国产精品久久久久秋霞影院| 国产高清在线精品| 9191久久久久久久久久久| 国产精品乱码妇女bbbb| 免费观看30秒视频久久| 91久久精品日日躁夜夜躁欧美| 久久久久久日产精品| 日韩高清中文字幕一区| av激情亚洲男人天堂| 精品久久国产老人久久综合| 一区二区三区在线视频播放| 国产盗摄精品一区二区三区在线| 欧美网站一区二区| 亚洲欧洲美洲综合色网| 黑人巨大精品欧美黑白配亚洲| 欧美蜜桃一区二区三区| 亚洲女厕所小便bbb| 国产不卡视频在线播放| 欧美大胆一级视频| 五月天亚洲婷婷| 欧美视频一区二区三区在线观看| 国产精品区一区二区三区| 国产美女av一区二区三区| 日韩一级大片在线观看| 婷婷开心激情综合| 欧美日韩精品一区二区三区蜜桃 | 亚洲视频一区在线| 国产91精品精华液一区二区三区| 日韩三级.com| 奇米精品一区二区三区在线观看一| 欧美亚洲禁片免费| 亚洲欧美日韩在线| 91麻豆视频网站| 亚洲精品国产精华液| 91蜜桃网址入口| 一区二区三区蜜桃| 欧美亚洲国产一卡| 亚洲chinese男男1069| 欧美精品777| 日韩激情视频在线观看| 日韩一区二区免费视频| 蜜臀av性久久久久av蜜臀妖精| 日韩一级二级三级精品视频|