贴了一个以前的例子。哈哈,有一部分代码是我的!主 题:如何得到局域网内的其他机器的IP和名称?急!急!。谢谢!
作 者:Num1
所属论坛:Delphi
问题点数:51
回复次数:7
发表时间:2001-6-15 9:51:00
回复贴子:
回复人:sundayboys(sunboy) (2001-6-15 10:06:00) 得20分
转贴:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls ,winsock;type
TNetResourceArray = ^TNetResource; //网络资源类型的数组
TForm1 = class(TForm)
Memo1: TMemo;
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
function GetIP(Sender: TObject; fcomputername:string) :string;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM} //函数GetServerList列举出整个网络中的工作组名称,返回值为TRUE表示执行成功,
Function GetServerList( var List : TStringList ) : Boolean; //参数List中返回服务器(工作组)的名称
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;
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum); //获取整个网络中的文件资源的句柄,lphEnum为返回名柄
If Res <> NO_ERROR Then
exit; //执行失败,退出
Count := $FFFFFFFF; //执行成功,开始获取整个网络中的网络类型信息
BufSize := 8192; //不限资源数目
GetMem(Buf, BufSize); //缓冲区大小设置为8K
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); //WNetCloseEnum关闭一个列举句柄
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 := 1024*16; //缓冲区大小设置为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;function TForm1.GetIP(Sender: TObject; fcomputername:string) :string;
var
WSAData: TWSAData;
HostEnt: PHostEnt;
begin
HostEnt := nil;
WSAStartup(2, WSAData);
HostEnt := gethostbyname(PChar(fComputerName));
if HostEnt <> nil then
begin
with HostEnt^ do
result:= Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]),Byte(h_addr^[3])]);
end;
WSACleanup;
end;procedure TForm1.Button1Click(Sender: TObject);
var
sl,s2:TstringList;
i,j,k:integer;
temp:string;
begin
temp:='d:\computer.txt';
memo1.lines.Clear;
sl:=Tstringlist.create;
s2:=Tstringlist.create;
try
if GetServerList(sl) then
begin
for i:=0 to sl.count-1 do
begin
memo1.lines.Add (sl.Strings[i]+':');
try
winexec(pchar('command.com /C net view /workgroup:'+sl.Strings[i]+' >'+temp),sw_hide);
except
end;
k:=120;
repeat;
sleep(k);
k:=k+40;
until
fileexists(temp);
s2.LoadFromFile(temp);
for j:=1 to s2.count-1 do
begin
if pos(':',s2.Strings[j]) >0 then
memo1.lines.Add (s2.Strings[j]);
if pos('\\',s2.Strings[j]) >0 then
memo1.lines.Add (' '+copy(s2.Strings[j],1,15)+' IP: '+ GetIP(Sender,trim(copy(s2.Strings[j],3,20))));
end;
end;
memo1.lines.Add('工作组个数:'+inttostr(sl.count));
end
else
memo1.lines.Add('没有找到工作组!');
except
end;end;procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.lines.Clear;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
memo1.lines.SaveToFile('LKnet.spl');
action:=cafree;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;procedure TForm1.FormShow(Sender: TObject);
begin
IF fileexists('LKnet.spl') then
Memo1.Lines.LoadFromFile('LKnet.spl');
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
if pos('工作组个数', memo1.Text) =0 then
button1click(sender);
end;end. 回复人:skimwater(掠水惊鸿) (2001-6-15 10:30:00) 得5分
没这么复杂,你用两个API函数:WnetOpenEnum ,WnetOpenResouce取得各个机器的名字,然后
用GetHostByName取得IP地址。
回复人:Num1(小杰) (2001-6-15 19:32:00) 得0分
skimwater:能不能写详细点,API我不怎么会用?
回复人:Num1(小杰) (2001-6-15 21:45:00) 得0分 回复人:ch81() (2001-6-15 22:03:00) 得20分
http://lijun_1.myetang.com/delphi/Delphi_14.htm
会找到你想要的。
至于IP地址,我编过:
你从上面获得的机器名,
GetHostByName(ComputeName);
上面是从机器名来获取IP。
下面是从IP来获取机器名。
并枚取出该机器共享文件夹
procedure TCrackNet.Button1Click(Sender: TObject);
var wsaData:TWSADATA;
var Info:PHostEnt;
var IP:PChar;
var i:u_long;
var HEnum:THandle;
var Net:TNetResource;
var Buffer:Array [0..19] of TNetResource;
var BufferSize:Dword;
var Count:DWORD;
var dwResult:DWORD;
var TreeNode:TTreeNode;
var TNode:TTReeNode;
var NetName:String;
var c:integer;
var PartName:String;
begin
TreeView1.PopupMenu:=PopupMenu1;
if WSAStartup($0101, WSAData)<>0 then
begin
ShowMessage('Error');
end
else
begin
if ((LoByte(WsaData.wVersion))<>1) or ((HiByte(WsaData.wVersion))<>1) then
begin
WsaCleanup;
Exit;
end;
end; //IPStr:=InttoStr(RIpEdit1.IP1Sec);
//IPStr:=IPStr+InttoStr(RIpEdit1.IP2Sec);
//IPStr:=IPStr+InttoStr(RIpEdit1.IP3Sec);
//IPStr:=IPStr+InttoStr(RIpEdit1.IP4Sec);
GetMEM(IP,Length(RIpEdit1.IPString)+1);
StrpCopy(IP,RIpEdit1.IPString);
// ShowMessage(RIpEdit1.IPString);
i:=inet_Addr(IP);
Info:=GetHostByAddr(@i,sizeof(i),AF_INET);
if Info<>nil then
begin
NetName:=StrPas(Info^.h_name);
Label1.Caption:='Now The Host is-'+NetName;
TNode:=TreeView1.Items.AddChild(Node,NetName);
TNode.ImageIndex:=6;
//Node.Text:=NetName;
end
else
begin
ShowMessage('Error:'+inttostr(WsaGetLastError));
ShowMessage('Error');
end;
WsaCleanUp; Net.dwScope:=RESOURCE_GLOBALNET;
Net.dwType:=RESOURCETYPE_ANY;
Net.dwDisplayType:=RESOURCEDISPLAYTYPE_SERVER;
Net.dwUsage:=RESOURCEUSAGE_CONTAINER;
Net.lpRemoteName:=PChar('\\'+NetName);
Net.lpComment:=nil;
Net.lpLocalName:=nil;
Net.lpProvider:=nil;
//Net.lpProvider:=PChar('Microsoft Network');
dwResult:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,PNetResource(@Net),HEnum);
if dwResult<>NO_ERROR then
begin
ShowMessage('error');
ShowMessage('MayBe The Host');
Exit;
end; BufferSize:=SizeOf(Buffer);
Count:=$FFFFFFFF;
dwResult:=WNetEnumResource(hEnum,Count,Pointer(@Buffer),BufferSize);
if dwResult<>NO_ERROR then
begin
if dwResult=ERROR_NO_MORE_ITEMS then
begin
ShowMessage('Error_No_more items');
end;
end;
For c:=0 to Count-1 do
begin
PartName:=CutShort(StrPas(Buffer[c].lpRemoteName));
TreeNode:=TreeView1.Items.AddChild(TNode,PartName);
if Buffer[c].dwType=RESOURCETYPE_DISK then
begin
//ShowMessage(TreeNode.Text);
TreeNode.ImageIndex:=7;
//TreeView1.Items.AddChild(Node,StrPas(Buffer.lpRemoteName));
end;
end;
回复人:ybli() (2001-6-17 16:27:00) 得6分
我用拨号方式连接到一台机器后,由于需要把共享文件夹映射为网络驱动器,但是每次启动机器时都会提示连接网络驱动器不成功,很烦,有没有办法在程序中把拨号过去的机器的共享文件夹映射为网络驱动器?最好是能在程序中自动拨号和映射网络驱动器,判断连接是否存在。
回复人:Num1(小杰) (2001-6-18 9:29:00) 得0分
谢谢大家 给分了
作 者:Num1
所属论坛:Delphi
问题点数:51
回复次数:7
发表时间:2001-6-15 9:51:00
回复贴子:
回复人:sundayboys(sunboy) (2001-6-15 10:06:00) 得20分
转贴:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls ,winsock;type
TNetResourceArray = ^TNetResource; //网络资源类型的数组
TForm1 = class(TForm)
Memo1: TMemo;
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
function GetIP(Sender: TObject; fcomputername:string) :string;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM} //函数GetServerList列举出整个网络中的工作组名称,返回值为TRUE表示执行成功,
Function GetServerList( var List : TStringList ) : Boolean; //参数List中返回服务器(工作组)的名称
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;
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum); //获取整个网络中的文件资源的句柄,lphEnum为返回名柄
If Res <> NO_ERROR Then
exit; //执行失败,退出
Count := $FFFFFFFF; //执行成功,开始获取整个网络中的网络类型信息
BufSize := 8192; //不限资源数目
GetMem(Buf, BufSize); //缓冲区大小设置为8K
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); //WNetCloseEnum关闭一个列举句柄
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 := 1024*16; //缓冲区大小设置为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;function TForm1.GetIP(Sender: TObject; fcomputername:string) :string;
var
WSAData: TWSAData;
HostEnt: PHostEnt;
begin
HostEnt := nil;
WSAStartup(2, WSAData);
HostEnt := gethostbyname(PChar(fComputerName));
if HostEnt <> nil then
begin
with HostEnt^ do
result:= Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]),Byte(h_addr^[3])]);
end;
WSACleanup;
end;procedure TForm1.Button1Click(Sender: TObject);
var
sl,s2:TstringList;
i,j,k:integer;
temp:string;
begin
temp:='d:\computer.txt';
memo1.lines.Clear;
sl:=Tstringlist.create;
s2:=Tstringlist.create;
try
if GetServerList(sl) then
begin
for i:=0 to sl.count-1 do
begin
memo1.lines.Add (sl.Strings[i]+':');
try
winexec(pchar('command.com /C net view /workgroup:'+sl.Strings[i]+' >'+temp),sw_hide);
except
end;
k:=120;
repeat;
sleep(k);
k:=k+40;
until
fileexists(temp);
s2.LoadFromFile(temp);
for j:=1 to s2.count-1 do
begin
if pos(':',s2.Strings[j]) >0 then
memo1.lines.Add (s2.Strings[j]);
if pos('\\',s2.Strings[j]) >0 then
memo1.lines.Add (' '+copy(s2.Strings[j],1,15)+' IP: '+ GetIP(Sender,trim(copy(s2.Strings[j],3,20))));
end;
end;
memo1.lines.Add('工作组个数:'+inttostr(sl.count));
end
else
memo1.lines.Add('没有找到工作组!');
except
end;end;procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.lines.Clear;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
memo1.lines.SaveToFile('LKnet.spl');
action:=cafree;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;procedure TForm1.FormShow(Sender: TObject);
begin
IF fileexists('LKnet.spl') then
Memo1.Lines.LoadFromFile('LKnet.spl');
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
if pos('工作组个数', memo1.Text) =0 then
button1click(sender);
end;end. 回复人:skimwater(掠水惊鸿) (2001-6-15 10:30:00) 得5分
没这么复杂,你用两个API函数:WnetOpenEnum ,WnetOpenResouce取得各个机器的名字,然后
用GetHostByName取得IP地址。
回复人:Num1(小杰) (2001-6-15 19:32:00) 得0分
skimwater:能不能写详细点,API我不怎么会用?
回复人:Num1(小杰) (2001-6-15 21:45:00) 得0分 回复人:ch81() (2001-6-15 22:03:00) 得20分
http://lijun_1.myetang.com/delphi/Delphi_14.htm
会找到你想要的。
至于IP地址,我编过:
你从上面获得的机器名,
GetHostByName(ComputeName);
上面是从机器名来获取IP。
下面是从IP来获取机器名。
并枚取出该机器共享文件夹
procedure TCrackNet.Button1Click(Sender: TObject);
var wsaData:TWSADATA;
var Info:PHostEnt;
var IP:PChar;
var i:u_long;
var HEnum:THandle;
var Net:TNetResource;
var Buffer:Array [0..19] of TNetResource;
var BufferSize:Dword;
var Count:DWORD;
var dwResult:DWORD;
var TreeNode:TTreeNode;
var TNode:TTReeNode;
var NetName:String;
var c:integer;
var PartName:String;
begin
TreeView1.PopupMenu:=PopupMenu1;
if WSAStartup($0101, WSAData)<>0 then
begin
ShowMessage('Error');
end
else
begin
if ((LoByte(WsaData.wVersion))<>1) or ((HiByte(WsaData.wVersion))<>1) then
begin
WsaCleanup;
Exit;
end;
end; //IPStr:=InttoStr(RIpEdit1.IP1Sec);
//IPStr:=IPStr+InttoStr(RIpEdit1.IP2Sec);
//IPStr:=IPStr+InttoStr(RIpEdit1.IP3Sec);
//IPStr:=IPStr+InttoStr(RIpEdit1.IP4Sec);
GetMEM(IP,Length(RIpEdit1.IPString)+1);
StrpCopy(IP,RIpEdit1.IPString);
// ShowMessage(RIpEdit1.IPString);
i:=inet_Addr(IP);
Info:=GetHostByAddr(@i,sizeof(i),AF_INET);
if Info<>nil then
begin
NetName:=StrPas(Info^.h_name);
Label1.Caption:='Now The Host is-'+NetName;
TNode:=TreeView1.Items.AddChild(Node,NetName);
TNode.ImageIndex:=6;
//Node.Text:=NetName;
end
else
begin
ShowMessage('Error:'+inttostr(WsaGetLastError));
ShowMessage('Error');
end;
WsaCleanUp; Net.dwScope:=RESOURCE_GLOBALNET;
Net.dwType:=RESOURCETYPE_ANY;
Net.dwDisplayType:=RESOURCEDISPLAYTYPE_SERVER;
Net.dwUsage:=RESOURCEUSAGE_CONTAINER;
Net.lpRemoteName:=PChar('\\'+NetName);
Net.lpComment:=nil;
Net.lpLocalName:=nil;
Net.lpProvider:=nil;
//Net.lpProvider:=PChar('Microsoft Network');
dwResult:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,PNetResource(@Net),HEnum);
if dwResult<>NO_ERROR then
begin
ShowMessage('error');
ShowMessage('MayBe The Host');
Exit;
end; BufferSize:=SizeOf(Buffer);
Count:=$FFFFFFFF;
dwResult:=WNetEnumResource(hEnum,Count,Pointer(@Buffer),BufferSize);
if dwResult<>NO_ERROR then
begin
if dwResult=ERROR_NO_MORE_ITEMS then
begin
ShowMessage('Error_No_more items');
end;
end;
For c:=0 to Count-1 do
begin
PartName:=CutShort(StrPas(Buffer[c].lpRemoteName));
TreeNode:=TreeView1.Items.AddChild(TNode,PartName);
if Buffer[c].dwType=RESOURCETYPE_DISK then
begin
//ShowMessage(TreeNode.Text);
TreeNode.ImageIndex:=7;
//TreeView1.Items.AddChild(Node,StrPas(Buffer.lpRemoteName));
end;
end;
回复人:ybli() (2001-6-17 16:27:00) 得6分
我用拨号方式连接到一台机器后,由于需要把共享文件夹映射为网络驱动器,但是每次启动机器时都会提示连接网络驱动器不成功,很烦,有没有办法在程序中把拨号过去的机器的共享文件夹映射为网络驱动器?最好是能在程序中自动拨号和映射网络驱动器,判断连接是否存在。
回复人:Num1(小杰) (2001-6-18 9:29:00) 得0分
谢谢大家 给分了
解决方案 »
- 请问如何把工程的Unit1.pas保存到子目录下?
- 救命啊!!!!!!!!!!如何在DBgridEh里,改一个格中的数据,同时更新另一个格中的数据
- ReportBuilder中使用ppReport的一个奇怪问题
- 文件拷备问题~!!我没分了,只有10分。
- 安装 Report Machine 2.6 成功,但运行的时候提示出错,"Project Project1.exe raised exception class ERadeError with message 'propert
- 简单问题
- 编译不了,怎么办啊?刚开始学,多多关照
- 散分! 下载测试 运用了 事务处理/midas /Com+ /Webservice /Soap /XML 技术的实际应用
- 我想找一个免费的域名和空间,哪位大哥能帮介绍一下啊!
- 关于label控件的问题?
- 关于midas的连接问题,救救我,老板要炒人了
- 送分,delphi5的注册吗???
i : Integer;
ErrCode : Integer;
NetRes : Array[0..1023] of TNetResource;
EnumHandle : Thandle;
EnumEntries : Dword;
BufferSize : Dword;
ComputerIP,ComputerName:String;
begin
//try
With NetRes[0] do begin
dwScope :=RESOURCE_GLOBALNET;
dwType :=RESOURCETYPE_ANY;
dwDisplayType :=RESOURCEDISPLAYTYPE_DOMAIN;
dwUsage :=RESOURCEUSAGE_CONNECTABLE;
lpLocalName :=NIL;
lpRemoteName :=NIL;
lpComment :=NIL;
lpProvider :=NIL;
end;
{ get net root }
ErrCode:=WNetOpenEnum(
RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER,
@NetRes[0],
EnumHandle
);If ErrCode=NO_ERROR then begin
EnumEntries:=1;
BufferSize:=SizeOf(NetRes);
ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes[0],BufferSize);
WNetCloseEnum(EnumHandle);
ErrCode:=WNetOpenEnum(
RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
RESOURCEUSAGE_CONNECTABLE,
@NetRes[0],
EnumHandle
);
EnumEntries:=1024;
BufferSize:=SizeOf(NetRes);
ErrCode:=WNetEnumResource(
EnumHandle,
EnumEntries,
@NetRes,
BufferSize
); for i:=0 to 1023 do
if NetRes[i].lpRemoteName='' then Exit
else begin
ComputerName:=Copy(NetRes[i].lpRemoteName,3,Length(NetRes[i].lpRemoteName)-2);
//ComputerIP:=GetIP(ComputerName);
ShowMessage('计算机名' + NetRes[i].lpRemoteName + chr(13)
+ '计算机说明:' + NetRes[i].lpComment + chr(13)
+ 'IP地址:' + ComputerIP);
end;
end;
这个是我找到的一个控件,专门用于填ip地址!在《delphi第三方控件》这本书附带的光盘上有。你要吗?找出来我寄给你!要的话,留个mail
procedure TForm1.mitemAddClick(Sender: TObject);//button click
var
catnode :TTreeNode;
begin
if TreeView1.Selected = nil then
catnode:=TreeView1.Items.Add(TTreeNode.Create(TreeView1.Items),'')
else
begin
catnode := TreeView1.Items.AddChild(TreeView1.Selected,'');
TreeView1.Selected.Expand(true);
end;
TreeView1.Selected := catnode;
//When EditText is called, the tree view's OnEditing event is triggered
catnode.EditText ;
end;// 因此请调用treeview1的 OnEdited Event
procedure TForm1.TreeView1Edited(Sender: TObject; Node: TTreeNode;
var S: String);//S is just your m.
begin
showmessage(s);
end;
cTreeCodeFormat = '122222'; //编码格式: x xx xx xx xx xx
cTreeMaxLevel = 6;
cTreeRootTxt = '单位字典';
function TForm1.GetNodeLevel(sFormat,sCode:string):integer;
var
i,level,iLen:integer;
begin
level := -1;
iLen := 0;
if (sFormat<>'') and (sCode<>'') then
for i:= 1 to Length(sFormat) do //分析编码格式,找出当前代码层次
begin
iLen := iLen + StrToInt(sFormat[i]);
if Length(sCode) = iLen then
begin
level := i;
break;
end;
end;
Result := level;
end;
Procedure TForm1.LoadTree(treeDb:TDataSet;sTableName,sSortField:string);
var
curId,nodeTxt:string;
level,chindex,cnode,num:integer;
mynode:array[0..6] of TTreeNode;
begin
Screen.Cursor := crHourGlass;
TreeView1.Enabled := True;
TreeView1.Items.Clear ;
Level := 0;
num := 1;
TreeView1.Items.Clear;
//设置根节点
myNode[Level] := TreeView1.Items.Add(TreeView1.TopItem,cTreeRootTxt);
myNode[Level].ImageIndex := 1;
//遍历数据表,利用编码字段记录排序规,依次添加数节点
With TQuery(treeDb) do
begin
try
Close;
SQL.Clear ;
SQL.Add(Format('Select * from %s order by %s ',[sTableName,sSortField]));
Open;
First;
begin
curId := Trim(FieldByName('dwbm').Asstring);
nodeTxt := curId+'-'+Trim(FieldByName('dwqc').Asstring);
//这里返回代码的层次数
Level := GetNodeLevel('122222',curId);
if Level > 0 then
begin
//增加下一节点时,用添加子节点的方法可轻松实现节点间的层次关系
//注意:这里的父节点是用当前节点的上一级节点 myNode[Level-1]
mynode[Level] := TreeView1.Items.AddChild(myNode[Level-1],nodeTxt);
mynode[Level].ImageIndex := 2;
end;
Next;
if Eof then
begin
showmessage('eof');
First;
Screen.Cursor := crHourGlass;
showmessage('end');
exit ;
end;
end;
finally
close;
end;
myNode[0].Expand (False);
Screen.Cursor := crHourGlass;
end;
end;