終於由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中也能正常調用。