Delphi程序设计技巧 Delphi是Borland公司于1995年推出的Windows环境下的可视化编程语言，最近Borland又推出了功能更强的Delphi 3．0，Delphi 3提供较佳的环境与执行速度，其速度比刚推出的VB 5．0快了3～6倍以上。Delphi将我们从复杂的Windows编程中解放出来，极大地提高了编程效率。下面介绍用Delphi设计程序的有关问题。 1．养面设计 在Windows应用程序中，快速工具条已经成为标准的屏幕界面，而Delphi又提供了SpeedButton、Panel，可以方便地制作快速工具条。
（l）产生切换效果SpeedButton
一般情况下放置的SpeedButton，按下去后，当鼠标移开时，按钮会重新弹起。要产生一个按下去后不弹起，再按一下才会弹起的按钮操作如下：选定所要改变的那个按钮，将“AllowAllUp”属性改为True，并且将Grouplndex属性赋予一个组号，（不能为0，要根据需要对SPeedButton进行分组）如下所示。
组件属性设置
SpeedButtonl AllowAllUp True
GroupIndex 1
（2）产生具有已经按下效果的SpeedButton
选择要改变的按钮，将按钮的“Grouplndex”属性给定一个不为0的组号，然后再将“Down”属性改为Ture。 组件属性设置
SpeedButtonl Down True
Grouplndex 1
（3）建立相互排斥的SpeedButton
要产生类似于Word中文本对齐格式按钮，可按住Shift键，然后用鼠标将要成为一组的按钮都选中，修改按钮的“Grouplndex”属性，给定一个不为0的组号。
组件 属性 设置
SpeedButton 1…SpeedButton N Grouplndex 1

2．菜单的合并
子窗体中的菜单有时需要连接在主窗体中，例如在FoxPro中，当打开一个屏幕文件时，主菜单就会增加一个“Object”项，关闭屏幕文件时，这一项就会消失。如果要产生这个效果，需要在主窗体中设置一个MainMenu元件，产生主菜单。在子窗体中再设置MainMenu元件，产生需要增加的菜单项。子窗体菜单项在主窗体菜单中的增加位置由“Grouplndex”属性确定（值越小越靠前），如果子窗体菜单项与主窗体菜单项的“GYOUplfideX”相同，主窗体的
菜单项将被子窗体的菜单项取代、最后还要将子窗体
MainMenu元件的“AutoMerge”属性改为True（主窗体的
MainMenu兀件的 AutoMerge属性一定要为 False）。
组件属性设置
MalnMenul AutoMerge False
ChildMeunZ AutoMerge True

3．汉化Delphi
（l）按钮及有关提示文字的汉化
在使用Delphi编写程序的过程中，经常会出现一些英文提示，使用资源编辑器就可以将这些信息修改成中文。建议用MS的APPSTUDIO修改，因为APPSTUDIO支持中文，而Borland的Resource Shop不能正确输入某些汉字。需要修改的文件有以下几个：
MCIMSG．RES
TOCONSTh．RES
DBCONSTS．RES
LIBCONST．RES
CONSTS．RES
VBXMSG．RES
SYSUTILS．RES
将其中有关的文字汉化为中文后，在菜单中选择“Rebllild Library”就可以使用汉化后的资源了。
（2）模板的汉化
用“File”菜单中的“Open”命令打开并修改GALMRY目录下的文件，将英文提示换成中文，再用“Save”命令存盘。

4．使文字具有立体感
由于字体有Transparent（透明）属性，因此可以生成两个相同Caption的babel元件，将其中处在后面的一个Label字体颜色改为白色，另一个仍为黑色，这时将它们的“Transparelit”属性都改为Tthe，按Ctrl和光标键移动它们的位置，使它们稍微错开一点，这时就感觉字体有立体感了。

5．使程度只加载一次
不少应用程序只允许在内存中加载一次，比如Word for Windows。在Windows 3．X中使用Delphil．0实现该功能，只需在DPR文件的执行地起始部分加人：
If HprevInst ＜＞ 0 then exit；
这样就可以防止应用程序被多次加载，不过这个方法不适用于Windows 95。在Windows 95下无论运行程序的多少个拷贝，HprevInst总是返回0。因此如果要编写在Windows 95中运行的程序时，通常是通过使用WINAPI的FindWindow函数来搜索已登记了的窗体，以防止同一程序的多次加载。
Findwindow函数调用的方式如下：
Function Findwindow（Classname，WlndowsName；Pchar）：Hwnd ；
Classanme是一个包含类名的以NULL结尾的字符串，如果字符串为空，则所有的类名都匹配。
WindowName是一个包含窗口名的以NULL结尾的字符串，如果字符申为空，则所有的类名都匹配。
这个函数的功能是返回与需要查找的类名和窗口名一致的窗口句柄，如果不成功则返回0。要注意的是这个函数不能查找子窗口。

6．对端回的直接操作
对于VB来说，对端口的直接操作要通过外部的DLL来完成，而对Delphi则完全没有这个限制。你可以通过以下两种方式完成对端口的操作：
（1）使用端口预定义数组
Delphi仍然保留了Turbo Pascal的两个预定义数组Port和PortW，这两个一维数组的每个元素表示一个数据端口，它们的端口地址是相对应的。下标的类型为整型字。
Port数组成员是Byte类型的，PortW数组的成员是Word类型的。
（2）采用直接嵌人汇编语言
DelPhi中仍然可以像以往一样，在Turbo Pascal中使用嵌人汇编语言。
语法如下：
asm
AxemblerStMt．＜Separator AssemblerStmt＞
end

7．对指定内容进行操作
在Turbo Pascal中，如果我们在编写程序时要取内存中某个单元的值，这时就要用到下面三个预定义数组：
MEM字节型（Byte）
MEMW字型（Word）
MEML长整型（Longint）
由于Windows一般工作于保护模式下，采用386内存分页机制，因此我们不能直接用以上数组对内存单元进行操作，否则有可能因为分页不同而导致访问的内存与指定的地址不一致。因此在存取指定内存前，需要生成一个选择器。当有了选择器后，就可以使用内存数组了。
（龙风）