Delphi网络编程三例

Author: 望月 Date: 2001年 39期

?牐燚elphi是具可视化界面的面向对象编程语言,它以其功能强大、简便易用等诸多特性,深受编程人员的欢迎。下面笔者就列举Delphi在网络方面的三则应用,来说明Delphi强大的编程功能。
  #1    向数据库输入记录
  ?牐犖颐窃诳⑹菘庥τ贸绦蚴保3P枰嘈幢匾某绦虼攵砸恍┨囟ㄊ录写?理,以便能方便地完成对多种数据库进行的数据处理。在此,笔者就列举一则如何编写向数据库输入记录的编写方法,这里以页面中的TEdit类型编辑框内容作为数据源,向数据库输入记录的部分原代码如下:
  ?牐爌rocedure DataInsert(const qName:TQuery;
  ?牐爏zDBName:string iNum:Integer??
  ?牐爄Mark array of Integer:eName:array of TEdit);?牔?
  ?牐爒ar
  ?牐爄:Integer??
  ?牐爏zSQL:string??
  ?牐燽egin
  ?牐爄f DataModule1.DataBase1.InTransaction=true then
  ?牐燚ataModule1.DataBase1.RollBack;??
  ?牐燚ataModule1.DataBase1.StartTransaction;
  ?牐爏zSQL:= 'INSERT INTO '+szDBName+' VALUES('
  ?牐爁or i:=0 to iNum-1 do
    ?燽egin
  ?牐爄f iMark[i]=0 then
  ?牐爏zSQL:=szSQL+eName[i].Text{非字符方式}
  ?牐爀lse
  ?牐爏zSQL:=szSQL+'"'+eName[i].Text+'"';{字符方式}
  ?牐爄f i=iNum-1 then
  ?牐爏zSQL:=szSQL+')'
  ?牐爀lse
  ?牐爏zSQL:=szSQL+',';??
  ?牐爀nd;
  ?牐爍Name.Close;{关闭查询}
  ?牐爍Name.SQL.Clear;{清SQL特性内容}
  ?牐爍Name.SQL.ADD(szSQL);{添加SQL内容}
  ?牐爏zSQL:= 'SELECT * FROM '+szDBName;
  ?牐爍Name.SQL.ADD(szSQL);
  ?牐爍Name.Open;{返回结果集}
  ?牐燚ataModule1.DataBase1.Commit;
  ?牐爀nd;
  #1    实现超级链接效果
  ?牐牳美邮潜硎镜笔蟊曛赶蚰匙痔澹米痔寰统鱿窒禄撸蟊曛刚氡湮恢皇种福聪潞缶痛蚩榔骰蛴始嘈雌鞯墓δ埽氚聪铝邪旆ㄗ?:
  ?牐犗仍谝桓龃疤逯屑尤胍桓鯨abel1,在OnMouseMove事件里加入下列代码:
  ?牐爌rocedure TForm1.Label1MouseMove(Sender:TObject;shift:Tshiftstate;x,y:integer);
  ?牐燽egin
  ?牐燣abel1.Font.Style:=[fsbold,fsunderline];
  ?牐燣abel1.Font.Color:=clYellow;
  ?牐爀nd;
  ?牐爗接着在Form1的OnMouseMove事件里加入下列代码}
  ?牐爌rocedure TForm1.FormMouseMove(Sender:TObject;shift:Tshiftstate;x,y:integer);
  ?牐燽egin
  ?牐燣abel1.Font.Style:=[fsbold];
  ?牐燣abel1.Font.Color:=clmaroon;
  ?牐爀nd;
  ?牐爌rocedure TForm1.Label1Click(Sender:TObject);
  ?牐燽egin
  ?牐燬hellexecute(handle,nil,pchar('mailto:test@21cn.com'),nil,nil,sw_shownormal);?牔?
  ?牐爀nd;
  ?牐犠詈螅俳獿abel1.Cursor的鼠标指针设为crHandPoint,那么就有这种效果了。
  #1    获取局域网信息
  ?牐犎绻闶且晃痪钟蛲南低彻芾碓钡幕埃隙ㄒ6粤釉诰钟蛲械母鞲龉ぷ髯榻泄芾砗臀蓿⒍悦恳惶üぷ髯榻?立相关的信息档案,以后只要根据这些档案信息就知道对应的工作组的运行情况,从而可以大大提高管理的效率了。此时,可能有人说,要查看这些工作组的信息,不是还要一台一台地打开、一台一台地查看吗?的确,如果还是这样操作的话,工作效率肯定还是不会提高,那么我们有没有办法同时获取局域网中的每一台工作组的信息呢?答案当然是肯定的,我们可以使用Delphi中的Win API来获取局域网中的每一台工作组的信息,下面是获取工作组信息的源代码:
  ?牐燜unction GetServerList(var List:TStringList):Boolean;
  ?牐燰ar //显示所有工作组的名称
  ?牐燦etResource:TNetResource;
  ?牐燘uf:Pointer;
  ?牐燙ount,BufSize,Res:DWORD;
  ?牐爈phEnum:THandle;
  ?牐爌:TNetResourceArray;
  ?牐爄,j:SmallInt;
  ?牐燦etworkTypeList:TList;//返回局域网中的工作组名称
  ?牐燘egin
  ?牐燫esult:=False;
  ?牐燦etworkTypeList:=TList.Create;
  ?牐燣ist.Clear;//获取整个网络中的文件资源的句柄,lphEnum为返回名柄
  ?牐燫es:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER,Nil,lphEnum);
  ?牐營f Res <>NO_ERROR Then exit;//Raise Exception(Res);//执行失败
  ?牐?//获取整个网络中的网络类型信息
  ?牐燙ount:=$FFFFFFFF;//不限资源数目
  ?牐燘ufSize:=8192;//缓冲区大小设置为8K
  ?牐燝etMem(Buf,BufSize);//申请内存,用于获取工作组信息
  ?牐燫es:= WNetEnumResource(lphEnum,Count,Pointer(Buf),BufSize);
  ?牐營f(Res=ERROR_NO_MORE_ITEMS)//资源列举完毕
  ?牐爋r(Res <>NO_ERROR)//执行失败
  ?牐燭hen Exit;??
  ?牐燩:=TNetResourceArray(Buf);?牔?
  ?牐燜or I:=0 To Count - 1 Do //记录各个网络类型的信息
  ?牐燘egin
  ?牐燦etworkTypeList.Add(p);?牔?
  ?牐營nc(P);?牔?
  ?牐燛nd;
  ?牐?//WNetCloseEnum关闭一个列举句柄
  ?牐燫es:=WNetCloseEnum(lphEnum);//关闭一次列举
  ?牐營f Res <> NO_ERROR Then exit;
  ?牐燜or J:=0 To NetworkTypeList.Count-1 Do //列出各个网络类型中的所有工作组名称
  ?牐燘egin//列出一个网络类型中的所有工作组名称
  ?牐燦etResource:=TNetResource(NetworkTypeList.Items[J]^);//网络类型信息
  ?牐?//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
  ?牐燫es:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER,@NetResource,lphEnum);??
  ?牐營f Res <>NO_ERROR Then break;//执行失败
  ?牐燱hile true Do//列举一个网络类型的所有工作组的信息
  ?牐燘egin
  ?牐燙ount:=$FFFFFFFF;//不限资源数目
  ?牐燘ufSize:=8192;//缓冲区大小设置为8K
  ?牐燝etMem(Buf,BufSize);//申请内存,用于获取工作组信息
  ?牐?//获取一个网络类型的文件资源信息,
  ?牐燫es:=WNetEnumResource(lphEnum,Count,Pointer(Buf),BufSize);?牔?
  ?牐營f(Res=ERROR_NO_MORE_ITEMS)//资源列举完毕
  ?牐爋r(Res <>NO_ERROR)//执行失败
  ?牐爐hen break;
  ?牐燩:=TNetResourceArray(Buf);?牔?
  ?牐燜or I:= 0 To Count - 1 Do //列举各个工作组的信息
  ?牐燘egin
  ?牐燣ist.Add(StrPAS(P^.lpRemoteName));//取得一个工作组的名称
  ?牐營nc(P);?牔?
  ?牐燛nd;
  ?牐燛nd;??
  ?牐燫es:= WNetCloseEnum(lphEnum);//关闭一次列举
  ?牐營f Res <> NO_ERROR Then break;//执行失败
  ?牐燛nd;
  ?牐燫esult:= True;??
  ?牐燜reeMem(Buf);?牔?
  ?牐燦etworkTypeList.Destroy;
  ?牐燛nd;