我编的杂志里刚好有一点,也来了!哈哈!
---------------------------------------------------------
『联合网络期刊』
[试验阶段]
|网罗网络精英| |交流电脑知识|
|了解业界新闻| |创造美好明天|
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
※ 中文DELPHI ※
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
※ 日期:1998-09-14 Version 001 ※
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
栏目名称:编程版(Delphi)
主 持 人:michaeljia(http://www.nbip.net/michaeljia)
投稿请寄:god@263.net?Subject=ProgramDeliver
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
编者:
中文DELPHI终于和大家正式见面了,希望在今后的日子里能够得到
大家的关心和爱护,当然是多多赐稿啦!同时希望得到大家的建议和
批评。
本期主要是文摘,摘自个大刊物的编程版的文章,很有必要放入各位
的小程序库。
~~~~~~~~~~~~~~~~
Delphi的分发工具——InstallShield
吴怡敏
Delphi是颇受程序员欢迎的软件开发工具。如果您用Delphi编写
了一个软件,并且想对外发行,那您就需要一个安装程序。安装程序并
不只是把软件拷贝到硬盘上这么简单, 它还必须提供友好的界面、多
样的安装选择(如目标路径、安装选件等),显示必要的文字或图像信
息。在Windows NT或Windows 95环境下,您还得考虑到卸载的问题,即
当用户觉得不再需要时,他能简单便捷地把该软件从硬盘上彻底清除
掉。
如果您要分发的软件是数据库应用程序,那么情况将更复杂。因
为Delphi是通过其数据库引擎BDE与数据库打交道的,在分发时,您还
得考虑哪些链接文件是必需的,并作适当的配置。可想而知,编写一个
安装程序并不是一件轻松的事情,而InstallShield的出现为程序员解
决了以上烦恼。InstallShield是一种开发安装程序的软件,已为大多
数软件公司所接受。与InstallShield专业版相比,其Delphi版功能稍
弱,但却更简单易用。它完全是可视化的,开发一个安装程序,您需要
做的仅是回答一些问题、填写一些数据,剩下的事情都由InstallShie
ld完成。
使用InstallShield前的准备工作
在使用InstallShield前,应该对产品的形象进行充分的构思,撰
写必要的文档并设计图案、图像等。这包括版权说明、帮助文件、Re
adme文件、公司商标、安装界面的背景、应用程序图标等等。随后以
相应的格式保存这些文件,如.txt、.hlp、.bmp、.ico等。
另外,组织好将要安装拷贝的文件。把同类型的文件安排在同一
个子目录下,这些在同一子目录下的文件称为群(Group),您可以把一
些意义相近或相关的群组成组件(Compo nent),组件构成了安装类型(
Setup Type)。通常情况下,用户在安装软件时应有三种选择,即典型
安装、最小安装和用户自定义安装。典型安装包括了所有的组件,最
小安装只包含那些能使系统运行的必要组件,自定义安装则由用户来
挑选应安装的组件。
制作过程
在Windows 95下运行InstallShield,选取菜单"File"下的"New",
创建一个新项目。在弹出的对话框中输入项目名、所在目录,如果您
想提供多种安装类型,请在"Include a custom setup type"选择框中
打上标记,单击"Create"后即可进入编辑状态了。这里顺序列出了九
个制作步骤,相当于在这九个栏目中填写必要的参数。以下就其中一
些主要的步骤作一个简单的说明。
1.设置界面(Set the Visual Design)
这里可以设置三类参数:
·安装程序名(缺省为项目名)、版本号、公司名称和安装时的缺
省路径等。Instal lShield使用的路径有两类,一类是实际路径,如"C
:/PROGRAM",另一类是指定路径。指定路径根据安装的实际环境代表
相应的路径,如<WINDIR>代表Windows所在的路径。
·安装程序运行时的背景标题(可以是文字也可以是图像)、公司
标记和背景颜色等。
·是否包含卸载程序,若选择"是"(缺省),则InstallShield会自
动把卸装程序UnIns tallShield加入到安装程序中,若无特殊原因,请
接受系统的建议。
2.为驱动Delphi数据库应用挑选必要的对象(Select InstallShi
eld Objects forD elphi)
正如上面提到的,Delphi应用程序通过BDE与数据库打交道。因此
如果您的程序涉及到数据库,请在安装程序中包含BDE。在这里,Insta
llShield会提示您输入一些必要的BD E参数,包括数据库别名、数据
库类型(DBASE、PARADOX、ORACLE等)以及安装后数据库所在的路径等
等。
3.安排群、组件、安装类型(Specify Components and Files)
您可以建立多个群,并通过Windows的资源管理器为群指定其包含
的文件,为每个群安排一个安装目录。若干个相关的群构成组件,你可
以为每种安装类型指定相应的组件。
此外,还可以为安装程序制作一些必要的信息(如欢迎信息、版权
声明、告示栏等); 指定应用程序的图标并决定包含这些图标的文件
夹;确认安装结束后立即启动主程序或是显示一个Readme文件;为您的
软件设定一些关键字。Windows 95和Windows NT已经屏弃了由应用软
件修改Win.ini的旧方式,取而代之的是更为合理的登记系统——一个
被称为"R egistry"的数据库,应在该数据库中为新装载的软件建立必
要的关键字。当然,如果您对该登记系统了解不深,也不必过分担心,I
nstallShield会自动为您设定一些必要的关键字。
单击"Disk Builder ",选取分发软件的介质(软盘或CD),再单击"
Build",InstallSh ield马上为您生成一个描述程序——InstallShie
ld编译器所能接受的语言。再单击"Co py to Floppy"即可生成最终
的安装盘。在此之前,您可以单击"Test Run"来测试安装效果,如不满
意,可回过头来对项目作一番修改。
从以上可看出,一个标准的安装程序在弹指间即告完成。Install
Shield3的Delphi版与Delphi 3.0的Client/Server版捆绑在一起,当
然,它也是一个独立的程序。值得一提的是,您要分发的应用软件也不
必非得是用Delphi开发的,只要您的程序不涉及数据库部分即可。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
Delphi开发中Windows API函数的应用
首都经贸大学信息系95研 (100026) 何章梅
Delphi作为快速开发Windows95/NT下应用程序的工具,已经为越
来越多的开发者采用。但是,如果要开发出专业的Windows应用软件,
还需要使用大量的Windows API函数,以下是笔者开发管理软件中的几
个应用实例。
一、判定Windows版本
众所周知,Windows95/NT某些地方有些差别,为了使应用程序避免
出现因为系统不符合而导致的错误,有必要自动判定系统版本。这可
以通过API函数getversion实现。
TForm1.FormCreate(Sender:TObject);
var ver:integer;//版本号
major:integer;//主版本号
minor:integer;//次版本号
begin
ver:=getversion();//获得版本号
major:=ver and 255;//获得主版本号
minor:=(ver and 255*256)div 256;
//获得次版本号
showmessage(‘系统版本号是:’+inttostr(ver));
//显示版本号
showmessage(‘系统主版本号是:'+inttostr(major));//显示主
版本号
showmessage(‘系统次版本号是:'+inttostr(minor));//显示次
版本号
end;
二、判定Windows安装目录
一般Delphi开发出来的程序需要知道系统的安装目录,以便将帮
助文件、动态链接库等系统部分拷贝到系统目录下,为了使安装程序
能够在用户任意设定安装目录的情况下均能正常运行,需要使用API函
数GetWindowsDirectory、GetSystemDirectory来实现。
procedure TForm1.FormCreate(Sender:TObject);
var windir
char;
sysdir
char;
begin
getmem(windir,256);//获得内存
getmem(sysdir,256);//获得内存
GetWindowsDirectory(Windir,128);//获得安装目录
GetSystemDirectory(sysdir,128);//获得系统目录
showmessage(‘Windows目录是:'+windir);
//显示安装目录
showmessage(‘System目录是:'+sysdir);
//显示系统目录
freemem(windir,256);//释放内存
freemem(sysdir,256);//释放内存
end;
三、在程序中重新启动Windows系统
通常在程序中需要将系统重新启动,这时可以使用ExitWindowsEx
函数来实现。
procedure TForm1.Button1Click(Sender:TObject);
begin
ExitWindowsEx(EWX_FORCE or EWX_LOGOFF,0);
//强行结束当前登录的用户进程
ExitWindowsEx(EWX_FORCE or EWX_POWEROFF,0);
//强行关机
ExitWindowsEx(EWX_FORCE or EWX_REBOOT,0);
//强行重新启动机器
end;
四、调用其他程序
通常,用户希望能够在一个应用程序中直接调用外部程序,这可以
通过winexec函数来实现。
procedure TForm1.Button1Click(Sender.TObject);
begin
winexec(‘c:/pwin97/notepad.exe c:/config.dos',9);
end
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
在DELPHI2.0/3.0中直接操作端口
宋永柱
Borland Delphi2.0/3.0以其强大的功能及方便快捷的程序设计
而为广大程序员所喜爱。但是在用它来编写工业控制程序时,需要对
计算机所连接的外部设备进行操作,即直接对I/O地址进行读写操作,
这时该软件就显得有些美中不足了。
针对这一问题,笔者使用Delphi 2.0/3.0以内嵌汇编的方式编写
了一个模块PORT95. PAS,可方便地实现直接对I/O地址的读写操作,代
码简捷且执行速度较快。
使用时只要将PORT95.PAS加到工程文件中,并在users中加上Port
95,就可以在应用程序中直接对I/O端口进行操作。
具体的实现方法及PORT95.PAS的源代码如下:
unit Port95;
interface
function PortReadByte(Addr:Word) : Byte;
function PortReadWord(Addr:Word) : Word;
function PortReadWordLS(Addr:Word) : Word;
procedure PortWriteByte(Addr:Word; Value:Byte);
procedure PortWriteWord(Addr:Word; Value:Word);
procedure PortWriteWordLS(Addr:Word; Value:Word);
implementation
{*
* Port Read byte function
*Parameter
ort address
*Return: byte value from given port
*}
function PortReadByte(Addr:Word) : Byte; assembler; regi
ster;
asm
MOV DX,AX
IN AL,DX
end;
{*
* HIGH SPEED Port Read Word function
* Parameter: port address
* Return: word value from given port
* Comment:may problem with some cards and computers that
can't to access whole word, usualy it works.
*}
function PortReadWord(Addr:Word) : Word; assembler; regi
ster;
asm
MOV DX,AX
IN AX,DX
end;
{*
* LOW SPEED Port Read Word function
* Parameter: port address
*Return:word value from given port
*Comment:work in cases,only to adjust DELAY if need
*}
function PortReadWordLS(Addr:Word) : Word; assembler; re
gister;
const
Delay = 150;
// depending of CPU speed and cards speed
asm
MOV DX,AX
IN AL,DX
//read LSB port
MOV ECX,Delay
@1:
LOOP @1 //delay between two reads
XCHG AH,AL
INC DX
//port+1
IN AL,DX //read MSB port
XCHG AH,AL //restore bytes order
end;
{* Port Write byte function*}
procedure PortWriteByte(Addr:Word; Value:Byte); assemble
r; register;
asm
XCHG AX,DX
OUT DX,AL
end;
{*
* HIGH SPEED Port Write word procedure
* Comment:may problem with some cards and computers that
can't to access whole word, usualy it works.
*}
procedure PortWriteWord(Addr:word; Value:word); assemble
r; register;
asm
XCHG AX,DX
OUT DX,AX
end;
{*
* LOW SPEED Port Write Word procedure
*}
procedure PortWriteWordLS(Addr:word; Value:word); assemb
ler; register;
const
Delay = 150;
// depending of CPU speed and cards speed
asm
XCHG AX,DX
OUT DX,AL
MOV ECX,Delay
@1:
LOOP@1
XCHG AH,AL
INC DX
OUT DX,AL
end;
end. //单元结束
上述PORT95.PAS适用于Delphi 2.0/3.0、Windows 95 操作系统
。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
Welcome to C++ Builder & Delphi Station
http://www.nbip.net/michaeljia
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
订阅主页:http://cnm.yeah.net
主 编:dreamer@cj.net.cn
__________________________________________________________________
Free mailing list by Cool List. http://www.coollist.com
##Unsubscribe automatically at http://remove.coollist.com