• Delphi编程地一些小程序


    Delphi编程地一些小程序

    1、用Enter键代替Tab键 
    在实际的程序开发中我们经常有这样的要求,用户不喜欢用Tab键,他希望用Enter键来代替。我们应该什么做呢? 
    首先:设定Form的KeyPreview属性为True。 
    其次:把Form上的所有Button的Default属性设为False。 
    最后:在Form的onKeyPress事件中添加如下代码: 
    procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin 
     if Key = #13 then 
     begin 
      Key := #0; 
      Perform(Wm_NextDlgCtl,0,0); 
     end; 
    end; 
    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:10:38 
    -- 
    2、命令行参数的使用 
    命令行参数的使用 
    Delphi提供了访问命令行参数的方便的方式,那就是使用ParamStr和ParamCount函数。其中ParamStr(0)返回的是当前程序名,如C:TESTMYPROG.EXE,ParamStr(1)返回第一个参数,以此类推;ParamCount则是参数个数。示例如下: 
      var 
      I: Word; 
      Y: Integer; 
      begin 
       Y := 10; 
       forI := 1 to ParamCount do 
    begin 
       Canvas.TextOut(5, Y, ParamStr(I)); 
       Y := Y + Canvas.TextHeight(ParamStr(I)) + 5; 
       end; 
      end; 

    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:10:48 
    -- 
    3、如何分行提示 
    Delphi中大部分控件都有一个实用的Hint属性,即浮动条提示。但有时提示较长,是否可以使得浮动提示条分行显示呢?其实,Hint是一个字符串(string),因而Delphi显示该字符串时会自动解释其中的回车控制符,所以只要加上回车控制符就可以了。依此原理,我们还能做出别具一格的垂直提示条。请先在form1中布置一个label,然后看示例代码: 
    procedure TForm1.FormCreate(Sender: TObject); 
    begin 
    label1.Hint :=\'垂\'+#13+\'直\'+#13+\'提\' +#13+\'示\'; 
    end; 

    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:10:58 
    -- 
    4、如何取得一个文件的文件类型呀 
    //要引用Shellapi单元 
    function MrsGetFileType(const strFilename: string): string; 
    var 
    FileInf TSHFileInfo; 
    begin 
    FillChar(FileInfo, SizeOf(FileInfo), #0); 
    SHGetFileInfo(PChar(strFilename), 0, FileInfo, SizeOf(FileInfo), SHGFI_TYPENAME); 
    Result := FileInfo.szTypeName; 
    end; 
    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:11:08 
    -- 
    5、取得当前操作平台 
    //定义在Type部分 
    TOSVersion = (osUnknown, os95, os95OSR2, os98, os98SE, osNT3, osNT4, os2K, osME,osXP); 
    { *获得操作系统} 
    function GetOS :String; 
    var 
    OS :TOSVersionInfo; 
    OSVersion:TOSVersion; 
    begin 
    ZeroMemory(@OS,SizeOf(OS)); 
    OS.dwOSVersionInfoSize:=SizeOf(OS); 
    GetVersionEx(OS); 
    OSVersion:=osUnknown; 
    if OS.dwPlatformId=VER_PLATFORM_WIN32_NT then 
    begin 
    case OS.dwMajorVersion of 
    3: OSVersion:=osNT3; 
    4: OSVersion:=osNT4; 
    5: begin 
    if OS.dwMinorVersion>=1 then 
    OSVersion:=osXP 
    else 
    OSVersion:=os2K; 
    end; 
    end; 
    end 
    else 
    begin 
    if (OS.dwMajorVersion=4) and (OS.dwMinorVersion=0) then 
    begin 
    OSVersion:=os95; 
    if (Trim(OS.szCSDVersion)=\'B\') then 
    OSVersion:=os95OSR2; 
    end 
    else 
    if (OS.dwMajorVersion=4) and (OS.dwMinorVersion=10) then 
    begin 
    OSVersion:=os98; 
    if (Trim(OS.szCSDVersion)=\'A\') then 
    OSVersion:=os98SE; 
    end 
    else 
    if (OS.dwMajorVersion=4) and (OS.dwMinorVersion=90) then 
    OSVersion:=osME; 
    end; 
    if OSVersion=osNT3 
    then Result:=\'Window NT3\'; 
    if OSVersion=OSNT4 
    then Result:=\'Window NT4\'; 
    if OSVersion=os2K 
    then Result:=\'Winodw 2000\'; 
    if OSVersion=osXp 
    then Result:=\'Winodw Xp\'; 
    if OSVersion=os95 
    then Result:=\'Window 95\'; 
    if OSVersion=os95OSR2 
    then Result:=\'Window 97\'; 
    if OSVersion=os98 
    then Result:=\'Winodw 98\'; 
    if OSVersion=os98SE 
    then Result:=\'Winodw 98SE\'; 
    if OSVersion=osME 
    then Result:=\'Winodw ME\'; 
    end; 

    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:11:17 
    -- 
    6、ListView 排序的实现 
    ListView 排序 

    怎样实现单击一下按升序,再单击一下按降序。 
    function CustomSortProc(Item1, Item2: TListItem; ColumnIndex: integer): integer; stdcall; 
    begin 
    if ColumnIndex = 0 then 
    Result := CompareText(Item1.Caption,Item2.Caption) 
    else 
    Result := CompareText(Item1.SubItems[ColumnIndex-1],Item2.SubItems[ColumnIndex-1]) 
    end; 
    procedure TFrmSrvrMain.ListView1ColumnClick(Sender: TObject; 
    Column: TListColumn); 
    begin 
    ListView1.CustomSort(@CustomSortProc,Column.Index); 
    end; 

    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:11:26 
    -- 
    7、获取本机的IP地址 
    {* 获取本机的IP地址} 
    function GetLocalIP: string; 
    type 
    TaPInAddr = array [0..10] of PInAddr; 
    PaPInAddr = ^TaPInAddr; 
    var 
    phe: PHostEnt; 
    pptr : PaPInAddr; 
    Buffer : array [0..63] of char; 
    I: Integer; 
    GInitData: TWSADATA; 
    begin 
    WSAStartup($101, GInitData); 
    Result := \'\'; 
    GetHostName(Buffer, SizeOf(Buffer)); 
    phe :=GetHostByName(buffer); 
    if phe = nil then Exit; 
    pptr := PaPInAddr(Phe^.h_addr_list); 
    I := 0; 
    while pptr^[i] <> nil do begin 
    result:=StrPas(inet_ntoa(pptr^[i]^)); 
    Inc(I); 
    end; 
    WSACleanup; 
    end; 
    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:11:36 
    -- 
    8、获取本机的计算机名称 
    {* 获取本机的计算机名称} 
    function TNet.GetLocalName: string; 
    var 
    CNameBuffer : PChar; 
    fl_loaded : Boolean; 
    CLen : ^DWord; 
    begin 
    GetMem(CNameBuffer,255); 
    New(CLen); 
    CLen^:= 255; 
    fl_loaded := GetComputerName(CNameBuffer,CLen^); 
    if fl_loaded then 
    GetLocalName := StrPas(CNameBuffer) 
    else 
    GetLocalName := \'未知\'; 
    FreeMem(CNameBuffer,255); 
    Dispose(CLen); 
    end; 

    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:11:45 
    -- 
    9、让程序只运行一个实例Windows 下一个典型的特征就是多任务,我们可以同时打开多个窗口进行操作,也可以同时运行程序的多个实例,比如可以打开许多个资源管理器进行文件的移动复制操作。但有时出于某种考虑(比如安全性),我们要做出一些限制,让程序只能够运行一个实例。在Delphi编程中,笔者总结出了以下几种方法: 
      一、 查找窗口法 
      这是最为简单的一种方法。在程序运行前用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到了,就说明已经存在一个实例。在项目源文件的初始化部分添加以下代码: 
      Program OneApp 
      Uses 
      Forms,Windows;(这里介绍的几种方法均需在项目源文件中添加Windows单元,以后不再重复了) 
      Var Hwnd:Thandle; 
      Begin 
       Hwnd:=FindWindow(‘TForm1’,‘SingleApp’); 
       If Hwnd=0 then 
       Begin 
       Application.Initialize; 
       Application.CreateForm(Tform1, Form1); 
       Application.Run; 
       End; 
      End; 
      FindWindow()函数带两个参数,FindWindow的第一个参数是类名,第二个参数是窗口标题,其中的一个参数可以忽略,但笔者强烈建议将两个参数都用上,免得凑巧别的程序也在使用相同的类名,就得不到正确的结果了。另外,如果是在Delphi IDE窗口中运行该程序,将一次都不能运行,因为已经存在相同类名和标题的窗口:设计时的窗体。 
      二、使用互斥对象 
      如果觉得查找窗口的方法效率不太高的话,可以使用创建互斥对象的方法。尽管互斥对象通常用于同步连接,但用在这个地方也是非常方便的。仅用了4句代码就轻松搞定。 
      VAR Mutex:THandle; 
      begin 
       Mutex:=CreateMutex(NIL,True,‘SingleApp’); 
       IF GetLastError<>ERROR_ALREADY_EXISTS THEN//如果不存在另一实例 
       BEGIN 
       Application.CreateHandle; 
       Application.CreateForm (TExpNoteForm, ExpNoteForm); 
       Application.Run; 
       END; 
       ReleaseMutex(Mutex); 
      end. 
      三、全局原子法 
      我们也可以利用向系统添加全局原子的方法,来防止多个程序实例的运行。全局原子由Windows 系统负责维持,它能保证其中的每个原子都是唯一的,管理其引用计数,并且当该全局原子的引用计数为0时,从内存中清除。我们用GlobalAddAtom 函数向全局原子添加一个255个字节以内的字符串,用GlobalFindAtom来检查是否已经存在该全局原子,最后在程序结束时用GlobalDeleteAtom函数删除添加的全局原子。示例如下: 
      Uses Windows 
      const iAtom=‘SingleApp’; 
      begin 
       if GlobalFindAtom(iAtom)=0 then 
       begin 
       GlobalAddAtom(iAtom); 
       Application.Initialize; 
       Application.CreateForm(TForm1,Form1); 
       Application.Run; 
       GlobalDeleteAtom(GlobalFindAtom(iAtom)); 
       end 
       else 
       MessageBox(0,‘You can not run a second copy of this App’,‘’,mb_OK); 
      end. 
      利用全局原子的引用计数规则,我们还可以判断当前共运行了该程序的多少个实例: 
      var i:Integer; 
      begin 
       I:=0; 
      while GlobalFindAtom(iAtom)<>0 do 
       begin 
       GlobalDeleteAtom(GlobalFindAtom(iAtom)); 
       i:=i+1; 
       end; 
       ShowMessage(IntToStr(I)); 
      end; 
      以上几种方法在笔者的Delphi 5.0,中文Windows2000下通过。 
    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:11:57 
    -- 
    10、计算字符串中中文的字数 
    function TotalChineseCount(ans: AnsiString): Integer; 
    var 
    wis: WideString; 
    begin 
    wis := WideString( ans ); 
    Result := Length( ans ) - Length( wis ); 
    end; 
    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:12:12 
    -- 
    11、Virtual key codes 
    Virtual Key Code Corresponding key 
    VK_LBUTTON Left mouse button 
    VK_RBUTTON Right mouse button 
    VK_CANCEL Control+Break 
    VK_MBUTTON Middle mouse button 
    VK_BACK Backspace key 
    VK_TAB Tab key 
    VK_CLEAR Clear key 
    VK_RETURN Enter key 
    VK_SHIFT Shift key 
    VK_CONTROL Ctrl key 
    VK_MENU Alt key 
    VK_PAUSE Pause key 
    VK_CAPITAL Caps Lock key 
    VK_KANA Used with IME 
    VK_HANGUL Used with IME 
    VK_JUNJA Used with IME 
    VK_FINAL Used with IME 
    VK_HANJA Used with IME 
    VK_KANJI Used with IME 
    VK_CONVERT Used with IME 
    VK_NONCONVERT Used with IME 
    VK_ACCEPT Used with IME 
    VK_MODECHANGE Used with IME 
    VK_ESCAPE Esc key 
    VK_SPACE Space bar 
    VK_PRIOR Page Up key 
    VK_NEXT Page Down key 
    VK_END End key 
    VK_HOME Home key 
    VK_LEFT Left Arrow key 
    VK_UP Up Arrow key 
    VK_RIGHT Right Arrow key 
    VK_DOWN Down Arrow key 
    VK_SELECT Select key 
    VK_PRINT Print key (keyboard-specific) 
    VK_EXECUTE Execute key 
    VK_SNAPSHOT Print Screen key 
    VK_INSERT Insert key 
    VK_DELETE Delete key 
    VK_HELP Help key 
    VK_LWIN Left Windows key (Microsoft keyboard) 
    VK_RWIN Right Windows key (Microsoft keyboard) 
    VK_APPS Applications key (Microsoft keyboard) 
    VK_NUMPAD0 0 key (numeric keypad) 
    VK_NUMPAD1 1 key (numeric keypad) 
    VK_NUMPAD2 2 key (numeric keypad) 
    VK_NUMPAD3 3 key (numeric keypad) 
    VK_NUMPAD4 4 key (numeric keypad) 
    VK_NUMPAD5 5 key (numeric keypad) 
    VK_NUMPAD6 6 key (numeric keypad) 
    VK_NUMPAD7 7 key (numeric keypad) 
    VK_NUMPAD8 8 key (numeric keypad) 
    VK_NUMPAD9 9 key (numeric keypad) 
    VK_MULTIPLY Multiply key (numeric keypad) 
    VK_ADD Add key (numeric keypad) 
    VK_SEPARATOR Separator key (numeric keypad) 
    VK_SUBTRACT Subtract key (numeric keypad) 
    VK_DECIMAL Decimal key (numeric keypad) 
    VK_DIVIDE Divide key (numeric keypad) 
    VK_F1 F1 key 
    VK_F2 F2 key 
    VK_F3 F3 key 
    VK_F4 F4 key 
    VK_F5 F5 key 
    VK_F6 F6 key 
    VK_F7 F7 key 
    VK_F8 F8 key 
    VK_F9 F9 key 
    VK_F10 F10 key 
    VK_F11 F11 key 
    VK_F12 F12 key 
    VK_F13 F13 key 
    VK_F14 F14 key 
    VK_F15 F15 key 
    VK_F16 F16 key 
    VK_F17 F17 key 
    VK_F18 F18 key 
    VK_F19 F19 key 
    VK_F20 F20 key 
    VK_F21 F21 key 
    VK_F22 F22 key 
    VK_F23 F23 key 
    VK_F24 F24 key 
    VK_NUMLOCK Num Lock key 
    VK_SCROLL Scroll Lock key 
    VK_LSHIFT Left Shift key (only used with GetAsyncKeyState and GetKeyState) 
    VK_RSHIFT Right Shift key(only used with GetAsyncKeyState and GetKeyState) 
    VK_LCONTROL Left Ctrl key(only used with GetAsyncKeyState and GetKeyState) 
    VK_RCONTROL Right Ctrl key(only used with GetAsyncKeyState and GetKeyState) 
    VK_LMENU Left Alt key(only used with GetAsyncKeyState and GetKeyState) 
    VK_RMENU Right Alt key(only used with GetAsyncKeyState and GetKeyState) 
    VK_PROCESSKEY Process key 
    VK_ATTN Attn key 
    VK_CRSEL CrSel key 
    VK_EXSEL ExSel key 
    VK_EREOF Erase EOF key 
    VK_PLAY Play key 
    VK_ZOOM Zoom key 
    VK_NONAME Reserved for future use 
    VK_PA1 PA1 key 
    VK_OEM_CLEAR Clear key 
    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:12:21 
    -- 
    12、DELPHI中的快捷方式一览(完全正式版) 
    1.SHIFT+鼠标左键先选中任一控件,按键后可选中窗体(选中控件后按Esc效果一样) 
    2.Shift+F8调试时弹出CPU窗口。 
    3.Shift+F10 等于鼠标右键(Windows快捷键)。 
    4.Shitf+箭头选择 
    5.shift +F12快速查找窗体并打开 
    6.F7 (步进式调试同时追踪进入子过程) 
    7.F8 (步进式调试不进入子过程) 
    8.F9运行 
    9.F12 切换EDITOR,FORM 
    10.Alt+F4 关闭所有编辑框中打开的源程序文件,但不关闭项目 
    11.ALT+鼠标左键可以块选代码,用来删除对齐的重复代码非常有用 
    12.Ctrl+F9编译 
    13.Ctrl+shift+N(n=1,2,3,4......)定义书签 
    14.Ctrl+n(n=1,2,3,4......)跳到书签n 
    15.CTRL +SHIFT+N在书签N处,再按一次 取消书签 
    16.Ctrl+PageUp将光标移至本屏的第一行,屏幕不滚动 
    17.Ctrl+PageDown将光标移至本屏的最后一行,屏幕不滚动 
    18.Ctrl+↓向下滚动屏幕,光标跟随滚动不出本屏 
    19.Ctrl+↑向上滚动屏幕,光标跟随滚动不出本屏 
    20.Ctrl+Home将光标移至文件头 
    21.Ctrl+End 将光标移至文件尾 
    22.Ctrl+B Buffer List窗口 
    23.Ctrl+I 同Tab键 
    24.CTRL+J (弹出Delphi语句提示窗口,选择所需语句将自动完成一条语句)代码模板 
    25.Ctrl+M 同Enter键。 
    26.Ctrl+N 同Enter键,但光标位置保持不变 
    27.Ctrl+T 删除光标右边的一个单词 
    28.Ctrl+Y 删除光标所在行 
    29.CTRL+C 复制 
    30.CTRL+V 粘贴 
    31.CTRL+X 剪切 
    32.CTRL+Z 还原(Undo) 
    33.CTRL+S 保存 
    34.Ctrl+F 查找 
    35.Ctrl+L 继续查找 
    36.Ctrl+r 替换 
    37.CTRL+ENTER 定位到单元文件 
    38.Ctrl+F3弹出Call Stack窗口 
    39.Ctrl+F4等于File菜单中的Close项 
    40.Ctrl+Backspace 后退删除一个词,直到遇到一个分割符 
    41.Ctrl+鼠标转轮加速滚屏 
    42.Ctrl+O+U 切换选择块的大小写(注意松开O后再按U,Ctrl保持按下) 
    43.Ctrl+K+O 切换选择块为小写(注意松开K后再按O,Ctrl保持按下) 
    44.Ctrl+K+N 切换选择块为大写(注意松开K后再按N,Ctrl保持按下) 
    45.Ctrl+Shift+G 插入GUID 
    46.Ctrl+Shift+T 在光标行加入To-Do注释 
    47.Ctrl+Shift+Y 删除光标之后至本行末尾之间的文本 
    48.CTRL+SHIFT+C 编写申明或者补上函数,绝好!!! 
    49.CTRL+SHIFT+E 显示EXPLORER 
    50.Ctrl+Tab 在Inspector中切换Properties页和Events页 
    51.CTRL+SHIFT+U 代码整块左移2个空格位置 
    52.CTRL+SHIFT+I 代码整块右移2个空格位置 
    53.CTRL+SHIFT+↑在过程、函数、事件内部, 可跳跃到相应的过程、函数、事 
    件的定义(在interface和implementation之间来回切换) 
    54.CTRL+SHIFT+↓在过程、函数、事件的定义处, 可跳跃到具体过程、函数、事件内部(同上) 
    55.Tab在object inspector窗口按tab键将光标移动到属性名区,然后键入属性名的开头 
    字母可快速定位到该属性 
    56.Ctrl+Alt 按着Ctrl+Alt之后,可用鼠标选择一个矩形块中的代码, 
    并可比它进行复制,粘贴 
    57.Shift+↓、↑、→、← 以1像素单位更改所选控件大小 
    58.Ctrl+↓、↑、→、←以1像素单位更改所选控件位置 
    59.Ctrl+E 快速选择(呵呵,试试吧,很好玩的) 
    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:12:35 
    -- 
    13、DbGrid控件的标题栏弹出菜单 
    procedure TFrmOrderPost.DbgOrderPostMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
    var 
    CurPost:TPoint; 
    begin 
    GetCursorPos(CurPost);//获得鼠标当前坐标 
    if (y<=17) and (x<=vCurRect.Right) then 
    begin 
    if button=mbright then 
    begin 
    PmTitle.Popup(CurPost.x,CurPost.y); 
    end; 
    end; 
    end; 
    //vCurRect该变量在DbGrid的DrawColumnCell事件中获得 
    {procedure TFrmOrderPost.DbgOrderPostDrawColumnCell(Sender: TObject;const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); 
    begin 
    vCurRect:=Rect;//vCurRect在实现部分定义 
    end;} 
    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:12:44 
    -- 
    14.模拟按按下键盘键(如输入法中的软键盘) 
    //模拟在Edit组件中按下字母a键 
    PostMessage(Edit1.Handle,WM_KEYDOWN,65,0); 
    //模拟在窗体Form1中按下Tab键 
    PostMessage(Form1.Handle,WM_KEYDOWN,VK_TAB,0); 
    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:12:56 
    -- 
    15.屏蔽系统功能键,如Ctrl+Alt+Del、Ctrl+Esc 
    var tempint:integer; 
    begin 
    SystemParametersinfo(SPI_SCREENSAVERRUNNING,1,@tempint,0);//屏蔽 
    SystemParametersinfo(SPI_SCREENSAVERRUNNING,0,@tempint,0);//取消屏蔽 
    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:13:07 
    -- 
    网络函数 
    来自:在富翁 
    作者:daojianrumeng 
    unit netFunc; 
    interface 
    uses 
    SysUtils 
    ,Windows 
    ,dialogs 
    ,winsock 
    ,Classes 
    ,ComObj 
    ,WinInet 
    ,Variants; 
    //错误信息常量 
    const 
    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 =\'上网了\'; 

    //得到本机的局域网Ip地址 
    Function GetLocalIp(var LocalIp:string): Boolean; 
    //通过Ip返回机器名 
    Function GetNameByIPAddr(IPAddr: string; var MacName: string): Boolean ; 
    //获取网络中SQLServer列表 
    Function GetSQLServerList(var List: Tstringlist): Boolean; 
    //获取网络中的所有网络类型 
    Function GetNetList(var List: Tstringlist): Boolean; 
    //获取网络中的工作组 
    Function GetGroupList(var List: TStringList): Boolean; 
    //获取工作组中所有计算机 
    Function GetUsers(GroupName: string; var List: TStringList): Boolean; 
    //获取网络中的资源 
    Function GetUserResource(IpAddr: string; var List: TStringList): Boolean; 
    //映射网络驱动器 
    Function NetAddConnection(NetPath: Pchar; PassWord: Pchar;LocalPath: Pchar): Boolean; 
    //检测网络状态 
    Function CheckNet(IpAddr:string): Boolean; 
    //检测机器是否登入网络 
    Function CheckMacAttachNet: Boolean; 
    //判断Ip协议有没有安装 这个函数有问题 
    Function IsIPInstalled : boolean; 
    //检测机器是否上网 
    Function InternetConnected: Boolean; 
    //关闭网络连接 
    function NetCloseAll:boolean; 
    implementation 
    {================================================================= 
    功能: 检测机器是否登入网络 
    参数: 无 
    返回值: 成功:True失败:False 
    备 注: 
    版 本: 
    1.02002/10/03 09:55:00 
    =================================================================} 
    Function CheckMacAttachNet: Boolean; 
    begin 
    Result := False; 
    if GetSystemMetrics(SM_NETWORK) <> 0 then 
    Result := True; 
    end; 
    {================================================================= 
    功能: 返回本机的局域网Ip地址 
    参数: 无 
    返回值: 成功:True, 并填充LocalIp 失败:False 
    备 注: 
    版 本: 
    1.02002/10/02 21:05:00 
    =================================================================} 
    function GetLocalIP(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.02002/10/02 22:09:00 
    =================================================================} 
    function GetNameByIPAddr(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.02002/10/02 22:44:00 
    =================================================================} 
    Function GetSQLServerList(var List: Tstringlist): boolean; 
    var 
    i: integer; 
    sRetvalue: String; 
    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.02002/10/02 21:05:00 
    =================================================================} 
    Function IsIPInstalled : 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.02002/10/03 07:30:00 
    =================================================================} 

    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:13:19 
    -- 
    Function GetUserResource(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.02002/10/03 08:00:00 
    =================================================================} 
    Function GetGroupList( 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.02002/10/03 08:00:00 
    =================================================================} 
    Function GetUsers(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.02002/10/03 08:54:00 
    =================================================================} 
    Function GetNetList(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.02002/10/03 09:24:00 
    =================================================================} 
    Function 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; 
    {================================================================= 

    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:13:31 
    -- 
    功能:检测网络状态 
    参数: 
    IpAddr: 被测试网络上主机的IP地址或名称,建议使用Ip 
    返回值: 成功:True失败: False; 
    备 注: 
    版 本: 
    1.02002/10/03 09:40:00 
    =================================================================} 
    Function CheckNet(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; 
    IcmpSendEchTIcmpSendEcho; 
    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\'); 
    @IcmpSendEch= 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.02002/10/07 13:33:00 
    =================================================================} 
    function InternetConnected: 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_MODEM+ INTERNET_CONNECTION_LAN 
    + INTERNET_CONNECTION_PROXY; 
    Result := InternetGetConnectedState(@dwConnectionTypes, 0); 
    end; 

    //关闭网络连接 
    function NetCloseAll:boolean; 
    const 
    NETBUFF_SIZE=$208; 
    type 
    NET_API_STATUS=DWORD; 
    LPByte=PByte; 
    var 
    dwNetRet:DWORD; 
    i :integer; 
    dwEntries :DWORD; 
    dwTotalEntries:DWORD; 
    szClient:LPWSTR; 
    dwUserName:DWORD; 
    Buff:array[0..NETBUFF_SIZE-1]of byte; 
    Adword:array[0..NETBUFF_SIZE div 4-1] of dword; 
    NetSessionEnum:function ( ServerName:LPSTR; 
    Reserved:DWORD; 
    Buf:LPByte; 
    BufLen:DWORD; 
    ConnectionCount:LPDWORD; 
    ConnectionToltalCount:LPDWORD ):NET_API_STATUS; 
    stdcall; 
    NetSessionDel:function( ServerName:LPWSTR; 
    UncClientName: LPWSTR ; 
    UserName: dword):NET_API_STATUS; 
    stdcall; 
    LibHandle : THandle; 
    begin 
    Result:=false; 
    try 
    { 加载 DLL } 
    LibHandle := LoadLibrary(\'svrapi.dll\'); 
    try 
    { 如果加载失败,LibHandle = 0.} 
    if LibHandle = 0 then 
    raise Exception.Create(\'不能加载SVRAPI.DLL\'); 
    { DLL 加载成功,取得到 DLL 输出函数的连接然后调用 } 
    @NetSessionEnum := GetProcAddress(LibHandle, \'NetSessionEnum\'); 
    @NetSessionDel := GetProcAddress(LibHandle, \'NetSessionDel\'); 
    if (@NetSessionEnum = nil)or(@NetSessionDel=nil) then 
    RaiseLastWin32Error { 连接函数失败 } 
    else 
    begin 
    dwNetRet := NetSessionEnum( nil,$32, @Buff, 
    NETBUFF_SIZE, @dwEntries, 
    @dwTotalEntries ); 
    if dwNetRet = 0 then 
    begin 
    Result := true; 
    for i:=0 to dwTotalEntries-1 do 
    begin 
    Move(Buff,Adword,NETBUFF_SIZE); 
    szClient:=LPWSTR(Adword[0]); 
    dwUserName := Adword[2]; 
    dwNetRet := NetSessionDel( nil,szClient,dwUserName); 
    if( dwNetRet <> 0 ) then 
    begin 
    Result := false; 
    break; 
    end; 
    Move(Buff[26],Buff[0],NETBUFF_SIZE-(i+1)*26); 
    end 
    end 
    else 
    Result := false; 
    end; 
    finally 
    FreeLibrary(LibHandle); // Unload the DLL. 
    end; 
    except 
    end; 
    end; 
    end. 

    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:13:48 
    -- 
    17、产生GUID 
    Uses ComObj, ActiveX, Windows; 
    function GetGUID:string; 
    var 
    Id: TGUID; 
    begin 
    if CoCreateGuid(Id) = S_OK then 
    Result := GUIDToString(id); 
    end; 

    -------------------------------------------------------------------------------- 

    --作者:kgdyga 
    --发布时间:2005-2-25 13:14:00 
    -- 
    18、在ListBox移动鼠标时选择项目 
    procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, 
    Y: Integer); 
    var 
    i: integer; 
    begin 
    i := y div listbox1.ItemHeight; 
    if (listbox1.TopIndex + i) < listbox1.items.count then 
    begin 
    listbox1.ItemIndex := listbox1.TopIndex + i; 
    caption := listbox1.Items[listbox1.ItemIndex]; 
    end; 
    end;

  • 相关阅读:
    设置maven阿里云镜像和公司私服并存
    idea favorites bookmarks标签收藏夹数据丢失bug
    C#后期绑定调用COM组件
    SQL Studio 1.0:一款轻便的SQL脚本工具兼容SQL Server、MySQL、Access2007
    SQL Studio 2.0: 新版发布
    SQLHelper用的不爽,试试CmdRunner吧
    Flask + uWSGI+ Linux 指南及避坑
    Flask + Pyinstaller 打包后运行报错 SystemError
    Url重写之UrlRewriter
    .net5 提取压缩包内指定文件内容无需解压
  • 原文地址:https://www.cnblogs.com/karkash/p/3074390.html
Copyright © 2020-2023  润新知