终于由Delphi2005试用了,前两天体验了一下IDE的一些新功能,还算不错,就是速度稍微有一点慢,关键是我的实验室的机器也不好,只有256M,宿舍的要好一些512M,用起来就流畅多了,不过启动速度还是不如VS2005快。说到稳定性,比D8强多了,但是还是听到有人说bug比较多,用到现在我还没有发现什么严重的bug,也许用得还不够深入吧,不过稳定性来说,还是可以让人接受了,虽然没有D7那样好的稳定性,但是我想至少达到D7稳定性的90%左右了。毕竟对Borland来说全部使用.net来开发编译器的时间也不长。
Delphi2005的新特性就不提了,网上到处都是,这些新特性比如:重构还是蛮不错的。
但是:真是不明白,Together是borland自己的东西,却非要不支持Delphi,即使支持还是整合到delphi2005里面,还去掉了很多功能。第二点就是网上说什么UML图可以直接生成代码,我倒是使用了从代码直接生成图,但是怎么都没搞出来从图到代码,不过我没有使用ECO,不知道是不是这个原因,但是Delphi2005不是说不用ECO也可以得么,真是不明白怎么回事。最后一点就是也许Borland编译器水平比较高,但是代码编辑器做得和Vs2005相比是有比较大的距离,在VS2005里面,我只要打一个字母就会自动显示出全部符合的代码提示,包括关键字都可以,并且速度极快,瞬间就出来,在d2005里面非要我再按个ctrl+空格,才会出来,而且第一次使用代码提示的话,出来之前还要等硬盘狂转一会。不过公平的讲,vs使用的提示是根据代码直接出来,d的还经过了以语法分析,我怀疑里面说不定还要预先编译一下前面的,这样更加精确,但是机器不好就实在叫人受不了,而且如果前面代码有错误,往往不能提示。说到代码的自动缩进,这点borland真是比不了,VS可以自动缩进2个空格或其他的格式也会自动判断,但是Delphi2005就还是不行,真是没办法。最后一点不满意就是在VS里面直接打3个\\\会自动生成注释模板,但是Delphi就没提供相应的功能,这样注释起来真是不容易啊。 言归正传,Delphi for .net为了适应.net的一些要求,做了一些语法调整,但是相关的书籍却很少,帮助也写得不行,像这样下去即使编译器获得成功,但是没人知道怎么写.net的delph程序,也是白搭,真不知道delphi.net的好书什么时候才能出来。现在既然有了delphi2005,已经等不及了,只要自己不断摸索了。
今天自己先看看帮助,学习一下namespace
namespace
声明名称空间
在delphi的工程文件中,隐含声明了一个namespace,被称作工程默认名称空间。假设工程文件头定义如下:
Program MyCompany.Programs.MyProgram;(library package等关键字的头一样)
则工程的默认名称空间是MyCompany.Programs
如果一个Unit的头定义成Unit ****;则相当于写成Unit MyCompany.Programs.****
如果一个Unit的头定义成Unit ***.****.***;则相当于声明了一个名称空间***.****
按第一种方式声明的Unit被称作generic unit,它总是工程默认名称空间的子空间
名称空间命名不区分大小写。也就是说,用.分割的几段单词中,最后一部分是不算作名称是不编译进assembly中的,比如Unit AAA.BB.Unit3这种写法,仅仅声明了一个名称空间AAA.BB,Unit3可以看作是不同的文件名称的区分,对外界来说是看不到的,当然在Delphi内,还是对他们区分成两个不同的部分。利用这个特性,如果一个大的Namespace需要分成几个文件来编写,则可以让这些Unit的全面部分全部一样,仅在最后一个.的这一节不同,就行了。
名称空间的引用
使用Uses语句。假设有如下语句:
uses aaa.bbb.unit1,unit2;
对于aaa.bbb.unit1已经明确指明,对于Unit2编译器会按照下面三个顺序来搜所名称空间Unit2
1 The current unit namespace (if any)
2 The project default namespace (if any)
3 Namespaces specified by compiler options
虽然对于外部编译器来讲,Unit名称的最后一节是看不到的也是不可区分的,但是在Delphi中,最后一节仍然是不可少的,所以uses语句中,需要包含最后一节,比如在Unit1 AAA.BB.Unit1中定义了Class1,在Unit AAA.BB.Unit2中要使用Class1就必须需在uses中引用全名uses AAA.BB.Unit1或者如果工程的默认名称空间是AAA.BB,也可以直接uses Unit1,不管怎么样,uses中Unit1是必不可少的。
在Delphi的帮助中这样写道:
Multiple units can be grouped together into one namespace using an extension of the in clause in the project source file. The file name string can list multiple unit source files in a semicolon-delimited list. uses
MyProgram.MyNamespace in 'filepath/unit1.pas;otherpath/unit2.pas';
In this example, the namespace MyProgram.MyNamespace logically contains all the interface symbols from unit1 and unit2. Symbol names in a namespace must be unique, across all units in the namespace. In the example above, if unit1 and unit2 both define a global interface symbol named mySymbol, the compiler will report an error in the uses clause.
但是不管我怎样试验,重视编译错误,无法实现。
到目前为止,我还没有找到如何引用delphi生成的dll的方法。因为我一在delphi新的工程中添加一个(用Add reference菜单)delphi for .net编译的dll,然后编译,就会说致命错误,不能导入什么什么东西,请使用包,之类的。但是在VS.net中添加着dll却没有任何问题,程序也能正常运行。
到目前为止只找到一个暂时的解决方案,就是不生成library,用package代替,这样最终目标文件也是dll,而且我在VS中也能正常调用。