Delphi编程技巧十则… 1.通过DDE创建程序组和快捷方式 若要在应用程序执行过程中动态创建程序组和快捷方式，可以通过向程序管理器发送DDE命令来完成。实现过程如下： 在Form上放一个 TDDEClientConv控件，命名为：DdeClientConv1，将其DdeService属性设置为ProgMan，DdeTopic设置为Progman，ConnectMode设置为ddeManual。添加一个“创建”按钮，并编写如下代码： DdeClientConv1.OpenLink //打开DDE会话
sMacro:='[CreateGroup('＋'新建程序组'＋',' ＋'Test'＋')]';{宏}
StrPCopy(szMacro, sMacro);//将宏复制到字符缓冲区
DdeClientConv1.ExecuteMacro(szMacro, False);//执行宏
sProgIcon:='C:\Windows\Notepad.Exe';//快捷方式命令行
sProgDesc:='记事本';//快捷方式描述
sMacro:= [AddItem(' ＋ sProgIcon ＋ ',' ＋ sProgDesc ＋ ')]';
StrPCopy(szMacro, sMacro);
DdeClientConv1.ExecuteMacro(szMacro, False);
DdeClientConv1.CloseLink; //关闭DDE会话
创建结果如图1所示。若要删除或显示已有的程序组，可以使用如下宏命令：

sMacro:='[DeleteGroup(″附件″)]';//删除"附件"组
sMacro:='[ShowGroup(″启动″)]';//显示″启动″组
2.实现英文朗读功能
很多软件具有英文发音和朗读功能，它们都使用了MSTTS（Microsoft Text To Speech）技术。微软遵照COM的标准，提供了一套Speech API来对MSTTS进行编程。要在程序中使用这套API，必须确保系统已经安装了MSTTS和Spchapi软件包。
Speech API可以作为类型库引用到Delphi中，方法是:打开Project菜单下的Import Type Litrary，点击“Add”加入Windows\Speech目录下的Vtxauto.tlb文件，在Delphi的Import目录中就会生成VTxtAuto-TLB.pas文件，其中定义了VTxtAuto-TLB单元，把它加到Uses成员中来。设计如图2所示的窗口，定义全局变量：

var VoTxt：IVTxtAuto;
然后在Form的OnCreate事件中加入：
VoTxt：=CoVTxtAuto_.Create;
VoTxt.Register('','Speech Test');//注册
“Read”按钮代码为：
VoTxt.Speak(Memo1.Lines.Text,10);//朗读
“Stop”按钮代码为：
VoTxt.StopSpeaking; //停止朗读
至此，应用程序已具有朗读功能，10表示使用普通语气。借住VoTxt的属性和方法，我们还可以控制阅读速度和语气，实现暂停、跳句等功能，Speech API编程就这么简单。
3.抓获全屏
根据Windows GDI与设备无关的特点，利用BitBlt或StretchBlt函数将显示设备上的位数据传输到目标设备上，然后在目标设备上创建兼容位图:
SourceDC:=CreateDC('DISPLAY','','',nil);//创建源设备环境，DISPLAY为显示器
DestDC:=CreateCompatibleDC(SourceDC);
//创建和SourceDC兼容的目标设备环境
BHandle:=CreateCompatibleBitmap(SourceDC, Screen.Width,Screen.Height) ;
//创建一个和SourceDC兼容的内存设备环境，并返回其设备句柄
SelectObject(DestDC,BHandle);
BitBlt(DestDC,0,0,Screen.Width,Screen.Height, SourceDC,0,0,SRCCOPY) ;
//抓图
Bitmap:=TBitmap.Create;
//Bitmap为TBitmap类型
Bitmap.Handle:=BHandle;
Bitmap.SaveToStream('C:\My Documents\ FullScreen.bmp') ;//保存到文件
DeleteDC(DestDC) ;
ReleaseDC(BHandle,SourceDC) ;
//释放设备环境
以上程序中，各设备环境的数据类型为Integer。
4.更改桌面墙纸
通过修改注册表，可以动态改变桌面墙纸及其显示方式（平铺还是居中）：
Reg.OpenKey('Control Panel\Desktop',False);//打开Control Panel下的Desktop键
Reg.WriteString('Wallpaper','C:\Windows\Bubbles. Bmp');//指定位图
Reg.WriteString('TileWallpaper','1');//设置平铺方式
Reg.CloseKey;//关闭键，Reg为Tregistry类型
SystemParametersInfo(SPISETDESKWALLPAPER, 0,nil,SPIF-SENDWININICHANGE)
//更新用户配置文件并刷新桌面
5.隐藏桌面图标
桌面也是一个窗口，将其设置为不可见即可达到隐藏桌面图标的目的。
Var hDesktop:THandle;
Begin
hDesktop:= FindWindow('Progman', nil);
//获取桌面窗口句柄
ShowWindow(hDesktop, SW-HIDE);//隐藏
End
6．隐藏和显示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;
7.锁定鼠标
利用ClipCursor函数将鼠标限制在某一矩形区域。
Var rect:TRect;
Begin
rect.Left:=0; rect.Top:=0; rect.Right:=0; rect.Bottom:=Screen.Height;
ClipCursor(@rect); //将鼠标锁定在屏幕左侧
End;
8．控制窗体
如何在Delphi中把Form控制成不能放大/缩小/移动/关闭的窗体，可进行如下步骤：
（1）把Form的BorderIcons下的几个子属性值全改为False。
（2）修改Form的BorderStyle的值为bsSingle。
（3）为了让窗口不能移动,可以自已拦下WM-NCHITTEST消息，对该消息的处理为:一概回应鼠标点在窗口的Client区域, 相信这个视窗就不会动了。
下面是一个例子, 请参考：
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure WMNCHitTest(var Msg: TMessage); message WM-NCHITTEST;
public
{ Public declarations }
end;
var Form1: TForm1;
implementation {＄R ＊.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
Close; // 不可少, 因为已经没有其他方法能关闭此窗口了
end;
procedure TForm1.WMNCHitTest(var Msg: TMessage);
begin
inherited; // 这样,移动就不可能了
...
Msg.Result := HTCLIENT;
end;
9.创建不规则窗口
用CreateRectRgn、CreateEllipticRgn等函数创建一个区域，然后用SetWindowRgn函数将其设置为窗口的显示区域。如下程序创建一个椭圆窗口：
r1:=CreateEllipticRgn(0,0,form1.width,form1. height);
SetSindowRgn(Form1.Handle,r1,True);//r1为LongInt类型
10.让应用程序自身删除
在应用程序刚要退出之前创建一个Delself.bat文件，让它先删除应用程序，然后删除自身。在Form的OnClose事件中加入下列代码：
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);
11.访问保护属性
众所周知，Delphi的对象有private、protected和public三个级别的访问控制。而Delphi有一个奇怪的规则，就是在同一个unit里的对象可以互相访问对方的protected 级别属性！
利用这个特性，我们可以轻松访问任意对象的protected级别属性。虽然这样不是很符合面向对象编程的封装的思想，但有时的确是非常有用的。比如在使用TDBGrid时，我们对如何获得其Row和Col非常头疼，其实在TDBGrid中，Row和Col都是protected级别的属性，我们只要在需要使用这两个属性的unit的interface里声明
TFakeGrid = class(TDBGrid);
然后就可以使用TFakeGrid(ADBGrid).Row和TFakeGrid(ADBGrid).Col 轻松访问了，这个规则对protected里的方法同样适用。

（杨晓晔 经 乾）