delphi操作数据库学习

http://hi.baidu.com/wzca

 

http://hi.baidu.com/yuzhenger

 

 

查看文章
  

delphi操作数据库学习24
2007年10月16日 星期二 17:09

这是本次讲座的最后一讲,将为大家介绍一下比较零碎的知识,希望大家能坚持到底。

1 “关于”窗口

现在的软件在一般在“帮助”菜单中都有一项“关于”菜单项,执行后会得到程序的版权、开发人员、版本号等信息,有的还有可用物理内存、资源占用等一些信息。这个关于窗口的设计是比较简单的,Delphi自身也带有一个About“半成品”窗体,供用户进行加工使用。可用物理内存、资源占用等等都是用API函数获得的,这方面的资料网上到处可见,就不讲了,这里只讲一下程序的版本号。程序的版本号当然用户可用标签之类的组件自己写上,但有时大家发现,现在有点流行如:Build 4.1.5.137这样的版本号。这样的版本号一般都不是手工输入了,而是提取的程序自身的版本号。程序自身的版本号在哪里控制呢?执行Project菜单下的“Options”功能,在打开的窗口中有一个“Version Info”页面,在这个页面中,用户可设定这四个版本号初始数据,也可以随时根据程序的功能是否有大的变化升级主版本和次版本号,将“Auto Increment build number”前的复选框选中,以后每当用户用Project菜单下的“Build all Projects”功能时,最后的build编号将自动增加1。一般来说,在前面的三个号不变时,最后的编号越大说明程序的更新时间最近。在这个页面上还有一些其他功能如公司名称等等可以设定,读者自己试试吧。

现在我们来说明如何用代码获得这四个编号。下面是获取这四个版本号的通用函数代码,用户直接调用即可:

function GetBuildInfo: string;

var

   VerInfoSize: DWORD;

   VerInfo: Pointer;

   VerValueSize: DWORD;

   VerValue: PVSFixedFileInfo;

   Dummy: DWORD;

   V1, V2, V3, V4: Word;

begin

   VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);

   if VerInfoSize = 0 then begin

     Dummy := GetLastError;

     Result := '0.0.0.0';

   end; {if}

   GetMem(VerInfo, VerInfoSize);

   GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);

   VerQueryValue(VerInfo, '/', Pointer(VerValue), VerValueSize);

   with VerValue^ do begin

     V1 := dwFileVersionMS shr 16;

     V2 := dwFileVersionMS and $FFFF;

     V3 := dwFileVersionLS shr 16;

     V4 := dwFileVersionLS and $FFFF;

   end;

   Result := IntToStr(V1) + '.'

     + IntToStr(V2) + '.'

     + IntToStr(V3) + '.'

     + IntToStr(V4);

   FreeMem(VerInfo, VerInfoSize);

end;

调用示例:

version.caption:='版本号: '+GetBuildInfo;//version是一个标签组件。

2 帮助功能

程序的帮助功能一般都是打开帮助文件,做的比较好的帮助文件就是能上下文关联,但这是比较麻烦的。目前一般的帮助功能都是打开CHM格式的文件,所有的帮助内容都在其中。现在hlp文件用的越来越少打开一个CHM格式的文件代码如下:

procedure TMainForm.help1Click(Sender: TObject);

var fpath:string;

begin

fpath:=ExtractFilePath(ParamStr(0))+'help.chm';

ShellExecute(handle,nil,pchar(fpath),nil,nil,sw_shownormal);

end;

上面的代码中,首先获取当前执行文件(EXE文件)所在的路径,然后在此路径下寻找help.chm帮助文件并打开它,这就要求帮助文件和执行文件要放在同一目录下,如果你的帮助文件很多,有单独的子文件夹,那么对上述代码做一点修改即可。

3 制做数据库安装程序

如果不是数据库程序,用Delphi自带的安装制做程序InstallShield Express for Delphi(下面简写为ISE)制做是很容易的事,非常简单。但对数据程序来说,如果是采用的BDE方式操作数据库,那么在制做数据库安装程序时就必须要发布BDE。对于Paradox和DBF等类型的数据库来说,把BDE打包进去安装后一般不会有什么问题,但对Access97数据库(ACCESS2000数据库没试过)来说,发现用ISE制做后安装到别的电脑中总是不能成功,经过仔细研究发现了ISE的一个BUG,并解决了这个问题。这个BUG是由于打包后的BDE在别的电脑中安装后,将/Software/Borland/Database Engine/Settings/DRIVERS/MSACCESS/INIT的一个键值DLL32的值写为了IDAO32.DLL,这是ACCESS95用的,不支持ACCESS97,所以才会出现错误,解决的办法就是制做时添加此键值为正确的IDDA3532.DLL(也就是修改为正确的),这样就可保证安装后无需再手工修改了,一次成功。

对数据库程序来说还有一个问题要考虑,就是安装后数据库别名的自动建立并指向用户指定的安装目录下的数据库。研究了一下ISE的帮助文件后解决了这个问题,下面给大家介绍一下用ISE制做ACCESS97数据库安装程序的关键几点,其他的步骤就不讲。下面的步骤编号对应ISE中的步骤号:

第一步: 输入 Application name 如demo,其他的自行设定,要选中自动删除

第二步:先设定别名后,在后面PATH输入: <INSTALLDIR>/   ,TYPE设定为:MSACCESS,参数写:DATABASE NAME=<INSTALLDIR>/数据库名.mdb,这是数据库别名能正确找到用户安装路径下数据库的保证。

第三步: 在GROUP->program file中嵌入自己的数据库文件、帮助文件等,即和EXE文件放在一起

第五步: 在 Registry-keys 中的HKEY_LOCAL_MACHINE中addkey:

/Software/Borland/Database Engine/Settings/DRIVERS/MSACCESS/INIT

在Registry-value中添加ADD value ,TYPE:string;

Value:   DLL32

Value data:IDDA3532.DLL

    只要上面的几步操作无误基本上就可保证能一次安装成功。对于以ADO方式编写的数据库程序来说,无需BDE,所以也就很方便了再一点是安装界面的汉化问题现在网上有汉化文件,找到后把几个DLL文件(其实就是资源文件)覆盖就可以了。现在其他的安装程序制做软件也很多如WISE等等,有些功能非常强大,动辄占用几十兆的空间,不过不喜欢用这些,ISE使用简单,还是喜欢用它。安装程序的目的就是把所需的文件安装到用户的电脑中,并做一些配置,只要这个目的能达到越简单、实用越好,不必追求华丽的安装界面。

4 程序加密注册

任何一个软件都是辛勤劳动的结果,无偿被别人使用总是不甘心,除了一些免费软件之外。那么对程序加密到底有多大意义呢?由于加密和解密是一对矛盾,只要你能加密,总有高手能解密。认为,程序的加密适可而止吧,可以做点简单的加密,不要把大量精力放在这上面,还不如去把精力用在软件的功能升级上,不断地推出功能更强大的软件让解密者去解吧。现在加密的方式有多种,但一般比较通用的方式是读取用户电脑硬件信息作为密匙。从目前来说硬盘出厂编号、主板编号、BIOS信息、CPU编号等是最常用的或结合起来用,但硬件升级换代也很快,况且不同厂家的硬件信息也有差异,如有的硬盘没有出厂编号,P3CPU的编号被屏蔽,同一批主板的BIOS信息相同等等都会给加密造成不确定因素,容易导致加密失败。

给大家介绍比较简单容易的读取硬盘序号(格式化后才会改变)的加密方式。读取硬盘序号的代码也很简单,用API函数,这种方式大家也可能早就知道了,这里就简单提一下吧,关键代码如下:

GetVolumeInformation(pchar('c:/'),nil,0,pdw,mc,fl,nil,0);

这里注意一定要取C盘序号,因为可能有的硬盘没有分区,没有D盘等等,为了程序的通用性,取C盘。此序号读出后一定要进行加密变换,否则程序就等于没有加密。把加密后的信息写入注册表即可。这样以后程序启动时进行同样操作看是否和注册表中的密码一致,若不一致则是非法拷贝。这种加密方法的缺点在于:由于程序中也有变换算法,可被高手跟踪解密或制做出注册机。别管那么多了,毕竟普通用户没这个水平,再说若盗版很厉害说明你写的软件有水平,现在微软的产品盗版这么严重,微软不照样发展很快吗?其余的就不用再说了吧。这里有读写注册表的操作,给大家简单提示一下。

//创建注册信息-------------

   TheReg := TRegistry.Create;

   TheReg.RootKey := HKEY_LOCAL_MACHINE;

   keyName := 'SOFTWARE/lklb';

   sr:='userid';

   sr1:='user';

if TheReg.OpenKey(KeyName, True) then

begin

TheReg.WriteString(sr1,edit1.text); //用户名

TheReg.WriteString(sr,pass(passwd));//系列号

TheReg.CloseKey;

label3.caption:='注册成功!';

end;

     现在的程序在状态条上或在标题栏上显示用户名称,如下代码:

//读取注册信息用户名显示在状态条上

   TheReg := TRegistry.Create;

   TheReg.RootKey := HKEY_LOCAL_MACHINE;

   keyName := 'SOFTWARE/lklb';

   if TheReg.OpenKey(keyName, True) then

    begin

    user:='【用户名称】:'+TheReg.readString('user');

    StatusBar.Panels[0].Width:=length(user)*6+10;

    StatusBar.Panels[0].Text:=user;

    TheReg.CloseKey;

    end;

    Thereg.Free;

    上述代码动态控制状态栏中显示用户名称的面板的宽度,因为用户名称长短不一,注意看看字符和像素的换算(需要自己摸索一下)。

    检测是否盗版部分代码:

   //读取注册信息

   TheReg := TRegistry.Create;

   TheReg.RootKey := HKEY_LOCAL_MACHINE;

   keyName := 'SOFTWARE/lklb';

   sr:='userid';

if TheReg.OpenKey(KeyName, True) then

   begin

    sr1:=TheReg.readString(sr); //读取注册表密码

    TheReg.CloseKey;

   end;

if sr1<>sr2 then //sr2为计算经变换后的密码

   begin

   MessageDlg('非注册用户,是盗版的吧?', mtWarning, [mbOK], 0);

   application.Terminate;

       end;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值