zoukankan      html  css  js  c++  java
  • 公用函数(博客用户)

    使用方法, uses 本单元——>使用如:Pub.MsgBox('你好,欢迎使用本公用函数!');

    ShowMessage(Pub.PathExeDir);



    //////////////////////以下源码开始

    {$DEFINE Delphi6}//D5下不要此句

    unit PubFuncUnit;
    interface
    uses Windows, SysUtils, ShellAPI, Messages, Classes, Forms, Controls, ComCtrls,
    Dialogs, Graphics, Registry, winsock, ComObj, WinInet,FileCtrl
    {$IFDEF Delphi6},Variants{$EndIf};

    const

    DEFAULT_DELIMITERS = [' ', #9, #10, #13];//空格分隔

    type

    TMyClass = class

    private

    procedure CleanDirectoryProc(sFileName: string; var bContinue: Boolean);

    end;

    TEnumDirectoryFileProc = procedure (Filename: string; var bContinue: Boolean) of object;

    type

    TPub = class

    private

    procedure ProcessTimer1Timer(Sender: TObject);

    public

    //封装API ShellExecute// 0:隐含窗口,1:显示窗口....其他参考帮助

    function MyShellExecute(const sFileName: string; sPara: string= ''; sAction :string = 'Open';

    flag: integer = 1): LongInt;

    //在进程中运行//如:Pub.Execute('C:\WINNT\system32\net.exe send huo aa',true,true,nil);

    function MyExecute(const Command: string; bWaitExecute: Boolean;

    bShowWindow: Boolean; PI: PProcessInformation): Boolean;



    //文件操作部分起

    //拷贝一个文件,封装CopyFile

    procedure FileCopyFile(const sSrcFile, sDstFile: string);

    //给定路径复制文件到同一目录下 bRecursive:true所有

    procedure FileCopyDirectory(sDir, tDir: string; bRecursive: Boolean);overload;

    //给定路径原样复制文件 ,自编

    procedure FileCopyDirectory(sDir, tDir: string);overload;

    //给定路径原样复制文件 ,用WinAPI ,若原目录下有相同文件则再生成一个

    procedure FileCopyDirectory(sDir, tDir:string;AHandle:Thandle);overload;

    //移动文件夹

    procedure FileMoveDirectory(sDir, tDir:string;AHandle:Thandle);

    //删除给定路径及以下的所有路径和文件

    procedure FileDeleteDirectory(sDir: string);overload;

    //删除给定路径及以下的所有路径和文件 用WinApi

    procedure FileDeleteDirectory(AHandle: THandle;const ADirName: string);overload;

    //删除给定路径及以下的所有路径和文件 到回收站

    procedure FileDeleteDirectoryToCycle(AHandle: THandle;const ADirName: string);

    //取得指定文件的大小

    function FileGetFileSize(const Filename: string): DWORD;

    //在Path下取得唯一FilenameX文件

    function FileGetUniqueFileName(const Path: string; Filename: string): string;

    //取得临时文件

    function FileGetTemporaryFileName: string;



    //取得系统路径

    function PathGetSystemPath: string;

    //取得Windows路径

    function PathGetWindowsPath: string;

    //给定文件名取得在系统目录下的路径,复制时用

    function PathSystemDirFile(const Filename: string): string;

    //给定文件名取得在Windows目录下的路径,复制时用

    function PathWindowsDirFile(const Filename: string): string;

    //给定文件名取得在系统盘下的路径,复制时用

    function PathSystemDriveFile(const Filename: string): string;

    //路径最后有'/'则去'/'

    function PathWithoutSlash(const Path: string): string;

    //路径最后没有'/'则加'/'

    function PathWithSlash(const Path: string): string;

    //取得两路径的不同部分,条件是前半部分相同

    function PathRelativePath(BaseDir, FilePath: string): string;

    //取得去掉属性的路径,文件名也作为DIR

    function PathExtractFileNameNoExt(Filename: string): string;

    //判断两路径是否相等

    function PathComparePath(const Path1, Path2: string): Boolean;

    //取得给定路径的父路径

    function PathParentDirectory(Path: string): string;

    //分割路径,Result=根(如d:)sPath = 除根外的其他部分

    function PathGetRootDir(var sPath: string): string;

    //取得路径最后部分和其他部分 如d:\aa\aa result:=aa sPath:=d:\aa\

    function PathGetLeafDir(var sPath: string): string;

    //取得当前应用程序的路径

    function PathExeDir(FileName: string = ''): string;

    //文件操作部分止



    //系统处理起

    //提示窗口

    procedure MsgBox(const Msg: string);

    //错误显示窗口

    procedure MsgErrBox(const Msg: string);

    //询问窗口 带'是','否'按钮

    function MsgYesNoBox(const Msg: string): Boolean;

    //询问窗口 带'是','否,'取消'按钮//返回值smbYes,smbNo,smbCancel

    function MsgYesNoCancelBox(const Msg: string): Integer;

    //使鼠标变忙和恢复正常

    procedure DoBusy(Busy: Boolean);

    //显示错误信息

    procedure ShowLastError(const Msg: string = 'API Error');

    //发出错误信息

    procedure RaiseLastError(const Msg: string = 'API Error');

    //释放Strings连接的相关资源

    procedure FreeStringsObjects(SL: TStrings);

    //系统处理止



    //时间处理起

    //整数到时间

    function TimeT_To_DateTime(TimeT: Longint): TDateTime;

    //转化为秒

    function TimeToSecond(const H, M, S: Integer): Integer;

    //秒转化

    procedure TimeSecondToTime(const secs: Integer; var H, M, S: Word);

    //秒转化

    function TimeSecondToTimeStr(secs: Integer): string;

    //时间处理止



    //控件处理起

    //设置控件是否能使用

    procedure ConEnableControl(AControl: TControl; Enable: Boolean);

    //设置控件是否能使用,包子控件

    procedure ConEnableChildControls(AControl: TControl; Enable: Boolean);

    procedure ConEnableClassControl(AControl: TControl; Enable: Boolean;

    ControlClass: TControlClass);

    procedure ConFree(aCon: TWinControl);//释放aCon上的控件

    //从文件本中导入,类似LoadfromFile

    procedure ConLoadTreeViewFromTextFile(Nodes: TTreeNodes; Filename: string);

    //存为文本,类似SaveToFile

    procedure ConSaveTreeViewToTextFile(Nodes: TTreeNodes; Filename: string);

    //在控件上写文本

    procedure ConWriteText(aContr: TControl;sText: string);

    //控件处理止

    //字符串处理起

    //取以Delimiters分隔的字符串 bTrail如果为True则把第index个后的也取出来

    function StrGetToken(const S: string; index: Integer;

    bTrail: Boolean = False;

    Delimiters: TSysCharSet = DEFAULT_DELIMITERS): string;

    //取以Delimiters分隔的字符串的个数

    function StrCountWords(S: string; Delimiters: TSysCharSet =

    DEFAULT_DELIMITERS): Integer;

    //用NewToken替换S中所有Token bCaseSensitive:=true大小写敏感

    function StrReplaceString(var S: string; const Token,

    NewToken: string; bCaseSensitive: Boolean): Boolean;

    //从第Index个起以Substr替换Count个字符

    procedure StrSimple_ReplaceString(var S: string;

    const Substr: string; index, Count: Integer);

    //去掉S中的回车返行符

    procedure StrTruncateCRLF(var S: string);

    //判定S是否以回车返行符结束

    function StrIsContainingCRLF(const S: string): Boolean;

    //把SL中的各项数据转化为以Delimiter分隔的Str

    function StrCompositeStrings(SL: TStrings; const Delimiter: string): string;

    //封装TStrings的LoadFromFile

    function StrSafeLoadStrings(SL: TStrings; const Filename: string): Boolean;

    //封装TStrings的SaveToFile

    procedure StrSafeSaveStrings(SL: TStrings; const Filename: string);

    //字符串处理止



    //字体处理起

    procedure StringToFont(sFont: string; Font: TFont; bIncludeColor: Boolean = True);

    function FontToString(Font: TFont; bIncludeColor: Boolean = True): string;

    //字体处理止



    //网络起

    //判定是否在线

    function NetJudgeOnline:boolean;

    //得到本机的局域网Ip地址

    Function NetGetLocalIp(var LocalIp:string): Boolean;

    //通过Ip返回机器名

    Function NetGetNameByIPAddr(IPAddr: string; var MacName: string): Boolean ;

    //获取网络中SQLServer列表

    Function NetGetSQLServerList(var List: Tstringlist): Boolean;

    //获取网络中的所有网络类型

    Function NetGetNetList(var List: Tstringlist): Boolean;

    //获取网络中的工作组

    Function NetGetGroupList(var List: TStringList): Boolean;

    //获取工作组中所有计算机

    Function NetGetUsers(GroupName: string; var List: TStringList): Boolean;

    //获取网络中的资源

    Function NetGetUserResource(IpAddr: string; var List: TStringList): Boolean;

    //映射网络驱动器

    Function NetAddConnection(NetPath: Pchar; PassWord: Pchar;LocalPath: Pchar): Boolean;

    //检测网络状态

    Function NetCheckNet(IpAddr:string): Boolean;

    //检测机器是否登入网络

    Function NetCheckMacAttachNet: Boolean;

    //判断Ip协议有没有安装 这个函数有问题

    Function NetIsIPInstalled : boolean;

    //检测机器是否上网

    Function NetInternetConnected: Boolean;

    //网络止



    //窗口起

    function FormCreateProcessFrm(MsgTitle: string):TForm;

    //窗口止



    //EMail起

    function CheckMailAddress(Text: string): boolean;

    //EMail止

    end;



    var

    Pub: TPub;



    implementation

    uses ExtCtrls, StdCtrls, TFlatProgressBarUnit;

    { TMyClass }

    const

    csfsBold = '|Bold';

    csfsItalic = '|Italic';

    csfsUnderline = '|Underline';

    csfsStrikeout = '|Strikeout';

    C_Err_GetLocalIp = '获取本地ip失败';

    C_Err_GetNameByIpAddr = '获取主机名失败';

    C_Err_GetSQLServerList = '获取SQLServer服务器失败';

    C_Err_GetUserResource = '获取共享资失败';

    C_Err_GetGroupList = '获取所有工作组失败';

    C_Err_GetGroupUsers = '获取工作组中所有计算机失败';

    C_Err_GetNetList = '获取所有网络类型失败';

    C_Err_CheckNet = '网络不通';

    C_Err_CheckAttachNet = '未登入网络';

    C_Err_InternetConnected ='没有上网';

    C_Txt_CheckNetSuccess = '网络畅通';

    C_Txt_CheckAttachNetSuccess = '已登入网络';

    C_Txt_InternetConnected ='上网了';



    procedure TMyClass.CleanDirectoryProc(sFileName: string; var bContinue: Boolean);

    var

    Attr: Integer;

    begin

    Attr := FileGetAttr(sFileName);

    Attr := (not faReadOnly) and Attr; // Turn off ReadOnly attribute

    Attr := (not faHidden) and Attr; // Turn off Hidden attribute

    FileSetAttr(sFileName, Attr);



    if Attr and faDirectory <> 0 then

    RMDir(sFileName)

    else

    SysUtils.DeleteFile(sFileName);

    end;



    { TPub }



    function TPub.PathWithoutSlash(const Path: string): string;

    begin

    if (Length(Path) > 0) and (Path[Length(Path)] = '\') then Result := Copy(Path, 1, Length(Path) - 1)

    else Result := Path;

    end;



    function TPub.PathWithSlash(const Path: string): string;

    begin

    Result := Path;

    if (Length(Result) > 0) and (Result[Length(Result)] <> '\') then Result := Result + '\';

    end;



    function TPub.PathRelativePath(BaseDir, FilePath: string): string;

    begin

    Result := FilePath;

    BaseDir := AnsiUpperCaseFileName(PathWithSlash(BaseDir));

    FilePath := AnsiUpperCaseFileName(FilePath);

    if Copy(FilePath, 1, Length(BaseDir)) = BaseDir then

    Delete(Result, 1, Length(BaseDir));

    end;



    function TPub.MyShellExecute(const sFileName: string; sPara: string= ''; sAction :string = 'Open';

    flag: integer = 1): LongInt;

    begin

    Result := ShellExecute(Application.Handle, PChar(sAction), PChar(sFileName), PChar(sPara), PChar(''), flag);// > 32;

    if Result < 33 then RaiseLastError('ShellExecute');

    end;



    function TPub.MyExecute(const Command: string; bWaitExecute: Boolean; bShowWindow: Boolean; PI: PProcessInformation): Boolean;

    var

    StartupInfo : TStartupInfo;

    ProcessInformation: TProcessInformation;

    begin

    FillChar(StartupInfo, SizeOf(TStartupInfo), 0);

    with StartupInfo do

    begin

    cb := SizeOf(TStartupInfo);

    dwFlags := STARTF_USESHOWWINDOW;

    if bShowWindow then

    wShowWindow := SW_NORMAL

    else

    wShowWindow := SW_HIDE;

    end;



    Result := CreateProcess(nil, PChar(Command),

    nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil,

    StartupInfo, ProcessInformation);



    if not Result then Exit;



    if bWaitExecute then

    WaitForSingleObject(ProcessInformation.hProcess, INFINITE);



    if Assigned(PI) then

    Move(ProcessInformation, PI^, SizeOf(ProcessInformation));

    end;



    function TPub.PathExtractFileNameNoExt(Filename: string): string;

    begin

    Result := Copy(Filename, 1, Length(Filename) - Length(ExtractFileExt(Filename)));

    end;



    function TPub.FileGetFileSize(const Filename: string): DWORD;

    var

    HFILE: THandle;

    begin

    HFILE := CreateFile(PChar(Filename), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    if HFILE <> INVALID_HANDLE_VALUE then

    begin

    Result := GetFileSize(HFILE, nil);

    CloseHandle(HFILE);

    end else

    Result := 0;

    end;



    procedure TPub.FileCopyFile(const sSrcFile, sDstFile: string);

    begin

    if AnsiCompareFileName(sSrcFile, sDstFile) <> 0 then

    CopyFile(PChar(sSrcFile), PChar(sDstFile), False);

    end;





    function TPub.FileGetTemporaryFileName: string;

    var

    Buf, Buf1: array[0..255] of Char;

    begin

    GetTempPath(255, @Buf);

    GetTempFileName(@Buf, 'xpd', 0, @Buf1);

    Result := StrPas(@Buf1);

    end;



    function TruncateTrailNumber(var S: string): Integer;//取得逗号分开的两数,后数据必为合法整数222,333 s := 222 result := 333

    var

    I: Integer;

    begin

    Result := -1;



    I := Pos(',', S);

    if I <> 0 then

    begin

    Result := StrToIntDef(Copy(S, I + 1, Length(S)), - 1);

    Delete(S, I, Length(S));

    end;

    end;



    function TruncateTrailIfNotDLL(S: string): string;

    begin

    Result := S;

    TruncateTrailNumber(S);



    if (CompareText(ExtractFileExt(S), '.DLL') <> 0) and

    (CompareText(ExtractFileExt(S), '.ICL') <> 0) and

    (CompareText(ExtractFileExt(S), '.EXE') <> 0) then Result := S;

    end;



    function TPub.PathParentDirectory(Path: string): string;

    var

    iLastAntiSlash: Integer;



    function CountAntiSlash: Integer;

    var

    I: Integer;

    begin

    Result := 0;

    I := 1;

    repeat

    if IsDBCSLeadByte(Ord(Path[I])) then

    Inc(I, 2)

    else

    begin

    if Path[I] = '\' then

    begin

    iLastAntiSlash := I;

    Inc(Result);

    end;

    Inc(I);

    end;

    until I > Length(Path);

    end;



    function UpOneDirectory: string;

    begin

    Result := Copy(Path, 1, iLastAntiSlash); // with slash

    end;



    begin

    // 'c:\windows\system\' => 'c:\window\'

    // 'f:\' => 'f:\'

    // '\\xshadow\f\fonts' => '\\xshadow\f\'

    // '\\xshadow\f\' => '\\xshadow\f\'

    Path := PathWithoutSlash(Path);



    if Length(Path) > 3 then

    begin

    if (Path[1] = '\') and (Path[2] = '\') then

    begin

    if CountAntiSlash > 3 then

    Result := UpOneDirectory;

    end else

    begin

    if CountAntiSlash > 1 then

    Result := UpOneDirectory;

    end;

    end else Result := Path;

    end;


    function TPub.PathSystemDirFile(const Filename: string): string;

    var

    Buf: array[0..255] of Char;

    begin

    GetSystemDirectory(@Buf, 255);

    Result := PathWithSlash(StrPas(@Buf)) + Filename;

    end;



    function TPub.PathWindowsDirFile(const Filename: string): string;

    var

    Buf: array[0..255] of Char;

    begin

    GetWindowsDirectory(@Buf, 255);

    Result := PathWithSlash(StrPas(@Buf)) + Filename;

    end;



    function TPub.PathSystemDriveFile(const Filename: string): string;

    var

    Buf: array[0..255] of Char;

    begin

    GetSystemDirectory(@Buf, 255);

    Result := PathWithSlash(ExtractFileDrive(StrPas(@Buf))) + Filename;

    end;



    function TPub.PathComparePath(const Path1, Path2: string): Boolean;

    begin

    Result := AnsiCompareFileName(PathWithoutSlash(Path1), PathWithoutSlash(Path2)) = 0;

    end;

    procedure EnumDirectoryFiles(sDir, SMASK: string; Attr: Integer; EnumDirectoryFileProc: TEnumDirectoryFileProc);

    var

    SearchRec: TSearchRec;

    Status : Integer;

    bContinue: Boolean;

    begin

    sDir := Pub.PathWithSlash(sDir);



    // traverse child directories

    Status := FindFirst(sDir + '*.*', faDirectory, SearchRec);

    try

    while Status = 0 do

    begin

    if (SearchRec.name <> '.') and (SearchRec.name <> '..') then

    EnumDirectoryFiles(sDir + SearchRec.name, SMASK, Attr, EnumDirectoryFileProc);



    Status := FindNext(SearchRec);

    end;

    finally

    SysUtils.FindClose(SearchRec);

    end;



    // exam each valid file and invoke the callback func

    Status := FindFirst(sDir + SMASK, faAnyFile, SearchRec);

    try

    while Status = 0 do

    begin

    if (SearchRec.Attr and Attr <> 0) and (FileExists(sDir + SearchRec.name) or DirectoryExists(sDir + SearchRec.name)) and

    not ((SearchRec.Attr and faDirectory <> 0) and ((SearchRec.name = '.') or (SearchRec.name = '..'))) then

    begin

    bContinue := True;

    EnumDirectoryFileProc(sDir + SearchRec.name, bContinue);

    if not bContinue then Break;

    end;



    Status := FindNext(SearchRec);

    end;

    finally

    SysUtils.FindClose(SearchRec);

    end;

    end;



    procedure TPub.FileDeleteDirectory(sDir: string);

    begin

    //if not MsgYesNoBox('确信要删除该目录及以下所有文件夹和文件吗?') then exit;

    with TMyClass.Create do

    try

    EnumDirectoryFiles(sDir, '*.*', faAnyFile, CleanDirectoryProc);

    finally

    Free;

    end;

    RMDir(sDir);

    end;



    procedure TPub.FileDeleteDirectory(AHandle: THandle;const ADirName: string);

    var

    SHFileOpStruct:TSHFileOpStruct;

    DirName: PChar;

    BufferSize: Cardinal;

    begin

    // 调用shFileOperation函数可以实现对目录的拷贝、移动、重命名或删除操作

    BufferSize := length(ADirName) + 2;

    GetMem(DirName,BufferSize);

    try

    FIllChar(DirName^, BufferSize, 0);

    StrCopy(DirName,PChar(ADirName));

    with SHFileOpStruct do

    begin

    Wnd := AHandle;

    WFunc := FO_DELETE;

    pFrom := DirName;

    pTO := nil;

    fFlags := FOF_ALLOWUNDO;



    fAnyOperationsAborted := false;

    hNameMappings := nil;

    lpszProgressTitle := nil;

    end;

    if SHFileOperation(SHFileOpStruct) <> 0 then

    Raiselastwin32Error;

    finally

    FreeMem(DirName,BufferSize);

    end;

    end;



    procedure TPub.FileDeleteDirectoryToCycle(AHandle: THandle;const ADirName: string);

    var

    SHFileOpStruct:TSHFileOpStruct;

    DirName: PChar;

    BufferSize: Cardinal;

    aa: string;

    begin

    // 调用shFileOperation函数可以实现对目录的拷贝、移动、重命名或删除操作

    if not DirectoryExists(ADirName) then

    begin

    aa := ADirName;

    MsgBox('不存在文件夹“' + PathGetLeafDir(aa) + '”,删除失败!');

    exit;

    end;

    BufferSize := length(ADirName) + 2;

    GetMem(DirName,BufferSize);

    try

    FIllChar(DirName^, BufferSize, 0);

    StrCopy(DirName,PChar(ADirName));

    with SHFileOpStruct do

    begin

    Wnd := AHandle;

    WFunc := FO_DELETE;

    pFrom := DirName;

    pTO := nil;

    fFlags := FOF_ALLOWUNDO;



    fAnyOperationsAborted:=false;

    hNameMappings:=nil;

    lpszProgressTitle:=nil;

    end;

    if SHFileOperation(SHFileOpStruct) <> 0 then

    Raiselastwin32Error;

    finally

    FreeMem(DirName,BufferSize);

    end;

    end;



    procedure TPub.FileCopyDirectory(sDir, tDir: string; bRecursive: Boolean);

    var

    SearchRec: TSearchRec;

    Status : Integer;

    begin

    sDir := PathWithSlash(sDir);

    tDir := PathWithSlash(tDir);



    Status := FindFirst(sDir + '*.*', faAnyFile, SearchRec);

    try

    while Status = 0 do

    begin

    if bRecursive and (SearchRec.Attr and faDirectory = faDirectory) then

    begin

    if (SearchRec.name <> '.') and (SearchRec.name <> '..') then

    FileCopyDirectory(sDir + SearchRec.name, tDir, bRecursive);

    end else FileCopyFile(sDir + SearchRec.name, tDir + SearchRec.name);



    Status := FindNext(SearchRec);

    end;

    finally

    SysUtils.FindClose(SearchRec);

    end;

    end;



    function TPub.FileGetUniqueFileName(const Path: string; Filename: string): string;

    var

    I : Integer;

    sExt: string;

    begin

    Result := Filename;



    sExt := ExtractFileExt(Filename);

    Filename := PathExtractFileNameNoExt(Filename);



    I := 1;

    repeat

    if not FileExists(PathWithSlash(Path) + Result) then Break;



    Result := Filename + IntToStr(I) + sExt;

    Inc(I);

    until False;



    Result := PathWithSlash(Path) + Filename + sExt;

    end;





    function TPub.PathGetSystemPath: string;

    var

    Buf: array[0..255] of Char;

    begin

    GetSystemDirectory(@Buf, 255);

    Result := PathWithSlash(StrPas(@Buf));

    end;



    function TPub.PathGetWindowsPath: string;

    var

    Buf: array[0..255] of Char;

    begin

    GetWindowsDirectory(@Buf, 255);

    Result := PathWithSlash(StrPas(@Buf));

    end;



    function TPub.PathGetRootDir(var sPath: string): string;

    var

    I: Integer;

    begin

    I := AnsiPos('\', sPath);

    if I <> 0 then

    Result := Copy(sPath, 1, I)

    else

    Result := sPath;



    Delete(sPath, 1, Length(Result));

    Result := PathWithoutSlash(Result);

    end;



    function TPub.PathGetLeafDir(var sPath: string): string;

    begin

    sPath := PathWithoutSlash(sPath);

    Result := ExtractFileName(sPath);

    sPath := ExtractFilePath(sPath);

    end;

    //系统部分

    procedure TPub.MsgBox(const Msg: string);

    begin

    Application.MessageBox(PChar(Msg), PChar(Application.Title), MB_ICONINFORMATION);

    end;



    procedure TPub.MsgErrBox(const Msg: string);

    begin

    Application.MessageBox(PChar(Msg), PChar(Application.Title), MB_ICONERROR);

    end;



    function TPub.MsgYesNoBox(const Msg: string): Boolean;

    begin

    Result := Application.MessageBox(PChar(Msg), PChar(Application.Title), MB_ICONQUESTION or

    MB_YESNO or MB_DEFBUTTON1) = IDYES;

    end;



    function TPub.MsgYesNoCancelBox(const Msg: string): Integer;

    begin

    Result := Application.MessageBox(PChar(Msg),

    PChar(Application.Title), MB_ICONQUESTION or MB_YESNOCANCEL or MB_DEFBUTTON1)

    end;



    procedure TPub.DoBusy(Busy: Boolean);

    var

    Times: Integer;

    begin

    Times := 0;

    if Busy then

    begin

    Inc(Times);

    if Times = 1 then Screen.Cursor := crHourGlass;

    end else

    begin

    dec(Times);

    if Times = 0 then Screen.Cursor := crDefault;

    end;

    end;



    function GetLastErrorStr: string;

    var

    Buf: PChar;

    begin

    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,

    nil, GetLastError, LANG_USER_DEFAULT, @Buf, 0, nil);

    try

    Result := StrPas(Buf);

    finally

    LocalFree(HLOCAL(Buf));

    end;

    end;



    procedure TPub.ShowLastError(const Msg: string = 'API Error');

    begin

    MsgBox(Msg + ': ' + GetLastErrorStr);

    end;



    procedure TPub.RaiseLastError(const Msg: string = 'API Error');

    begin

    raise Exception.Create(Msg + ': ' + GetLastErrorStr);

    end;



    procedure TPub.FreeStringsObjects(SL: TStrings);

    var

    I: Integer;

    begin

    for I := 0 to SL.count - 1 do

    if assigned(SL.objects[I]) then

    begin

    Dispose(pointer(SL.objects[I]));

    SL.objects[I] := nil;

    end;

    end;

    //以下时间

    function TPub.TimeT_To_DateTime(TimeT: Longint): TDateTime;

    var

    ts: TTimeStamp;

    begin

    Dec(TimeT, 3600 * 8); // still unprecise

    ts.Time := (TimeT mod 86400) * 1000;

    ts.Date := TimeT div 86400 + 719163;

    Result := TimeStampToDateTime(ts);

    end;



    function TPub.TimeToSecond(const H, M, S: Integer): Integer;

    begin

    Result := H * 3600 + M * 60 + S;

    end;



    procedure TPub.TimeSecondToTime(const secs: Integer; var H, M, S: Word);

    begin

    H := secs div 3600;

    M := (secs mod 3600) div 60;

    S := secs mod 60;

    end;



    function TPub.TimeSecondToTimeStr(secs: Integer): string;

    var

    H, M, S: Word;

    begin

    TimeSecondtotime(secs, h, m, s);



    result := '';

    if h <> 0 then Result := result + format('%-.2d  ', [h]);

    if m <> 0 then Result := result + format('%-.2d だ ', [m]);

    if s <> 0 then Result := result + format('%-.2d  ', [s]);

    end;



    //以下控件

    procedure TPub.ConEnableControl(AControl: TControl; Enable: Boolean);

    var

    I: Integer;

    begin

    AControl.Enabled := Enable;

    if AControl is TWinControl then

    with TWinControl(AControl) do

    begin

    for I := 0 to ControlCount - 1 do

    ConEnableControl(Controls[I], Enable);

    end;

    end;



    procedure TPub.ConEnableChildControls(AControl: TControl; Enable: Boolean);

    var

    I: Integer;

    begin

    if AControl is TWinControl then

    with TWinControl(AControl) do

    begin

    for I := 0 to ControlCount - 1 do

    ConEnableControl(Controls[I], Enable);

    end;

    end;



    procedure TPub.ConEnableClassControl(AControl: TControl; Enable: Boolean; ControlClass: TControlClass);

    var

    I: Integer;

    begin

    if (AControl is ControlClass) then AControl.Enabled := Enable;



    if AControl is TWinControl then

    with TWinControl(AControl) do

    begin

    for I := 0 to ControlCount - 1 do

    ConEnableClassControl(Controls[I], Enable, ControlClass);

    end;

    end;



    function ParseRPLNo(var Msg: string): Integer;

    var

    S: string;

    begin

    S := Pub.StrGetToken(Msg, 1,False );

    Result := StrToIntDef(S, 0);

    Msg := Pub.StrGetToken(Msg, 2,True );

    end;



    procedure TPub.ConLoadTreeViewFromTextFile(Nodes: TTreeNodes; Filename: string);

    var

    F: TextFile;



    function ProcessNode(Node: TTreeNode; LevelNo: Integer): TTreeNode;

    var

    S : string;

    No: Integer;

    begin

    Result := Node;

    repeat

    readln(F, S);

    No := ParseRPLNo(S);

    if No > LevelNo then

    begin

    Node := ProcessNode(Nodes.addchild(Node, S), No);

    end else if No < LevelNo then

    begin

    Result := Nodes.Add(Node.Parent, S);

    Exit;

    end else

    Node := Nodes.Add(Node, S);



    until EOF(F);

    end;



    begin

    Assignfile(F, Filename);

    reset(F);



    ProcessNode(nil, 1);



    CloseFile(F);

    end;



    procedure TPub.ConSaveTreeViewToTextFile(Nodes: TTreeNodes; Filename: string);

    var

    F: TextFile;



    procedure ProcessNode(Node: TTreeNode; Depth: Integer);

    begin

    while Node <> nil do

    begin

    Writeln(F, IntToStr(Depth) + ' ' + Node.Text);



    if Node.HasChildren then

    ProcessNode(Node.GetFirstChild, Depth + 1);



    Node := Node.getNextSibling;

    end;

    end;



    begin

    Assignfile(F, Filename);

    rewrite(F);



    ProcessNode(Nodes.GetFirstNode, 1);



    CloseFile(F);

    end;



    //以下字符串

    function TPub.StrGetToken(const S: string; index: Integer; bTrail: Boolean = False;

    Delimiters: TSysCharSet = DEFAULT_DELIMITERS): string;

    var

    I, W, head, tail: Integer;

    bInWord : Boolean;

    begin

    I := 1;

    W := 0;

    bInWord := False;

    head := 1;

    tail := Length(S);

    while (I <= Length(S)) and (W <= index) do

    begin

    if S[I] in Delimiters then

    begin

    if (W = index) and bInWord then tail := I - 1;

    bInWord := False;

    end else

    begin

    if not bInWord then

    begin

    bInWord := True;

    Inc(W);

    if W = index then head := I;

    end;

    end;



    Inc(I);

    end;



    if bTrail then tail := Length(S);

    if W >= index then Result := Copy(S, head, tail - head + 1)

    else Result := '';

    end;



    function TPub.StrCountWords(S: string; Delimiters: TSysCharSet = DEFAULT_DELIMITERS): Integer;

    var

    bInWord: Boolean;

    I : Integer;

    begin

    Result := 0;

    I := 1;

    bInWord := False;

    while I <= Length(S) do

    begin

    if S[I] in Delimiters then bInWord := False

    else

    begin

    if not bInWord then

    begin

    bInWord := True;

    Inc(Result);

    end;

    end;



    Inc(I);

    end;

    end;



    function TPub.StrIsContainingCRLF(const S: string): Boolean;

    var

    len: Integer;

    begin

    len := Length(S);

    Result := (len >= 2) and (S[len - 1] = #13) and (S[len] = #10);

    end;



    procedure TPub.StrTruncateCRLF(var S: string);

    var

    I: Integer;

    begin

    I := 1;

    while I <= Length(S) do

    if (S[I] = #13) or (S[I] = #10) then Delete(S, I, 1)

    else Inc(I);

    end;


    function TPub.StrReplaceString(var S: string; const Token, NewToken: string; bCaseSensitive: Boolean): Boolean;

    var

    I : Integer;

    sFirstPart: string;

    begin

    if bCaseSensitive then

    I := AnsiPos(Token, S)

    else

    I := AnsiPos(AnsiUpperCase(Token), AnsiUpperCase(S));



    if I <> 0 then

    begin

    sFirstPart := Copy(S, 1, I - 1) + NewToken;

    S := Copy(S, I + Length(Token), Maxint);

    end;



    Result := I <> 0;

    if Result then

    begin

    StrReplaceString(S, Token, NewToken, bCaseSensitive);

    S := sFirstPart + S;

    end;

    end;



    procedure TPub.StrSimple_ReplaceString(var S: string; const Substr: string; index, Count: Integer);

    begin

    S := Format('%s%s%s',[Copy(S, 1, index - 1), Substr, Copy(S, index + Count, Maxint)]);

    end;



    function TPub.StrCompositeStrings(SL: TStrings; const Delimiter: string): string;

    var

    I: Integer;

    begin

    Result := '';



    with SL do

    begin

    for I := 0 to Count - 2 do

    Result := Result + Strings[I] + Delimiter;

    if Count > 0 then

    Result := Result + Strings[Count - 1];

    end;

    end;



    function TPub.StrSafeLoadStrings(SL: TStrings; const Filename: string): Boolean;

    begin

    Result := False;

    repeat

    try

    if not FileExists(Filename) then Exit;

    SL.LoadFromFile(Filename);

    Result := True;

    Break;

    except

    Sleep(500);

    end;

    until False;

    end;



    procedure TPub.StrSafeSaveStrings(SL: TStrings; const Filename: string);

    begin

    ForceDirectories(ExtractFilePath(Filename));

    repeat

    try

    SL.SaveToFile(Filename);

    Break;

    except

    Sleep(500);

    end;

    until False;

    end;

    //以下字体

    function TPub.FontToString(Font: TFont; bIncludeColor: Boolean): string;

    var

    sStyle: string;

    begin

    with Font do

    begin

    // convert font style to string

    sStyle := '';



    if (fsBold in Style) then

    sStyle := sStyle + csfsBold;



    if (fsItalic in Style) then

    sStyle := sStyle + csfsItalic;



    if (fsUnderline in Style) then

    sStyle := sStyle + csfsUnderline;



    if (fsStrikeOut in Style) then

    sStyle := sStyle + csfsStrikeout;



    if ((Length(sStyle) > 0) and ('|' = sStyle[1])) then

    sStyle := Copy(sStyle, 2, Length(sStyle) - 1);



    Result := Format('"%s", %d, [%s]',[name, Size, sStyle]);

    if bIncludeColor then

    Result := Result + Format(', [%s]',[ColorToString(Color)]);

    end;

    end;



    procedure TPub.StringToFont(sFont: string; Font: TFont;

    bIncludeColor: Boolean);

    var

    P : Integer;

    sStyle: string; // Expected format:

    begin // "Arial", 9, [Bold], [clRed]

    with Font do //

    try

    // get font name

    P := Pos(',', sFont);

    name := Copy(sFont, 2, P - 3);

    Delete(sFont, 1, P);



    // get font size

    P := Pos(',', sFont);

    Size := StrToInt(Copy(sFont, 2, P - 2));

    Delete(sFont, 1, P);



    // get font style

    P := Pos(',', sFont);

    sStyle := '|' + Copy(sFont, 3, P - 4);

    Delete(sFont, 1, P);



    // get font color

    if bIncludeColor then

    Color := StringToColor(Copy(sFont, 3, Length(sFont) - 3));



    // convert str font style to

    // font style

    Style := [];



    if (Pos(csfsBold, sStyle) > 0) then

    Style := Style + [fsBold];



    if (Pos(csfsItalic, sStyle) > 0) then

    Style := Style + [fsItalic];



    if (Pos(csfsUnderline, sStyle) > 0) then

    Style := Style + [fsUnderline];



    if (Pos(csfsStrikeout, sStyle) > 0) then

    Style := Style + [fsStrikeOut];

    except

    end;

    end;



    procedure TPub.ConWriteText(aContr: TControl;sText: string);

    var

    c:TCanvas;

    begin

    c:=TControlCanvas.Create;

    TControlCanvas(c).Control := aContr;

    c.Font.Size := 12;// Brush.Style:=bsClear;

    c.Font.Color := clBlue;

    //c.Pen.Color:=clBlue;

    c.TextOut(1,1,sText);// Rectangle(5,5,15,15);

    c.Free;

    end;


    procedure TPub.FileCopyDirectory(sDir, tDir: string);

    var

    aWaitForm: TForm;

    RetValue: integer;

    procedure MyCopy(aDir, sDir: string);

    var

    sr: TSearchRec;

    begin

    aDir := PathWithSlash(aDir);

    sDir := PathWithSlash(sDir);

    if FindFirst(aDir+'*.*', faAnyFile, sr) = 0 then

    begin

    repeat

    if sr.Attr and faDirectory = faDirectory then

    begin

    if not DirectoryExists(aDir + sr.Name) then exit;

    if (sr.Name <> '.') and (sr.Name <> '..') then

    MyCopy(aDir + sr.Name,sDir + sr.Name);

    end else

    begin

    if (sr.Name <> '.') and (sr.Name <> '..') then

    begin

    ForceDirectories(sDir);

    Application.ProcessMessages;

    aWaitForm.Caption := '正在复制' + aDir + sr.Name;

    Application.ProcessMessages;

    FileCopyFile(aDir + sr.Name,sDir + sr.Name);//在线程中执行

    //MyThread1.sPath := aDir + sr.Name;

    //MyThread1.tPath := sDir + sr.Name;

    //MyThread1.flag := true;

    Application.ProcessMessages;

    end;

    end;

    until FindNext(sr) <> 0;

    FindClose(sr);

    end;

    end;

    begin

    if DirectoryExists(tDir) then

    begin

    if Pub.MsgYesNoBox('已存在该文件夹确信要覆盖吗?') then

    FileDeleteDirectory(tDir)

    else exit;

    end;

    aWaitForm := FormCreateProcessFrm('正在复制文件,请稍候...');

    try

    aWaitForm.Show;

    Application.ProcessMessages;

    MyCopy(sDir, tDir);

    finally

    ConFree(aWaitForm);//先释放Form上的控件

    aWaitForm.Free;

    aWaitForm := nil;

    end;

    end;

    procedure MyFileCopyDirectory(sDir, tDir:string;AHandle:Thandle;Flag: integer = 0);

    var

    fromdir,todir{,dirname}:pchar;

    SHFileOpStruct:TSHFileOpStruct;

    begin

    GetMem(fromdir,length(sDir)+2);

    try

    GetMem(todir,length(tdir)+2);

    try

    FIllchar(fromdir^,length(sDir)+2,0);

    FIllchar(todir^,length(tDir)+2,0);

    strcopy(fromdir,pchar(sDir));

    strcopy(todir,pchar(tDir));

    with SHFileOpStruct do

    begin

    wnd := AHandle;

    if Flag = 1 then

    WFunc := FO_MOVE

    else

    WFunc := FO_COPY;

    //该参数指明shFileOperation函数将执行目录的拷贝

    pFrom:=fromdir;

    pTO:=todir;

    fFlags:=FOF_NOCONFIRMATION OR FOF_RENAMEONCOLLISION;

    fAnyOperationsAborted:=false;

    hnamemappings:=nil;

    lpszprogresstitle:=nil;

    end;

    if shFileOperation(SHFileOpStruct)<>0 then

    Raiselastwin32Error;

    finally

    FreeMem(todir,length(tDir)+2);

    end;

    finally

    FreeMem(fromdir,length(sDir)+2);

    end;

    end;

    procedure TPub.FileMoveDirectory(sDir, tDir:string;AHandle:Thandle);

    var

    fromdir,todir{,dirname}:pchar;

    SHFileOpStruct:TSHFileOpStruct;

    begin

    // 调用shFileOperation函数可以实现对目录的拷贝、移动、重命名或删除操作

    if not DirectoryExists(sDir) then

    begin

    MsgBox('不存在源路径“' + sDir + '”,移动数据失败!');

    exit;

    end;

    if DirectoryExists(tDir) then

    begin

    if Pub.MsgYesNoBox('已存在该文件夹确信要覆盖吗?') then

    FileDeleteDirectory(tDir)

    else exit;

    end else

    if not MsgYesNoBox('不存在目标路径“' + tDir + '”,要创建吗?') then exit;



    ForceDirectories(tDir);

    MyFileCopyDirectory(sDir, tDir, AHandle, 1);

    end;



    procedure TPub.FileCopyDirectory(sDir, tDir:string;AHandle:Thandle);

    begin

    // 调用shFileOperation函数可以实现对目录的拷贝、移动、重命名或删除操作

    if not DirectoryExists(sDir) then

    begin

    MsgBox('不存在源路径“' + sDir + '”,复制失败!');

    exit;

    end;

    if DirectoryExists(tDir) then

    begin

    if Pub.MsgYesNoBox('已存在该文件夹确信要覆盖吗?') then

    FileDeleteDirectory(tDir)

    else exit;

    end else

    if not MsgYesNoBox('不存在目标路径“' + tDir + '”,要创建吗?') then exit;

    ForceDirectories(tDir);

    MyFileCopyDirectory(sDir, tDir, AHandle);

    end;

    //以下网络



    function TPub.NetJudgeOnline: boolean;

    var

    b: array[0..4] of Byte;

    begin

    with TRegistry.Create do

    try

    RootKey := HKEY_LOCAL_MACHINE;

    OpenKey('System\CurrentControlSet\Services\RemoteAccess',False);

    ReadBinaryData('Remote Connection',b,4);

    finally

    Free;

    end;

    if b[0]=0 then

    Result := true

    else

    Result := false;

    end;



    {=================================================================

    功 能: 检测机器是否登入网络

    参 数: 无

    返回值: 成功: True 失败: False

    备 注:

    版 本:

    1.0 2002/10/03 09:55:00

    =================================================================}

    Function TPub.NetCheckMacAttachNet: Boolean;

    begin

    Result := False;

    if GetSystemMetrics(SM_NETWORK) <> 0 then //所有连入网的

    Result := True;

    end;



    {=================================================================

    功 能: 返回本机的局域网Ip地址

    参 数: 无

    返回值: 成功: True, 并填充LocalIp 失败: False

    备 注:

    版 本:

    1.0 2002/10/02 21:05:00

    =================================================================}

    function TPub.NetGetLocalIP(var LocalIp: string): Boolean;

    var

    HostEnt: PHostEnt;

    Ip: string;

    addr: pchar;

    Buffer: array [0..63] of char;

    GInitData: TWSADATA;

    begin

    Result := False;

    try

    WSAStartup(2, GInitData);

    GetHostName(Buffer, SizeOf(Buffer));

    HostEnt := GetHostByName(buffer);

    if HostEnt = nil then Exit;

    addr := HostEnt^.h_addr_list^;

    ip := Format('%d.%d.%d.%d', [byte(addr [0]),

    byte (addr [1]), byte (addr [2]), byte (addr [3])]);

    LocalIp := Ip;

    Result := True;

    finally

    WSACleanup;

    end;

    end;



    {=================================================================

    功 能: 通过Ip返回机器名

    参 数:

    IpAddr: 想要得到名字的Ip

    返回值: 成功: 机器名 失败: ''

    备 注:

    inet_addr function converts a string containing an Internet

    Protocol dotted address into an in_addr.

    版 本:

    1.0 2002/10/02 22:09:00

    =================================================================}

    function TPub.NetGetNameByIPAddr(IPAddr : String;var MacName:String): Boolean;

    var

    SockAddrIn: TSockAddrIn;

    HostEnt: PHostEnt;

    WSAData: TWSAData;

    begin

    Result := False;

    if IpAddr = '' then exit;

    try

    WSAStartup(2, WSAData);

    SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));

    HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);

    if HostEnt <> nil then

    MacName := StrPas(Hostent^.h_name);

    Result := True;

    finally

    WSACleanup;

    end;

    end;



    {=================================================================

    功 能: 返回网络中SQLServer列表

    参 数:

    List: 需要填充的List

    返回值: 成功: True,并填充List 失败 False

    备 注:

    版 本:

    1.0 2002/10/02 22:44:00

    =================================================================}

    Function TPub.NetGetSQLServerList(var List: Tstringlist): boolean;

    var

    i: integer;

    SQLServer: Variant;

    ServerList: Variant;

    begin

    Result := False;

    List.Clear;

    try

    SQLServer := CreateOleObject('SQLDMO.Application');

    ServerList := SQLServer.ListAvailableSQLServers;

    for i := 1 to Serverlist.Count do

    list.Add (Serverlist.item(i));

    Result := True;

    Finally

    SQLServer := NULL;

    ServerList := NULL;

    end;

    end;



    {=================================================================

    功 能: 判断Ip协议有没有安装

    参 数: 无

    返回值: 成功: True 失败: False;

    备 注: 该函数还有问题

    版 本:

    1.0 2002/10/02 21:05:00

    =================================================================}

    Function TPub.NetIsIPInstalled : boolean;

    var

    WSData: TWSAData;

    ProtoEnt: PProtoEnt;

    begin

    Result := True;

    try

    if WSAStartup(2,WSData) = 0 then

    begin

    ProtoEnt := GetProtoByName('IP');

    if ProtoEnt = nil then

    Result := False

    end;

    finally

    WSACleanup;

    end;

    end;

    {=================================================================

    功 能: 返回网络中的共享资源

    参 数:

    IpAddr: 机器Ip

    List: 需要填充的List

    返回值: 成功: True,并填充List 失败: False;

    备 注:

    WNetOpenEnum function starts an enumeration of network

    resources or existing connections.

    WNetEnumResource function continues a network-resource

    enumeration started by the WNetOpenEnum function.

    版 本:

    1.0 2002/10/03 07:30:00

    =================================================================}

    Function TPub.NetGetUserResource(IpAddr: string; var List: TStringList): Boolean;

    type

    TNetResourceArray = ^TNetResource;//网络类型的数组

    Var

    i: Integer;

    Buf: Pointer;

    Temp: TNetResourceArray;

    lphEnum: THandle;

    NetResource: TNetResource;

    Count,BufSize,Res: DWord;

    Begin

    Result := False;

    List.Clear;

    if copy(Ipaddr,0,2) <> '\\' then

    IpAddr := '\\'+IpAddr; //填充Ip地址信息

    FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息

    NetResource.lpRemoteName := @IpAddr[1];//指定计算机名称

    //获取指定计算机的网络资源句柄

    Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY,

    RESOURCEUSAGE_CONNECTABLE, @NetResource,lphEnum);

    if Res <> NO_ERROR then exit;//执行失败

    while True do//列举指定工作组的网络资源

    begin

    Count := $FFFFFFFF;//不限资源数目

    BufSize := 8192;//缓冲区大小设置为8K

    GetMem(Buf, BufSize);//申请内存,用于获取工作组信息

    //获取指定计算机的网络资源名称

    Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);

    if Res = ERROR_NO_MORE_ITEMS then break;//资源列举完毕

    if (Res <> NO_ERROR) then Exit;//执行失败

    Temp := TNetResourceArray(Buf);

    for i := 0 to Count - 1 do

    begin

    //获取指定计算机中的共享资源名称,+2表示删除"\\",

    //如\\192.168.0.1 => 192.168.0.1

    List.Add(Temp^.lpRemoteName + 2);

    Inc(Temp);

    end;

    end;

    Res := WNetCloseEnum(lphEnum);//关闭一次列举

    if Res <> NO_ERROR then exit;//执行失败

    Result := True;

    FreeMem(Buf);

    End;



    {=================================================================

    功 能: 返回网络中的工作组

    参 数:

    List: 需要填充的List

    返回值: 成功: True,并填充List 失败: False;

    备 注:

    版 本:

    1.0 2002/10/03 08:00:00

    =================================================================}


    Function TPub.NetGetGroupList( var List : TStringList ) : Boolean;

    type

    TNetResourceArray = ^TNetResource;//网络类型的数组

    Var

    NetResource: TNetResource;

    Buf: Pointer;

    Count,BufSize,Res: DWORD;

    lphEnum: THandle;

    p: TNetResourceArray;

    i,j: SmallInt;

    NetworkTypeList: TList;

    Begin

    Result := False;

    NetworkTypeList := TList.Create;

    List.Clear;

    //获取整个网络中的文件资源的句柄,lphEnum为返回名柄

    Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,

    RESOURCEUSAGE_CONTAINER, Nil,lphEnum);

    if Res <> NO_ERROR then exit;//Raise Exception(Res);//执行失败

    //获取整个网络中的网络类型信息

    Count := $FFFFFFFF;//不限资源数目

    BufSize := 8192;//缓冲区大小设置为8K

    GetMem(Buf, BufSize);//申请内存,用于获取工作组信息

    Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);

    //资源列举完毕 //执行失败

    if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;

    P := TNetResourceArray(Buf);

    for i := 0 to Count - 1 do//记录各个网络类型的信息

    begin

    NetworkTypeList.Add(p);

    Inc(P);

    end;

    Res := WNetCloseEnum(lphEnum);//关闭一次列举

    if Res <> NO_ERROR then exit;

    for j := 0 to NetworkTypeList.Count-1 do //列出各个网络类型中的所有工作组名称

    begin//列出一个网络类型中的所有工作组名称

    NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息

    //获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄

    Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,

    RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);

    if Res <> NO_ERROR then break;//执行失败

    while true do//列举一个网络类型的所有工作组的信息

    begin

    Count := $FFFFFFFF;//不限资源数目

    BufSize := 8192;//缓冲区大小设置为8K

    GetMem(Buf, BufSize);//申请内存,用于获取工作组信息

    //获取一个网络类型的文件资源信息,

    Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);

    //资源列举完毕 //执行失败

    if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR) then break;

    P := TNetResourceArray(Buf);

    for i := 0 to Count - 1 do//列举各个工作组的信息

    begin

    List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称

    Inc(P);

    end;

    end;

    Res := WNetCloseEnum(lphEnum);//关闭一次列举

    if Res <> NO_ERROR then break;//执行失败

    end;

    Result := True;

    FreeMem(Buf);

    NetworkTypeList.Destroy;

    End;



    {=================================================================

    功 能: 列举工作组中所有的计算机

    参 数:

    List: 需要填充的List

    返回值: 成功: True,并填充List 失败: False;

    备 注:

    版 本:

    1.0 2002/10/03 08:00:00

    =================================================================}

    Function TPub.NetGetUsers(GroupName: string; var List: TStringList): Boolean;

    type

    TNetResourceArray = ^TNetResource;//网络类型的数组

    Var

    i: Integer;

    Buf: Pointer;

    Temp: TNetResourceArray;

    lphEnum: THandle;

    NetResource: TNetResource;

    Count,BufSize,Res: DWord;

    begin

    Result := False;

    List.Clear;

    FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息

    NetResource.lpRemoteName := @GroupName[1];//指定工作组名称

    NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;//类型为服务器(工作组)

    NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;

    NetResource.dwScope := RESOURCETYPE_DISK;//列举文件资源信息

    //获取指定工作组的网络资源句柄

    Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,

    RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);

    if Res <> NO_ERROR then Exit; //执行失败

    while True do//列举指定工作组的网络资源

    begin

    Count := $FFFFFFFF;//不限资源数目

    BufSize := 8192;//缓冲区大小设置为8K

    GetMem(Buf, BufSize);//申请内存,用于获取工作组信息

    //获取计算机名称

    Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);

    if Res = ERROR_NO_MORE_ITEMS then break;//资源列举完毕

    if (Res <> NO_ERROR) then Exit;//执行失败

    Temp := TNetResourceArray(Buf);

    for i := 0 to Count - 1 do//列举工作组的计算机名称

    begin

    //获取工作组的计算机名称,+2表示删除"\\",如\\wangfajun=>wangfajun

    List.Add(Temp^.lpRemoteName + 2);

    inc(Temp);

    end;

    end;

    Res := WNetCloseEnum(lphEnum);//关闭一次列举

    if Res <> NO_ERROR then exit;//执行失败

    Result := True;

    FreeMem(Buf);

    end;



    {=================================================================

    功 能: 列举所有网络类型

    参 数:

    List: 需要填充的List

    返回值: 成功: True,并填充List 失败: False;

    备 注:

    版 本:

    1.0 2002/10/03 08:54:00

    =================================================================}

    Function TPub.NetGetNetList(var List: Tstringlist): Boolean;

    type

    TNetResourceArray = ^TNetResource;//网络类型的数组

    Var

    p: TNetResourceArray;

    Buf: Pointer;

    i: SmallInt;

    lphEnum: THandle;

    NetResource: TNetResource;

    Count,BufSize,Res: DWORD;

    begin

    Result := False;

    List.Clear;

    Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,

    RESOURCEUSAGE_CONTAINER, Nil,lphEnum);

    if Res <> NO_ERROR then exit;//执行失败

    Count := $FFFFFFFF;//不限资源数目

    BufSize := 8192;//缓冲区大小设置为8K

    GetMem(Buf, BufSize);//申请内存,用于获取工作组信息

    Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);//获取网络类型信息

    //资源列举完毕 //执行失败

    if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;

    P := TNetResourceArray(Buf);

    for i := 0 to Count - 1 do//记录各个网络类型的信息

    begin

    List.Add(p^.lpRemoteName);

    Inc(P);

    end;

    Res := WNetCloseEnum(lphEnum); //关闭一次列举

    if Res <> NO_ERROR then exit; //执行失败

    Result := True;

    FreeMem(Buf); //释放内存

    end;

    {=================================================================

    功 能: 映射网络驱动器

    参 数:

    NetPath: 想要映射的网络路径

    Password: 访问密码

    Localpath 本地路径

    返回值: 成功: True 失败: False;

    备 注:

    版 本:

    1.0 2002/10/03 09:24:00

    =================================================================}

    Function TPub.NetAddConnection(NetPath: Pchar; PassWord: Pchar

    ;LocalPath: Pchar): Boolean;

    var

    Res: Dword;

    begin

    Result := False;

    Res := WNetAddConnection(NetPath,Password,LocalPath);

    if Res <> No_Error then exit;

    Result := True;

    end;



    {=================================================================

    功 能: 检测网络状态

    参 数:

    IpAddr: 被测试网络上主机的IP地址或名称,建议使用Ip

    返回值: 成功: True 失败: False;

    备 注:

    版 本:

    1.0 2002/10/03 09:40:00

    =================================================================}


    Function TPub.NetCheckNet(IpAddr: string): Boolean;

    type

    PIPOptionInformation = ^TIPOptionInformation;

    TIPOptionInformation = packed record

    TTL: Byte; // Time To Live (used for traceroute)

    TOS: Byte; // Type Of Service (usually 0)

    Flags: Byte; // IP header flags (usually 0)

    OptionsSize: Byte; // Size of options data (usually 0, max 40)

    OptionsData: PChar; // Options data buffer

    end;



    PIcmpEchoReply = ^TIcmpEchoReply;

    TIcmpEchoReply = packed record

    Address: DWord; // replying address

    Status: DWord; // IP status value (see below)

    RTT: DWord; // Round Trip Time in milliseconds

    DataSize: Word; // reply data size

    Reserved: Word;

    Data: Pointer; // pointer to reply data buffer

    Options: TIPOptionInformation; // reply options

    end;



    TIcmpCreateFile = function: THandle; stdcall;

    TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall;

    TIcmpSendEcho = function(

    IcmpHandle: THandle;

    DestinationAddress: DWord;

    RequestData: Pointer;

    RequestSize: Word;

    RequestOptions: PIPOptionInformation;

    ReplyBuffer: Pointer;

    ReplySize: DWord;

    Timeout: DWord

    ): DWord; stdcall;



    const

    Size = 32;

    TimeOut = 1000;

    var

    wsadata: TWSAData;

    Address: DWord; // Address of host to contact

    HostName, HostIP: String; // Name and dotted IP of host to contact

    Phe: PHostEnt; // HostEntry buffer for name lookup

    BufferSize, nPkts: Integer;

    pReqData, pData: Pointer;

    pIPE: PIcmpEchoReply; // ICMP Echo reply buffer

    IPOpt: TIPOptionInformation; // IP Options for packet to send

    const

    IcmpDLL = 'icmp.dll';

    var

    hICMPlib: HModule;

    IcmpCreateFile : TIcmpCreateFile;

    IcmpCloseHandle: TIcmpCloseHandle;

    IcmpSendEcho: TIcmpSendEcho;

    hICMP: THandle; // Handle for the ICMP Calls

    begin

    // initialise winsock

    Result:=True;

    if WSAStartup(2,wsadata) <> 0 then begin

    Result:=False;

    halt;

    end;

    // register the icmp.dll stuff

    hICMPlib := loadlibrary(icmpDLL);

    if hICMPlib <> null then begin

    @ICMPCreateFile := GetProcAddress(hICMPlib, 'IcmpCreateFile');

    @IcmpCloseHandle:= GetProcAddress(hICMPlib, 'IcmpCloseHandle');

    @IcmpSendEcho:= GetProcAddress(hICMPlib, 'IcmpSendEcho');

    if (@ICMPCreateFile = Nil) or (@IcmpCloseHandle = Nil) or (@IcmpSendEcho = Nil) then begin

    Result:=False;

    halt;

    end;

    hICMP := IcmpCreateFile;

    if hICMP = INVALID_HANDLE_VALUE then begin

    Result:=False;

    halt;

    end;

    end else begin

    Result:=False;

    halt;

    end;

    // ------------------------------------------------------------

    Address := inet_addr(PChar(IpAddr));

    if (Address = INADDR_NONE) then begin

    Phe := GetHostByName(PChar(IpAddr));

    if Phe = Nil then Result:=False

    else begin

    Address := longint(plongint(Phe^.h_addr_list^)^);

    HostName := Phe^.h_name;

    HostIP := StrPas(inet_ntoa(TInAddr(Address)));

    end;

    end

    else begin

    Phe := GetHostByAddr(@Address, 4, PF_INET);

    if Phe = Nil then Result:=False;

    end;



    if Address = INADDR_NONE then

    begin

    Result:=False;

    end;

    // Get some data buffer space and put something in the packet to send

    BufferSize := SizeOf(TICMPEchoReply) + Size;

    GetMem(pReqData, Size);

    GetMem(pData, Size);

    GetMem(pIPE, BufferSize);

    FillChar(pReqData^, Size, $AA);

    pIPE^.Data := pData;



    // Finally Send the packet

    FillChar(IPOpt, SizeOf(IPOpt), 0);

    IPOpt.TTL := 64;

    NPkts := IcmpSendEcho(hICMP, Address, pReqData, Size,

    @IPOpt, pIPE, BufferSize, TimeOut);

    if NPkts = 0 then Result:=False;



    // Free those buffers

    FreeMem(pIPE); FreeMem(pData); FreeMem(pReqData);



    // --------------------------------------------------------------

    IcmpCloseHandle(hICMP);

    FreeLibrary(hICMPlib);

    // free winsock

    if WSACleanup <> 0 then Result:=False;

    end;






    {=================================================================

    功 能: 检测计算机是否上网

    参 数: 无

    返回值: 成功: True 失败: False;

    备 注: uses Wininet

    版 本:

    1.0 2002/10/07 13:33:00

    =================================================================}

    function TPub.NetInternetConnected: Boolean;

    const

    // local system uses a modem to connect to the Internet.

    INTERNET_CONNECTION_MODEM = 1;

    // local system uses a local area network to connect to the Internet.

    INTERNET_CONNECTION_LAN = 2;

    // local system uses a proxy server to connect to the Internet.

    INTERNET_CONNECTION_PROXY = 4;

    // local system's modem is busy with a non-Internet connection.

    INTERNET_CONNECTION_MODEM_BUSY = 8;

    var

    dwConnectionTypes : DWORD;

    begin

    dwConnectionTypes := INTERNET_CONNECTION_LAN+INTERNET_CONNECTION_MODEM

    +INTERNET_CONNECTION_PROXY;

    //Result := InternetGetConnectedState(@dwConnectionTypes, 1);

    Result := InternetGetConnectedState(@dwConnectionTypes, 0);

    end;



    {等待窗口起}

    procedure TPub.ProcessTimer1Timer(Sender: TObject);

    var

    aForm: TForm;

    pr: TFlatProgressBar;

    lb: TLabel;

    aStr: String;

    begin

    aForm := TForm(TControl(Sender).Owner);

    TLabel(aForm.FindComponent('Label3')).Caption := TimeToStr(Now);

    lb := TLabel(aForm.FindComponent('Label2'));

    lb.Caption := aForm.Caption;

    aStr := lb.Caption;

    if length(aStr) > 50 then

    lb.Caption := Copy(aStr, 1, 20) + '...' + Copy(aStr, Length(aStr) - 30, 31);

    lb.Left := aForm.Width div 2 - lb.Width div 2;

    pr := TFlatProgressBar(aForm.FindComponent('FlatProgressBar1'));

    if pr = nil then exit;

    pr.StepIt;

    if pr.Position = 100 then

    pr.Position := 0;

    end;



    function TPub.FormCreateProcessFrm(MsgTitle: string): TForm;

    var

    Panel1, Panel2: TPanel;

    Label1, Label2, Label3: TLabel;

    FlatProgressBar1: TFlatProgressBar;

    Timer1: TTimer;

    begin

    Result := TForm.Create(Application);

    Result.Left := 192;

    Result.Top := 185;

    Result.BorderStyle := bsNone;

    Result.ClientHeight := 105;

    Result.ClientWidth := 392;

    Result.Color := $00D9FFD9;

    {$IFDEF DELPHI6}

    Result.Color := clMoneyGreen;

    {$ENDIF}

    Result.Font.Charset := GB2312_CHARSET;

    Result.Font.Color := clBlue;

    Result.Font.Height := -16;

    Result.Font.Name := '宋体';

    Result.Font.Style := [];

    Result.OldCreateOrder := False;

    Result.Position := poDesktopCenter;

    Result.PixelsPerInch := 96;



    {上面的控件}

    Panel1 := TPanel.Create(Result);

    Panel1.Align := alClient;

    Panel1.ParentColor := True;

    Panel1.TabOrder := 0;

    Panel1.Parent := Result;

    Panel1.Caption := '';



    Panel2 := TPanel.Create(Result);

    Panel2.Name := 'Panel2';

    Panel2.Align := alClient;

    Panel2.BevelOuter := bvLowered;

    Panel2.ParentColor := True;

    Panel2.TabOrder := 0;

    Panel2.Parent := Panel1;

    Panel2.Caption := '';



    Label2 := TLabel.Create(Result);

    Label2.Name := 'Label2';

    Label2.Alignment := taCenter;

    Label2.Left := 136;

    Label2.Top := 37;

    Label2.Width := 7;

    Label2.Height := 14;

    Label2.Font.Charset := GB2312_CHARSET;

    Label2.Font.Color := clOlive;

    Label2.Font.Height := -14;

    Label2.Font.Name := '宋体';

    Label2.Font.Style := [];

    Label2.ParentFont := False;

    Label2.Parent := Panel2;

    Label2.Caption := '';



    Label1 := TLabel.Create(Result);

    Label1.Name := 'Label1';

    Label1.Left := 104;

    Label1.Top := 15;

    Label1.Width := 152;

    Label1.Height := 16;

    Label1.Caption := MsgTitle;//'正在处理,请稍候...';

    Label1.Transparent := True;

    Label1.Parent := Panel2;



    FlatProgressBar1 := TFlatProgressBar.Create(Result);

    FlatProgressBar1.Parent := Panel2;

    FlatProgressBar1.Name := 'FlatProgressBar1';

    FlatProgressBar1.Left := 16;

    FlatProgressBar1.Top := 58;

    FlatProgressBar1.Width := 363;

    FlatProgressBar1.Height := 23;

    FlatProgressBar1.Color := 15532031;

    FlatProgressBar1.ColorElement := clPurple;

    FlatProgressBar1.ColorBorder := clGreen;

    FlatProgressBar1.ParentColor := False;

    FlatProgressBar1.Min := 0;

    FlatProgressBar1.Max := 100;

    FlatProgressBar1.Position := 5;

    FlatProgressBar1.Step := 5;



    Label3 := TLabel.Create(Result);

    Label3.Name := 'Label3';

    Label3.Left := 311;

    Label3.Top := 85;

    Label3.Width := 7;

    Label3.Height := 14;

    Label3.Font.Charset := GB2312_CHARSET;

    Label3.Font.Color := clRed;

    Label3.Font.Height := -14;

    Label3.Font.Name := '宋体';

    Label3.Font.Style := [];

    Label3.ParentFont := False;

    Label3.Parent := Panel2;

    Label3.Caption := '';



    Timer1 := TTimer.Create(Result);

    Timer1.Interval := 100;

    Timer1.OnTimer := ProcessTimer1Timer;

    end;

    {等待窗口止}



    procedure TPub.ConFree(aCon: TWinControl);

    var

    lp: integer;

    begin

    for lp := aCon.ComponentCount - 1 Downto 0 do

    aCon.Components[lp].Free;

    end;



    function TPub.CheckMailAddress(Text: string): boolean;

    var

    Index: integer;

    lp: integer;

    begin

    Result := false;

    if ((length(trim(Text)) > 20) or (Pos('.', Text) < 4))

    or (Pos('.HTM', UpperCase(Text)) > 0) or (Pos('.HTML', UpperCase(Text)) > 0)

    or (Pos('.ASP', UpperCase(Text)) > 0) or (Pos('.JSP', UpperCase(Text)) > 0) then exit;

    for lp := 1 to length(Text) do

    if (Ord(Text[lp]) > $80) and (Text[lp] <> '@') then exit;

    if (Pos('.', Text) < Pos('@', Text) + 1) then exit;

    Index := Pos('@', Text);

    if (Index < 2) or (Index >= Length(Text)) then exit;

    Result := true;

    end;



    function TPub.PathExeDir(FileName: string): string;

    begin

    Result := ExtractFilePath(ParamStr(0)) + FileName;

    end;



    initialization

    Pub := TPub.Create;



    finalization

    Pub.Free;



    end.
  • 相关阅读:
    Charles
    HttpRunner 接口自动化测试进阶
    HttpRunner 接口自动化简单实践
    Extract
    PyCharm配置gitHub远程仓储
    Python Unittest与数据驱动
    WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试)
    ARTS-S golang goroutines and channels
    ARTS-S golang goroutines and channels
    ARTS-S c语言统计程序运行时间
  • 原文地址:https://www.cnblogs.com/ghd2004/p/1265536.html
Copyright © 2011-2022 走看看