• 公用函数(博客用户)


    使用方法, 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.
  • 相关阅读:
    HDU 1800 Flying to the Mars 字典树,STL中的map ,哈希树
    字典树 HDU 1075 What Are You Talking About
    字典树 HDU 1251 统计难题
    最小生成树prim算法 POJ2031
    POJ 1287 Networking 最小生成树
    次小生成树 POJ 2728
    最短路N题Tram SPFA
    poj2236 并查集
    POJ 1611并查集
    Number Sequence
  • 原文地址:https://www.cnblogs.com/ghd2004/p/1265536.html
Copyright © 2020-2023  润新知