Delphi编程俱乐部

Author: Date: 2000年 第9期

  大家好!Delphi编程俱乐部又与大家见面了。带着极度兴奋的心情,我想告诉大家:经过一个多月的努力,中国第一本在Internet诞生的书《Delphi网络论坛精华2000》终于出版发行了,这是一本完全在网上完成编辑工作的书。该书由20多位在中国各地的编辑(他们也都是Delphi方面的高手),按编制软件的方法来组织和管理。他们在“Delphi大富翁论坛”(http://www.gislab.ecnu.edu.cn/delphibbs)的主页上公布了编辑计划的重要文档,通过邮件列表共同制定了编辑原则,通过论坛数据库讨论编辑范本和审阅各阶段的稿件,在短短的45天内完成了全书的复杂的编辑工作,最终形成了这本质量超高的奇书。
  该书对Delphi编程中的常见问题进行了分类,并以问答的形式作了细致、全面的解答。在随书赠送的光盘中,有针对初学者的Delphi多媒体教学软件;更有大量的网上Delphi资源,如:技术文档、极为珍贵的编程控件(VCL、OCX)等;还在随书赠送的《共享软件DIY》中,以step by step的形式教广大的Delphi爱好者用Delphi制作一些很有用的共享小软件如:MP3播放器、图像浏览器、邮件接收程序以及共享软件的安装程序等,通过它能让广大的Delphi爱好者轻松揭开共享软件的神秘面纱。
  1.问:交付SQL6.5客户端程序需要将哪些文件到拷贝系统,而避免安装SQL Client? 
  答:我做过SQL6.5的安装盘,在TCP/IP下只要以下文件:bnmpntw.dll 、Ntwdblib.dll(DB库文件)、MSVCRt40.Dll(VC运行库)。IP协议的支持文件不需要,到网络属性中安装协议就行了。
  2.问:如何调用磁盘上的图形?
  答:假设你的图形文件名是combox.text,可以使用下面语句调用(在combox.text前还可以加上文件路径)。
  image1.picture.loadfromfile(combox.text);
  3.问:我希望在某个时刻运行某个程序,并且要显示时间,但我对WINAPI了解不多。 
  答:(1)在窗体上放一个TTimer控件(System页),设时间间隔为1000ms。在响应该时钟消息的函数内部加上时钟的时间。
  (2)获取当前时间,计算与设定时间相差多少毫秒,然后设一个全局变量,在响应时钟消息的函数内开始每次加1,直到等待时间为止。或者每隔几十秒获取当前时间,判断是否达到规定时间了。
  (3)调用应用程序,有3个API函数可供使用:
  WinExeC,最简单,但是它只能调用可执行程序;
  ShellExecute,可以启动某一可执行程序,也可以启动与你给出的文件相关联的应用程序;
  ShellExecuteEx,和上两者相似,不过传递的参数不一样。
  用GetLocalTime可以获得当前系统时间。你如果怕程序的执行干扰到系统时钟,使其不准确,也可以使用线程,这样对系统的影响就极小了!
  4.问:如何使Delphi编出CGI程序能粘贴SMTP发送的附件? 
  答:在微软的Exchange Server中的WebData目录下附带了一个能够通过浏览器收发邮件的ASP源码程序,你可以看一看,把它改成CGI就行了。
  5.问:如何将第三方OCX打包进应用程序?
  答:OCX文件是不可能打包进EXE文件中的,只能单独使用,而且涉及应用程序的安装问题。EXE文件使用OCX文件是利用OLE功能来进行的,所以它们不能打包合并。所以尽量别用OCX控件,而使用VCL控件,Delphi控件面板的控件上全部属于VCL控件,你还可以安装第三方开发的纯VCL控件,很多网站上都提供有下载,使用它能完全与你的EXE融为一体。
  6.问:如何得到局域网上其它机器上网卡的物理地址? 
  答:我试了一下,发现一种方法能达到你的目的,并编了下面这个例子,供你参考:
  procedure TForm1.Button1Click(Sender: TObject);
  VAR TEMP: TSTRINGLIST;
  begin
    TEMP := TSTRINGLIST.Create;
    Shellexecute(handle,′OPEN′,PChar(′nbtstat -A 127.2.1.2 > TEMP.TXT′),nil,nil,sw_shownormal);
    TEMP.LoadFromFile(′C:\WINDOWS\TEMP.TXT′);
    IF TEMP.Count > 0 THEN
    begin
      IF POS(′MAC′,TEMP.Strings[TEMP.COUNT-1])>0 THEN
        SHOWMESSAGE(COPY(TEMP.STRINGS[TEMP.COUNT-1],15,17));
    end;
    TEMP.FREE;
  end;
  7.问:如何得到系统中正在运行的进程名(Win95/98/NT)?
  答:请创建一个工程,在窗体上加入一个Buuton和一个ListBox1控件,使用下面这段程序:
procedure TForm1.Button1Click(Sender: TObject);
  var
    hCurrentWindow: HWnd;
    szText: array[0..254] of char;
  begin
    hCurrentWindow := GetWindow(Handle,GW_HWNDFIRST);
    While hCurrentWindow <> 0 Do
      begin
        If GetWindowText(hCurrentWindow,@szText,255) > 0 Then
           ListBox1.Items.add(Strpas(@szText));
        hCurrentWindow := GetWindow(hCurrentWindow,GW_HWNDNEXT);
      end;
  end;