微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题Delphi网络编程三例
栏目软件世界
作者望月
发布2001年39期
  Delphi是具可视化界面的面向对象编程语言,它以其功能强大、简便易用等诸多特性,深受编程人员的欢迎。下面笔者就列举Delphi在网络方面的三则应用,来说明Delphi强大的编程功能。
  向数据库输入记录
  我们在开发数据库应用程序时,常常需要编写必要的程序代码对一些特定事件进行处理,以便能方便地完成对多种数据库进行的数据处理。在此,笔者就列举一则如何编写向数据库输入记录的编写方法,这里以页面中的TEdit类型编辑框内容作为数据源,向数据库输入记录的部分原代码如下:
  procedure DataInsert(const qName:TQuery;
  szDBName:string iNum:Integer
  iMark array of Integer:eName:array of TEdit);
  var
  i:Integer
  szSQL:string
  begin
  if DataModule1.DataBase1.InTransaction=true then
  DataModule1.DataBase1.RollBack;
  DataModule1.DataBase1.StartTransaction;
  szSQL:= 'INSERT INTO '+szDBName+' VALUES('
  for i:=0 to iNum-1 do
  begin
  if iMark[i]=0 then
  szSQL:=szSQL+eName[i].Text{非字符方式}
  else
  szSQL:=szSQL+'"'+eName[i].Text+'"';{字符方式}
  if i=iNum-1 then
  szSQL:=szSQL+')'
  else
  szSQL:=szSQL+',';
  end;
  qName.Close;{关闭查询}
  qName.SQL.Clear;{清SQL特性内容}
  qName.SQL.ADD(szSQL);{添加SQL内容}
  szSQL:= 'SELECT * FROM '+szDBName;
  qName.SQL.ADD(szSQL);
  qName.Open;{返回结果集}
  DataModule1.DataBase1.Commit;
  end;
  实现超级链接效果
  该例子是表示当鼠标指向某字体,该字体就出现下划线,鼠标指针变为一只手指,按下后就打开浏览器或邮件编写器的功能,请按下列办法做:
  先在一个窗体中加入一个Label1,在OnMouseMove事件里加入下列代码:
  procedure TForm1.Label1MouseMove(Sender:TObject;shift:Tshiftstate;x,y:integer);
  begin
  Label1.Font.Style:=[fsbold,fsunderline];
  Label1.Font.Color:=clYellow;
  end;
  {接着在Form1的OnMouseMove事件里加入下列代码}
  procedure TForm1.FormMouseMove(Sender:TObject;shift:Tshiftstate;x,y:integer);
  begin
  Label1.Font.Style:=[fsbold];
  Label1.Font.Color:=clmaroon;
  end;
  procedure TForm1.Label1Click(Sender:TObject);
  begin
  Shellexecute(handle,nil,pchar('mailto:test@21cn.com'),nil,nil,sw_shownormal);
  end;
  最后,再将Label1.Cursor的鼠标指针设为crHandPoint,那么就有这种效果了。
  获取局域网信息
  如果你是一位局域网的系统管理员的话,肯定要经常对连接在局域网中的各个工作组进行管理和维修,并对每一台工作组建立相关的信息档案,以后只要根据这些档案信息就知道对应的工作组的运行情况,从而可以大大提高管理的效率了。此时,可能有人说,要查看这些工作组的信息,不是还要一台一台地打开、一台一台地查看吗?的确,如果还是这样操作的话,工作效率肯定还是不会提高,那么我们有没有办法同时获取局域网中的每一台工作组的信息呢?答案当然是肯定的,我们可以使用Delphi中的Win API来获取局域网中的每一台工作组的信息,下面是获取工作组信息的源代码:
  Function GetServerList(var List:TStringList):Boolean;
  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;
  //WNetCloseEnum关闭一个列举句柄
  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;