[返回]
中国计算机报2001年第16期

Delphi编程答疑

方世玉

我们在使用Delphi进行系统开发时,常常会遇到很多小而棘手的问题,如何解决这些问题,就成了大家最关心的事情。下面是利用Delphi进行系统开发的一些常见问题及解决方案,更多内容和源代码请见InfoCD第三期光盘。

  问:如何让应用程序删除自身?

  答:在应用程序刚要退出之前,我们创建一个Delself.bat文件,让它先删除应用程序,然后再删除自身即可。

  我们在Form的OnClose事件中加入下列代码:

  procedure TForm1.FormClose(SEnder: TObject; var Action: TCloseAction);

  var

   F : TextFile ;

   {定义变量F}

  Begin

   AssignFile(F, 'delself.bat');

   Rewrite(F);

   {F为TextFile类型}

   WriteLn(F,'del '+ExtractFileName(Application.ExeName));

   WriteLn(F,'del %0');

   CloseFile(F);

   WinExec('delself.bat',SW_HIDE);

   {执行批处理文件}

  End;

  问:如何把文件删除到回收站中?

  答:我们可以利用ShellApi中的SHFileOperation进行删除,但需要给出文件的绝对路径名,否则文件可能不能恢复。

  Procedure DelFile(FileName : String) ;

  Var

   T:TSHFileOpStruct;

   P:String;

  Begin

   P:=FileName ;

   With T do

   Begin

   Wnd:=0;

   wFunc:=FO_DELETE;

   pFrom:=Pchar(P);

   fFlags:=FOF_ALLOWUNDO

   End;

   Try

   SHFileOperation(T);

   Except

   End ;

  End ;

  问:如何隐藏桌面上的图标?

  答:想使桌面上的图标消失,连桌面上的右键功能也不能使用吗?那就跟着下面的程序,动手试一下吧。别忘了,把图标隐藏了之后再显示出来。

  Procedure HideDeskTop ;

  //隐藏桌面图标

  var

   hDesktop : THandle;

  Begin

   hDesktop := FindWindow('Progman', nil);

   ShowWindow(hDesktop, SW_HIDE);

  End;

  Procedure ShowDeskTop ;

  //显示桌面图标

  var

   hDesktop : THandle;

  Begin

   hDesktop := FindWindow('Progman', nil);

   ShowWindow(hDesktop, SW_SHOW);

  End ;

  问:如何屏蔽掉系统选单的关闭功能(Alt+F4)?

  答:在一般的应用程序中,按Alt+F4或者在系统选单里选择关闭,就可以关闭当前的应用程序,如何屏蔽掉系统选单的关闭功能(Alt+F4)呢?方法很简单,就是当当前应用程序收到关闭消息时,把CanClose设为FALSE。在本程序中,设置一个全局变量bClose,用它来控制能否关闭当前应用程序,只有单击Button3时才可以关闭当前的应用程序。

  procedure TForm1.FormCreate(SEnder: TObject);

  Begin

   bClose := False ;

  End;

  procedure TForm1.FormCloseQuery(SEnder: TObject; var CanClose: Boolean);

  Begin

   CanClose := bClose ;

  End;

  procedure TForm1.Button3Click(SEnder: TObject);

  Begin

   bClose := True ;

   Close ;

  End;

  问:如何隐藏和显示Windows的任务条?

  答: 当在系统开发中需要实现隐藏和显示 Windows任务条时,我们可以参照以下程序:

  procedure hideTaskbar; //隐藏

  var

   wndHandle : THandle;

   wndClass : array[0..50] of Char;

  Begin

   StrPCopy(@wndClass[0], 'Shell_TrayWnd');

   wndHandle := FindWindow(@wndClass[0], nil);

   ShowWindow(wndHandle, SW_HIDE);

  End;

  

  procedure showTaskbar; //显示

  var

   wndHandle : THandle;

   wndClass : array[0..50] of Char;

  Begin

   StrPCopy(@wndClass[0], 'Shell_TrayWnd');

   wndHandle := FindWindow(@wndClass[0], nil);

   ShowWindow(wndHandle, SW_RESTORE);

  End;