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;