delphi2007,Delphi 2007 安装控件似乎没 Delphi 7方便了
尊敬的读者,delphi2007和Delphi 2007 安装控件似乎没 Delphi 7方便了是当前备受关注的话题,但许多人对其仍存在疑惑。在本篇文章中,我将为你提供清晰的解释和深入的分析,希望能满足你的求知欲望。
Delphi 2007 安装控件似乎没 Delphi 7方便了
哦告诉你一些关于安装控件的注意点:
将下载的控件安装到delphi中的方法
1只有一个DCU文件的组件。DCU文件是编译好的单元文件,这样的组件是作者不想把源码公布。一般来说,作者必须说明此组件适合Delphi的哪种版本,如果版本不对,在安装时就会出现错误。也正是因为没有源码,给使用者带来了不便,那就是一旦Delphi版本升级,此组件就不能再使用了,当然有的作者给出了几种版本的DCU文件,用户根据需要选择使用。这样的组件的安装方法是:在Component菜单中,选择installcomponent,在对话框
"intoexistingpackage"页中,单击“Unitfilename”后的“Browse”按扭,在打开的文件对话框中,将“文件类型”设定为*.dcu,找到要安装的DCU文件,按OK按钮返回"intoexistingpackage"页后再按OK按钮就可以安装了。注意,此时Delphi会提示dclusr40.dpk将被重建,是否继续,OK就可以了。这里是将组件安装到dclusr40.dpk包中,此包从文件名上可以看出是用户自定义组件包,先安装到这个包中吧,下面再讲有关注意事项。安装完毕会有已经将组件注册完的提示信息以及安装到哪个组件页中的信息等,到组件面板上看看,一般会出现一个新的组件页,其中有刚安装的组件。
2、只有PAS文件或既有PAS又有DCU文件的组件。这种组件因为有PAS文件,也就是说作者提供了源码,这就好办多了。安装的方法和上面是一样的,在文件类型中可以设定为DCU也可以设定为PAS,建议设定为PAS,这样可用你的Delphi重新编译一下,看是否会出现问题。Delphi升级后只能选择PAS文件安装,这样才能重新编译,使得组件能适应新Delphi版本。这样的组件是很值得使用的,根据心铃的经验,没有源码的组件最好不要使用,一是存在Delphi版本升级后无法使用的问题,再者当程序出现问题后用户无法调试组件来判断是否是组件中存在BUG。
3、有dpk文件的组件包。带有dpk文件的组件包一般是有多个组件构成的,也就是说安装后会有多个组件供使用,如果只有一个组件作者一般不会制成DPK文件,使用上面的方式发布就可以了。对于这样的组件包,一般来说会有详细的安装说明文件,如上面提到的RXLIB,由于组件复杂且安装时有先后顺序,作者不提供安装说明用户根本无法正确安装。如果没有安装说明文件,那么用下面的方法安装:在File菜单下,选择”OPEN…”打开dpk文件(文件类型列表框中选*.dpk),在出现的Package窗口中,工具栏上有Install按钮,按此按钮即可进行安装。如果Install按钮处于无效状态,那么先按Compile按钮编译,一般来说编译之后Install按钮就会处于有效状态,此时再按Install按钮就可以了。
4、带有Bpl文件的组件包。一般来说这也是由多种组件构成的组件包,它其实是一个动态连接库文件(DLL)。对于这种组件包的安装方法是:在component菜单下选择“installpackages”,然后单击Add按钮,在打开的文件对话框中找到相应的bpl文件打开返回后,再单击Ok按钮就可以了。
5、ActiveX控件的安装。要安装这类控件,需要先用regsvr32.exe注册,然后选择Component菜单中ImportActiveXControl项。在ImportActiveXControl打开的窗口中,只有已经注册的ActiveX控件才出现在列表中,选中一个然后按Install按钮就可以安装了。如果事先没有用regsvr32.exe注册也可以按ADD按钮找到OCX文件即时注册,注册后再进行安装。
几点说明:
1在拿到组件后先看是否有说明文件,一般来说在说明文件中有如何安装的指导,有些还会有组件的属性、事件、方法的使用说明,这些在使用时是非常重要的。
2在上面的组件(包)安装操作之前,最好将*.bpl拷贝到你的System目录中,将*.pas、*.dcu、*.dcr、*.dp?拷贝到Delphi的Lib目录中再进行。
3前面我们提到安装DCU组件时,选用的是已经存在的dclusr40.dpk,当然也可以选择安装到一个新的包中,如果选择新包,需要先取一个名字比如DEMO,事实上安装完毕后用户可以找到的是Demo.bpl,而找不到DEMO.DPK。假如你已经将一个组件安装到dclusr40.dpk中了,还想再安装一个组件,如果再安装到dclusr40.dpk中,安装后你得到提示,原来安装的那个组件已经被取消注册,你将无法使用了。这样不就成了只能安装一个组件了吗?除非你再安装到一个新的包中才可以两个组件同时使用。当然每安装一个组件生成一个新的BPL文件也未偿不可,但BPL文件就增加许多。能否在dclusr40.dpk中多安装几个组件呢?当然是可以的。方法如下:用File菜单下的OPEN打开dclusr40.dpk文件,单击ADD按钮,在打开的对话框中选择ADDUNIT页面,按Unitfilename后的“Browse”按钮打开组件单元文件,OK即可,用此种方法这样可添加多个组件的单元文件,添加完毕,按一下编译按钮,然后再按Install按钮即可,如果单元文件是编译好的(DCU)可以直接按安装按钮。
4组件的删除。光会安装可不行,还要会删除呀。很简单,在component菜单下,选择installpackages,在列表中找到安装所在的Bpl,按Remove按钮,ok!再把Bpl文件删掉就彻底了,如果不删除BPL文件,下次可以按安装BPL组件的方法再安装使用
我也是引用别人的看了学习的
delphi怎样连接ACCESS2007
先放个ADOConnection1然后双击它或修改ConnectionString属性
oledb提供商要选择microsftoffice12.0……(挺长省略)的,然后点下一步,在数据源处填入你的Access文件的路径及名字,测试一下就能连接成了
如果你Delphi的oledb没有提供商的microsftoffice12.0……说明你机器没有正常安装Access2007,你只好下个办法找个正常的安装版安装
记住Access2007及以后的版本都用microsftoffice12.0……这个驱动
delphi2007 怎么能动态的设置dll的输出路径
兄弟,delphi2007正版还是盗版?哪儿弄的?能否告知一下?
一、开使你的第一个DLL专案
1.File->Close all->File->New[DLL]
代码:
//自动产生Code如下
library Project2;
//这有段废话
uses
SysUtils,
Classes;
begin
end.
2.加个Func进来:
代码:
library Project2;
uses
SysUtils,
Classes;
Function MyMax( X, Y: integer): integer; stdcall;
begin
if X> Y then
Result:= X
else
Result:= Y;
end;
//切记:Library的名字大小写没关系,可是DLL-Func的大小写就有关系了。
//在 DLL-Func-Name写成MyMax与myMAX是不同的。如果写错了,立即
//的结果是你叫用到此DLL的AP根本开不起来。
//参数的大小写就没关系了。甚至不必同名。如原型中是(X,Y:integer)但引
//用时写成(A,B:integer),那是没关系的。
//切记:要再加个stdcall。书上讲,如果你是用Delphi写DLL,且希望不仅给
// Delphi-AP也希望BCB/VC-AP等使用的话,那你最好加个Stdcall;的指示
//参数型态:Delphi有很多种它自己的变量型态,这些当然不是DLL所喜欢的
//,Windows/DLL的母语应该是C。所以如果要传进传出DLL的参数,我们
//尽可能照规矩来用。这两者写起来,后者会麻烦不少。如果你对C不熟
//的话,那也没关系。我们以后再讲。
begin
end.
3.将这些可共享的Func送出DLL,让外界[就是你的Delphi-AP啦]使用:光如此,你的AP还不能用到这些,你还要加个Exports才行。
代码:
exports
MyMax;
begin
end.
4.好了,可以按 Ctrl-F9编译了。此时可不要按F9。DLL不是EXE┌不可单独执行的,如果你按F9,会有ErrorMsg的。这时如果DLL有Error,请修正之。再按Ctrl-F9。此时可能有Warning,不要紧,研究一下,看看就好。再按Ctrl-F9,此时就『Done, Compiled』。同目录就会有个*.dll。恭喜,大功告成了。
二、进行测试:开个新application:
1.加个TButton
代码:
ShowMessage( IntToStr(MyMax(30,50)));
2.告知Exe到那里抓个Func
代码:
//在Form,interface,var后加
Function MyMax( X, Y: integer): integer; stdcall; external'MyTestDLL.dll';
// MyTestDLL.dll为你前时写的DLL项目名字
// DLL名字大小写没关系。不过记得要加 extension的.DLL。在Win95或NT,
//是不必加 extension,但这两种OS,可能越来越少了吧。要加extension
可以了,简单吧。
上面的例子是不是很简单?熟悉Delphi的朋友可以看出以上代码和一般的Delphi程序的编写基本是相同的,只是在TestDll函数后多了一个stdcall参数并且用exports语句声明了TestDll函数。只要编译上面的代码,就可以玫揭桓雒狣elphi.dll的动态链接库。现在,让我们来看看有哪些需要注意的地方:
1.在DLL中编写的函数或过程都必须加上stdcall调用参数。在Delphi 1或Delphi 2环境下该调用参数是far。从Delphi 3以后将这个参数变为了stdcall,目的是为了使用标准的Win32参数传递技术来代替优化的register参数。忘记使用stdcall参数是常见的错误,这个错误不会影响DLL的编译和生成,但当调用这个DLL时会发生很严重的错误,导致操作系统的死锁。原因是register参数是Delphi的默认参数。
2.所写的函数和过程应该用exports语句声明为外部函数。
正如大家看到的,TestDll函数被声明为一个外部函数。这样做可以使该函数在外部就能看到,具体方法是单激鼠标右键用“快速查看(Quick View)”功能查看该DLL文件。(如果没有“快速查看”选项可以从Windows CD上安装。)TestDll函数会出现在Export Table栏中。另一个很充分的理由是,如果不这样声明,我们编写的函数将不能被调用,这是大家都不愿看到的。
3.当使用了长字符串类型的参数、变量时要引用ShareMem。
Delphi中的string类型很强大,我们知道普通的字符串长度最大为256个字符,但Delphi中string类型在默认情况下长度可以达到2G。(对,您没有看错,确实是两兆。)这时,如果您坚持要使用string类型的参数、变量甚至是记录信息时,就要引用ShareMem单元,而且必须是第一个引用的。既在uses语句后是第一个引用的单元。如下例:
uses
ShareMem,
SysUtils,
Classes;
还有一点,在您的工程文件(*.dpr)中而不是单元文件(*.pas)中也要做同样的工作,这一点Delphi自带的帮助文件没有说清楚,造成了很多误会。不这样做的话,您很有可能付出死机的代价。避免使用string类型的方法是将string类型的参数、变量等声明为Pchar或ShortString(如:s:string[10])类型。同样的问题会出现在当您使用了动态数组时,解决的方法同上所述。
在Delphi中静态调用DLL top
调用一个DLL比写一个DLL要容易一些。首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较。同样的,我们先举一个静态调用的例子。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
type
TForm1= class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
//本行以下代码为我们真正动手写的代码
function TestDll(i:integer):integer;stdcall;
external’Delphi.dll’;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=IntToStr(TestDll(1));
end;
end.
上面的例子中我们在窗体上放置了一个编辑框(Edit)和一个按钮(Button),并且书写了很少的代码来测试我们刚刚编写的Delphi.dll。大家可以看到我们唯一做的工作是将TestDll函数的说明部分放在了implementation中,并且用external语句指定了Delphi.dll的位置。(本例中调用程序和Delphi.dll在同一个目录中。)让人兴奋的是,我们自己编写的TestDll函数很快被Delphi认出来了。您可做这样一个实验:输入“TestDll(”,很快Delphi就会用fly-by提示条提示您应该输入的参数是什么,就像我们使用Delphi中定义的其他函数一样简单。注意事项有以下一些:
一、调用参数用stdcall
和前面提到的一样,当引用DLL中的函数和过程时也要使用stdcall参数,原因和前面提到的一样。
二、用external语句指定被调用的DLL文件的路径和名称
正如大家看到的,我们在external语句中指定了所要调用的DLL文件的名称。没有写路径是因为该DLL文件和调用它的主程序在同一目录下。如果该DLL文件在C:\,则我们可将上面的引用语句写为external’C:\Delphi.dll’。注意文件的后缀.dll必须写上。
三、不能从DLL中调用全局变量
如果我们在DLL中声明了某种全局变量,如:var s:byte。这样在DLL中s这个全局变量是可以正常使用的,但s不能被调用程序使用,既s不能作为全局变量传递给调用程序。不过在调用程序中声明的变量可以作为参数传递给DLL。
四、被调用的DLL必须存在
这一点很重要,使用静态调用方法时要求所调用的DLL文件以及要调用的函数或过程等等必须存在。如果不存在或指定的路径和文件名不正确的话,运行主程序时系统会提示“启动程序时出错”或“找不到*.dll文件”等运行错误。
在Delphi中动态调用DLL top
动态调用DLL相对复杂很多,但非常灵活。为了全面的说明该问题,这次我们举一个调用由C++编写的DLL的例子。首先在C++中编译下面的DLL源程序。
#include
extern”C” _declspec(dllexport)
int WINAPI TestC(int i)
{
return i;
}
编译后生成一个DLL文件,在这里我们称该文件为Cpp.dll,该DLL中只有一个返回整数类型的函数TestC。为了方便说明,我们仍然引用上面的调用程序,只是将原来的Button1Click过程中的语句用下面的代码替换掉了。
procedure TForm1.Button1Click(Sender: TObject);
type
TIntFunc=function(i:integer):integer;stdcall;//去掉dll中的函数名既可
var
Th:Thandle;
Tf:TIntFunc;
Tp:TFarProc;
begin
Th:=LoadLibrary(’Cpp.dll’);
if Th>0 then
try
Tp:=GetProcAddress(Th,PChar(’TestC’));
if Tp<>nil
then begin
Tf:=TIntFunc(Tp);
Edit1.Text:=IntToStr(Tf(1));
end
else
ShowMessage(’TestC函数没有找到’);
finally
FreeLibrary(Th);
end
else
ShowMessage(’Cpp.dll没有找到’);
end;
大家已经看到了,这种动态调用技术很复杂,但只要修改参数,如修改LoadLibrary(’Cpp.dll’)中的DLL名称为’Delphi.dll’就可动态更改所调用的DLL。
一、定义所要调用的函数或过程的类型
在上面的代码中我们定义了一个TIntFunc类型,这是对应我们将要调用的函数TestC的。在其他调用情况下也要做同样的定义工作。并且也要加上stdcall调用参数。
二、释放所调用的DLL
我们用LoadLibrary动态的调用了一个DLL,但要记住必须在使用完后手动地用FreeLibrary将该DLL释放掉,否则该DLL将一直占用内存直到您退出Windows或关机为止。
现在我们来评价一下两种调用DLL的方法的优缺点。静态方法实现简单,易于掌握并且一般来说稍微快一点,也更加安全可靠一些;但是静态方法不能灵活地在运行时装卸所需的DLL,而是在主程序开始运行时就装载指定的DLL直到程序结束时才释放该DLL,另外只有基于编译器和链接器的系统(如Delphi)才可以使用该方法。动态方法较好地解决了静态方法中存在的不足,可以方便地访问DLL中的函数和过程,甚至一些老版本DLL中新添加的函数或过程;但动态方法难以完全掌握,使用时因为不同的函数或过程要定义很多很复杂的类型和调用方法。对于初学者,笔者建议您使用静态方法,待熟练后再使用动态调用方法。
使用DLL的实用技巧 top
一、编写技巧
1、为了保证DLL的正确性,可先编写成普通的应用程序的一部分,调试无误后再从主程序中分离出来,编译成DLL。
2、为了保证DLL的通用性,应该在自己编写的DLL中杜绝出现可视化控件的名称,如:Edit1.Text中的Edit1名称;或者自定义非Windows定义的类型,如某种记录。
3、为便于调试,每个函数和过程应该尽可能短小精悍,并配合具体详细的注释。
4、应多利用try-finally来处理可能出现的错误和异常,注意这时要引用SysUtils单元。
5、尽可能少引用单元以减小DLL的大小,特别是不要引用可视化单元,如Dialogs单元。例如一般情况下,我们可以不引用Classes单元,这样可使编译后的DLL减小大约16Kb。
二、调用技巧
1、在用静态方法时,可以给被调用的函数或过程更名。在前面提到的C++编写的DLL例子中,如果去掉extern”C”语句,C++会编译出一些奇怪的函数名,原来的TestC函数会被命名为@TestC$s等等可笑的怪名字,这是由于C++采用了C++ name mangling技术。这个函数名在Delphi中是非法的,我们可以这样解决这个问题:
改写引用函数为
function TestC(i:integer):integer;stdcall;
external’Cpp.dll’;name’@TestC$s’;
其中name的作用就是重命名。
2、可把我们编写的DLL放到Windows目录下或者Windows\system目录下。这样做可以在external语句中或LoadLibrary语句中不写路径而只写DLL的名称。但这样做有些不妥,这两个目录下有大量重要的系统DLL,如果您编的DLL与它们重名的话其后果简直不堪设想,况且您的编程技术还不至于达到将自己编写的DLL放到系统目录中的地步吧!
三、调试技巧
1、我们知道DLL在编写时是不能运行和单步调试的。有一个办法可以,那就是在Run|parameters菜单中设置一个宿主程序。在Local页的Host Application栏中添上宿主程序的名字就可进行单步调试、断点观察和运行了。
2、添加DLL的版本信息。开场白中提到了版本信息对于DLL是很重要的,如果包含了版本信息,DLL的大小会增加2Kb。增加这么一点空间是值得的。很不幸我们如果直接使用Project|options菜单中Version选项是不行的,这一点Delphi的帮助文件中没有提到,经笔者研究发现,只要加一行代码就可以了。如下例:
我们在用Delphi编译完程序,准备发布产品时,总希望随产品发布个性信息以标示产品的来源
以及开发者等信息,就像windows的程序一样,使我们一看属性就知道他是微软的产品,这些在
Delphi中是如何实现的呢?下面我就来给大家演示和说明给exe,dll文件添加版本信息的方法。
VS_VERSION_INFO VERSIONINFO//版本信息结构
FILEVERSION 1,0,0,1//顾名思义文件版本,就是在属性页版本上面显示的|
PRODUCTVERSION 1,0,0,1//顾名思义产品版本|这里是主版本信息
FILEFLAGSMASK 0x3fL//这里设为0x3fL就好了|
#ifdef _DEBUG
FILEFLAGS 0x1L//VS_FF_DEBUG包括debug信息
#else
FILEFLAGS 0x0L//无
#endif
FILEOS 0x4L//对应于delphi中VOS__WINDOWS32,说明程序是win32程序
FILETYPE 0x2L//文件类型,$2是dll,$1是exe
FILESUBTYPE 0x0L//文件子类型,一般设为0即可
BEGIN
BLOCK StringFileInfo//这里设置文件其他的版本信息(详细信息)
BEGIN
BLOCK 080403A8//所用语言080403A8简体中文,040904b0英语(美国)
BEGIN
VALUE Comments, My Dll Application test//备注
VALUE CompanyName, JJony\0//公司名
VALUE FileDescription, xxx.dll\0//产品描述
VALUE FileVersion, 1. 0. 0. 1\0//文件版本
VALUE InternalName,//内部名称
VALUE LegalCopyright, Copyright(C) 2006.6\0//版权信息
VALUE OriginalFilename, xxx.dll\0//源文件名
VALUE ProductName, xxx.dll\0//产品名
VALUE ProductVersion, 1. 0. 0. 1\0//产品版本
END
END
BLOCK VarFileInfo
BEGIN
VALUE Translation, 0x804, 0x03A8//这里是关键哦,决定了是什么语言
END//0x0804, 0x03A8简体中文
END//0x0409, 0x04b0英语(美国)
一种更为简单的添加DLL的版本信息的方法是:
先将一个要引用dll文件的程序的版本信息添加全面,然后将该程序的Project1.res复制到要产生dll的文件目录下,并改名为aa.res,然后制做dll,将dll编辑器中"library Project1"改为"library aa",添加“”,编译,OK了。
3、为了避免与别的DLL重名,在给自己编写的DLL起名字的时候最好采用字符数字和下划线混合的方式。如:jl_try16.dll。
4、如果您原来在Delphi 1或Delphi 2中已经编译了某些DLL的话,您原来编译的DLL是16位的。只要将源代码在新的Delphi 3或Delphi 4环境下重新编译,就可以得到32位的DLL了。
[后记]:除了上面介绍的DLL最常用的使用方法外,DLL还可以用于做资源的载体。例如,在Windows中更改图标就是使用的DLL中的资源。另外,熟练掌握了DLL的设计技术,对使用更为高级的OLE、COM以及ActiveX编程都有很多益处
delphi2007怎么破解或注册
安装Delphi2007
删除专业版自带的delphi2007.slip文件(建议备份起来),不是就无法出现输入序列号的界面,运行setup.exe并用申请来的30天测试序列号安装。完装完成后需要用序列号、申请序列号时用的邮箱地址、密码激活(三样缺一不可),但这里可以不激活用D2007Tweaks跳过即可;如果激活了以后也可以用D2007Tweaks跳过30天限制(因为用的是30天限制序列号,所以装好后没有源码,下面提供专业版Source目录压缩包下载。)。
错误处理
1、安装时提示“Invalid Serial Number”
删除C:\Documents and Settings\All Users\Application Data\下的CodeGear目录(此处C为系统盘)!另外有人说不能安装在中文目录下。
2、完装后提示要协议
用D2007Tweaks跳过即可。
1、安装程序会将所有文件解压到下面目录中!
C:\Documents and Settings\XXXX\Local Settings\Application Data\{AB3EC276-D261-4943-A921-1CC1C6799AED}
好了,文章到此结束,希望可以帮助到大家。