荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Jason (日子很黑白), 信区: Program
标  题: [转载]李维--Windows 原生開發工具的瑰寶-Delphi 6
发信站: 荔园晨风BBS站 (Wed Jun 20 13:08:35 2001), 转信

缺图片,转自Programmer深度论坛:http://forum.vclxx.org/

Windows 原生開發工具的瑰寶 – Delphi 6


在睽違了將近2年之後,Borland 的年度巨獻 Delphi 6 終於將在世人的面前揭開
神秘的
面紗。Delphi 6不但對於Borland來說是一個重要的產品,事實上對於現在的視窗
平台
也是一個意義重大的產品。因為當 Microsoft 全力發展.NET 虛擬環境,而
Borland 本身
也往 Linux 平台上開發 RAD 工具 Kylix 的時候,由 Borland 視窗開發小組所研
發的原生
視窗開發工具正好填補了仍佔多數視窗程式師的需要。

由於資訊技術不斷的快速進步,許多視窗程式師也不斷的需要在應用系統中加入最

新的技術,或是使用這些新的技術開發下一代的應用系統。例如 XML/XSL 的盛行

讓程式師對於如何處理和發揮XML的技術有強烈的需求,例如 SOAP 的逐漸成為遠

和分散式計算的標準,因此程式師也需要使用 SOAP 來開發或是整合應用系統。更

說由 SOAP 和 WSDL/WSML,UDDI 等技術所衍生出的最新 Web 應用系統標準 Web

Service等。對於視窗平台上的程式師而言,即使是使用現在的開發工具,例如
Delphi
4/5 或 是 VB 等也仍然可以利用這些新的資訊技術開發應用程式,但是如此做不
但有一
定的難度,而且可能曠廢時日。

Delphi 6 剛好可以幫助企業和程式師解決這些資訊技術上的困擾,Delphi 6 不但
在傳統
的開發能力方面持續的進步,讓程式師能夠享有更具生產力的開發環境,對於最新

的資訊技術,例如 XML/XSL,SOAP,Web Service 等都有非常良好的支援,讓程式

能夠快速的使用這些新的技術。此外 Delphi 6 在核心執行時期函式館以及編譯器
方面
也有了幅度不小的改善,不但讓程式師可以開發功能更強的視窗應用程式,也可以

更平順的移植到 Linux 平台,再搭配跨兩平台的新視覺化元件 Framework CLX,
即使是
視窗的程式師也可以快速的開發 Linux 平台上的應用系統。

現在就讓我們趕快仔細的看看 Delphi 6 在各方面提供了什麼功能,到底值不值得
視窗
的程式師使用她來開發視窗的應用程式吧。
強化的Delphi整合發展環境

就如同以往Delphi的每一個新版本慣例一樣,Delphi 6也持續的改善整合發展環境

幫助程式師更有生產力。Delphi 6在整合發展環境中加入了數項致命的吸引力,讓

式師對這些新的功能愛不釋手。下面就簡單的介紹這些新的整合發展環境功能。
Code Complete

Code Complete的功能在Delphi 5就已經加入了,這項功能非常受到程式師的歡迎
,因
為Code Complete可以大幅的減少程式師需要鍵入的程式碼,並且減少打錯的機率

Delphi 6的Code Complete功能又持續的加碼改善,新的Code Complete視窗不但可
以由
程式師自行調整大小,以及以不同的顏色代表不同的物件,例如變數,方法和特性

等。


Delphi 6的Code Complete視窗加入了色彩分析,以及物件分門別類的能力


此外新的Code Complete視窗也會更聰明的過濾器物件能夠使用的PME,避免了以往

Delphi 5的Code Complete視窗無法顯示一些PME的困窘情形。最後如果程式師在新

Code Complete視窗中選擇了呼叫方法之後,Code Complete現在也會自動的在方法

稱之後自動加入();字元,把游標自動停在圓括弧之中,並且自動顯示這個方法需

的所有參數,的確比以前更聰明和方便了。
Object TreeView

另外一個新的功能就是Delphi 6的Object TreeView視窗,這個新的視窗可以除了
可以
顯示表單中所有的物件之外,也以階層的方式表達元件之間擁有者的關係。而當程

式師在Object TreeView視窗中點選了一個元件之後,這個元件也會立刻的出現在
物件
檢視器之中讓程式師可以改變這個物件的特性值和事件處理函式。

本來當我一開始使用Delphi 6時,總是喜歡把Object TreeView視窗關閉,總覺得
她佔
據了整合發展環境的空間,又沒有什麼作用。但是稍後才發現她的好處,特別是當

表單複雜,擁有大量的元件時,Object TreeView視窗可以讓你立刻的找到這個元
件,
並且知道和她相關的元件,非常的方便。這比以往我使用物件檢視器辛辛苦苦的搜

尋元件好多了。


此外Delphi 6的編輯器也強化了Class Complete的功能,讓程式師擁有更大的彈性
定義
類別程式碼。並且加入了Interface Complete的功能,讓程式師在撰寫介面程式碼
時也
能夠享有Code Complete的功能。
可客製化的View視窗

Delphi 6最強勁的整合發展環境功能應該要算是新的可客製化的View視窗了,在

Delphi 6中,編輯器不但可以讓程式師觀看和編輯Object Pascal的程式碼,如果
程式師
現在編輯的是Web應用程式,那麼也可以直接在編輯器中檢視HTML程式碼,稿本語

言程式碼,預覽Web應用程式執行的結果畫面,以及Web應用程式產生的真正HTML

程式碼。請仔細觀看本文第一個圖形的下方,熟悉Delphi的程式師應該會注意到編

器的下方多了數個頁次,例如HTML Result,Preview等,這些頁次就是可客製化的

View視窗。

除了剛才介紹的可客製化的View視窗之外,Delphi 6的編輯器也可以讓程式師直接

視XML和XSL的樹狀架構,更允許程式師自行開發客製化的View視窗整合到Delphi的

編輯器之中,可以說功能非常的強大,稍後在介紹Delphi 6的Web功能時,Delphi
的程
式師便可以知道她的威力。
新一代資料存取引擎-dbExpress

Borland為了讓視窗平台的Delphi以及Linux平台上的Kylix有著共通的資料存取引
擎,
因此決定開發新一代的資料存取引擎,那就是dbExpress。DbExpress是一組存取各

不同關連資料庫的原生驅動程式,以及以組統一的元件。由於原生驅動程式和元件

都是以跨平台的考量開發的,因此Delphi和Kylix都可以使用這組驅動程式和元件
。程
式師藉由統一的元件來存取不同的資料庫,以方便開發資料庫應用系統,下圖就是

Delphi 6的dbExpress元件組。


在4月的RUN!PC的Kylix介紹一文中我已經介紹過dbExpress,因此在本文只簡單的

紹dbExpress的功能。

基本上dbExpress是使用所謂的Firehose引擎來存取資料,並且把異動資料的工作
交給
MIDAS(MIDAS在Delphi 6中將改名為DataSnap)下圖便是DBExpress結合Firehose和

MIDAS的功能示意圖。



dbExpress的核心是數個簡潔的介面(Interface)組成的,這些介面定義了如何跟特
定的
資料庫廠商介面溝通的ISQLDriver,如何連結資料庫的ISQLConnection,如何對資

來源下達命令的ISQLCommand,如何控制Cursor的ISQLCursor,以及存取資料庫
MetaData的ISQLMetaData。這些介面定義的目標就是簡易,有效率,它們和Java的

JDBC有非常類似的觀念,但是Borland又提供了MIDAS來巧妙的結合這些介面,因此

提供了比JDBC高上數倍的生產力。

雖然dbExpress在Kylix中是1.0的版本,而在Delphi 6中則是1.x的版本,意謂
Borland

修正和改善了Kylix中的dbExpress。但是dbExpress的執行速度卻已經和開發多年

BDE/IDAPI有著幾乎一樣的表現,絲毫不遜色,甚至有許多項目還比BDE/IDAPI表現

得更好。例如下圖是dbExpress和BDE/IDAPI在連結InterBase的表現,從下面的資
料中
可以看出dbExpress還略勝一籌。
開啟資料庫
dbExpress
BDe
時間
1.467
1.831




此外我還寫了一些測試程式,讓dbExpress和BDE/IDAPI隨機產生資料,並且異動到

料庫之中。下面便是執行測試的結果,從這些數據中我們可以看出dbExpress和
BDE/IDAPI幾乎是不分上下的。
新增資料筆數
dbExpress
BDE
10
0.052
0.036
100
0.334
0.342
1000
3.186
3.421
2000
6.514
6.732
10000
37.992
36.109




不過dbExpress更吸引人的地方是如果程式師知道如何微調它的話,那麼它幾乎可

使用閃電般的速度處理資料。例如下面的資料便是經過我調整之後的dbExpress和

BDE/IDAPI比較處理資料的結果。從這些數據中我們可以看到調整之後的
dbExpress幾
乎以快3倍的速度在處理資料,把BDE/IDAPI遠遠的拋在後面。看到這樣的結果,真

不禁今人佩服Borland開發dbExpress的功力。
新增資料筆數
dbExpress
BDE
改良的dbExpress
10
0.052
0.036
0.047
100
0.334
0.342
0.206
1000
3.186
3.421
1.19
2000
6.514
6.732
2.686
10000
37.992
36.109
17.472




dbExpress除了在異動資料的速度方面超過BDE/IDAPI,在查詢資料方面也是大幅領

BDE/IDAPI。例如下表是分別使用dbExpress和BDE/查詢大量隨機資料的結果,
dbExpress在這一方面也以3倍的時間勝出BDE。從各種數據顯示,dbExpress在各種

理資料的工作方面幾乎都遙遙領先已經發展數年之久的BDE/IDAPI。

查詢大量資料
dbExpress
1.215
BDE
4.826
最佳化後的 BDE
3.171




除了dbExpress之外,Delphi 6仍然內附了最新的BDE/IDAPI,它包含了臭蟲修正以

新的DB2驅動程式。此外也仍然包含ADOExpress,ADOExpress除了修正了許多臭蟲

之外,也加入了一些新的功能,最重要的是ADOExpress終於改正了在開發
Master/Detail型態的應用程式會碰到的問題,這應該可以讓許多程式師感到滿意
,不
過Delphi 6的ADOExpress在Beta 4之中仍然是以MDAC 2.1版為基礎,並沒有昇級到

新的2.7版,不知道Borland是否會在最後階段完成昇級的工作。
更好的COM+支援功能

Delphi 6在支援COM/MTS/COM+物件方面又再次的進行了加強的工作,除了在Type

Library編輯器增加功能之外,對於實作COM物件方面也加入了最新支援Neutral執

緒模型的實作。例如下圖顯示了當我開發COM物件時,可以選擇各種執行緒模型型

態的COM物件。


Delphi 6允許程式師建立各種執行緒模型的COM物件,包括了最新的Neutral型態

的COM物件


此外當程式師需要實作特定的COM介面方法時,再也不需要像以往一樣辛苦的宣告

並且實作COM介面。Delphi 6的COM精靈可以讓程式師自由選擇要實作的COM介面,

然後幫助程式師自動產生所有的介面宣告程式碼。例如下圖是我要實作
IActiveMovie
介面時,可以啟動Delphi 6的COM精靈,從介面選擇精靈對話盒中選擇
IActiveMovie
介面,然後Delphi 6便會在編輯器中自動產生所有IActiveMovie介面的宣告程式碼
,使
用介面精靈的好處是程式師不但更方便,而且在宣告介面定義時也不會出錯。


type
  TIDelphi6 = class(TAutoObject, AccessObject)
  protected
    function Get__Name: WideString; safecall;
    function Get_Attributes: Integer; safecall;
    function Get_FullName: WideString; safecall;
    function Get_IsLoaded: WordBool; safecall;
    function Get_Name: WideString; safecall;
    function Get_Parent: IDispatch; safecall;
    function Get_Properties: AccessObjectProperties; safecall;
    function Get_Type_: Integer; safecall;
    { Protected declarations }
  end;


除了一般的COM物件之外,Delphi 6在支援MTS/COM+方面也以新的Transaction
Object
和Transactional Data Module來取代以前的MTS Object和MTS Data Module,讓程
式師

以更方便的開發Microsoft DNA架構的應用系統。

開發Internet/Intranet應用系統的WebSnap元件組

Delphi 6中最重要的新增功能之一應該就要算是能夠讓程式師開發
Internet/Intranet應用
系統的新架構和元件,這個新的功能稱為WebSnap。Delphi 6的WebSnap允許程式師

使用元件和視覺化的方式快速開發複雜的Internet/Intranet應用系統。WebSnap的
特點
是允許程式師直接在這些元件之中加入稿本語言的能力,並且能夠直接在Delphi的

合發展環境中撰寫稿本語言,預覽Web應用程式的輸出結果,以及Web應用程式產生

的HTML程式碼。
此外當程式師在開發Web應用程式時,經常需要使用許多的服務,例如處理圖形的

件,上傳檔案的服務,Session的服務,搜尋檔案的服務,登錄和登出的服務等,

WebSnap都已經製作成了元件可以讓程式師直接使用,程式師再也不需要花費時間

寫這些程式碼。下圖便是Delphi 6WebSnap的元件組。

此外Delphi 6提供了Web App Debugger公用程式,允許程式師開發和除錯Web應用

式,讓開發Web應用程式再也不是痛苦的流程。而WebSnap精靈更允許程式師建立不

同的Web應用程式,以及應用程式使用的快儲方式。例如下圖便是WebSnap精靈的畫

面,從這個畫面中可以看到Delphi 6能夠建立各種型態的Web應用程式。




在上圖中程式師建立Web應用程式時,也可以點選中間的Components…按鈕選擇
WebSnap精靈在自動建立Web應用程式時使用的WebSnap元件。例如下圖顯示了程式

師可以選擇使用的豐富的元件和服務。

由於WebSnap狀況結合稿本語言,因此程式師也可以指定WebSnap在自動產生稿本語

言時使用的稿本語言種類,以及產生的PageProducer的型態。例如下圖的畫面顯示

程式師可以選擇使用JScript或是VBScript,可見WebSnap的彈性十足。


最後Delphi 6更棒的一點是WebSnap可以結合前面介紹的客製化View,讓程式師直

在Delphi的整合發展環境中就可以預覽,開發和檢視Web應用程式的結果。例如下

是直接在Delphi的整合發展環境中使用稿本語言修改Web應用程式,而且稿本語言

具有和Object Pascal一樣以不同顏色顯示不同語言元素的效果。

至於下圖則是在Delphi的整合發展環境中直接檢視Web應用程式的預覽畫面,可以

程式師知道Web應用程式將來在瀏覽器中執行的結果。


總之,WebSnap讓Delphi 6在開發Internet/Intranet應用系統方面有長足的進步,
提供了
非常好的整好開發環境。在未來WebSnap也將移植到Linux平台上,讓Kylix的程式

也能夠使用相同的元件和技術開發Internet/Intranet應用程式。事實上程式師如
果能夠
結合WebSnap和Delphi的資料庫能力,以及COM+的功能,將能夠開發出威力十足的

Web應用系統。
MIDAS的進化版本-DataSnap

在Delphi 6中,MIDAS將改名為DataSnap。DataSnap不但強化了MIDAS原有的功能,

更加入了許多新的元件,讓程式師可以使用它開發出更為強勁的應用系統,此外

DataSnap也改善了MIDAS的執行效率,讓使用它的應用程式能夠執行得更快速。下

是Delphi 6中DataSnap的元件組,從圖中可以看到數個新的元件。




此外在許多細節方面DataSnap也提供了以前MIDAS沒有的功能,例如直接以XML的形

式呈現MIDAS的Data Packet,和更細階的控制等。對於使用MIDAS開發應用系統的

式師來說,新的DataSnap將會讓程式師更為滿意。
XML/XSL的支援

Delphi 6的另外一個重要的改良就是對於XML/XSL的支援了。除了增加許多新的VCL

元件讓程式師不必使用低階的COM介面或是複雜的API就可以輕易的處理XML/XSL文

件和資料之外,MIDAS的資料更可以直接輸出成XML,或是把XML的資料直接匯入
成MIDAS的Data Packet,Delphi的程式師再也不需要為複雜的XML程式設計傷腦筋

。下圖就是Delphi 6和XML有關的元件。從圖中我們可以看到Delphi 6以VCL元件封

了XML Document,讓程式師直接使用Object Pascal來處理XML封裝的資料,並且允

程式師選擇使用Microsoft的XML分析引擎,或是使用由IBM開發的XML分析引擎。

Delphi 6 中支援開發XML的元件組


除此之外,如果程式師需要處理大量以固定格式封裝的XML資料,那麼Delphi 6更

供了一個視覺化精靈,讓程式師先匯入此XML檔案。此精靈便會自動分析此XML文

件,然後自動產生以Object Pascal封裝的程式碼,讓程式師直接可以呼叫自動產
生的
程式碼中的方法來存取XML封裝的資料,不再需要使用XML Document元件來辛苦的

自己分析XML之中的資料,而且執行效率也比較好。

例如下面的圖形就是Delphi 6中XML Data Binding精靈的畫面。在這個精靈中我匯

了一個封裝股市資訊的XML檔案,那麼這個這個精靈便會自動產生如下的Object



在下面的程式碼中,我只需要存取TXMLStockType類別之中的功能,例如
Get_Price,
就可以輕易的取得XML文件之中股票的價格,不再需要使用XML Document元件來分

析,這樣是不是快多了,而且不容易出錯呢?在支援XML方面,Borland的確為程式

設想了許多的東西,也提昇了Delphi程式師許多的生產力,而XML Data Binding精

特別適合使用在程式師需要經常處理大量格式固定的XML文件。


  IXMLStockListType = interface;
  IXMLStockType = interface;

{ IXMLStockListType }

  IXMLStockListType = interface(IXMLNodeCollection)
    ['{F56A36C4-4014-11D5-8B76-E593B0087905}']
    { Property Accessors }
    function Get_Stock(Index: Integer): IXMLStockType;
    { Methods & Properties }
    function Add: IXMLStockType;
    function Insert(const Index: Integer): IXMLStockType;
    property Stock[Index: Integer]: IXMLStockType read Get_Stock;
default;
  end;

{ IXMLStockType }

  IXMLStockType = interface(IXMLNode)
    ['{F56A36C5-4014-11D5-8B76-E593B0087905}']
    { Property Accessors }
    function Get_Exchange: WideString;
    function Get_Name: WideString;
    function Get_Price: WideString;
    function Get_Symbol: WideString;
    function Get_Volume: WideString;
    procedure Set_Exchange(Value: WideString);
    procedure Set_Name(Value: WideString);
    procedure Set_Price(Value: WideString);
    procedure Set_Symbol(Value: WideString);
    procedure Set_Volume(Value: WideString);
    { Methods & Properties }
    property Exchange: WideString read Get_Exchange write Set_Exchange;

    property Name: WideString read Get_Name write Set_Name;
    property Price: WideString read Get_Price write Set_Price;
    property Symbol: WideString read Get_Symbol write Set_Symbol;
    property Volume: WideString read Get_Volume write Set_Volume;
  end;

{ Forward Decls }

  TXMLStockListType = class;
  TXMLStockType = class;

{ TXMLStockListType }

  TXMLStockListType = class(TXMLNodeCollection, IXMLStockListType)
  protected
    { IXMLStockListType }
    function Get_Stock(Index: Integer): IXMLStockType;
    function Add: IXMLStockType;
    function Insert(const Index: Integer): IXMLStockType;
  public
    procedure AfterConstruction; override;
  end;

{ TXMLStockType }

  TXMLStockType = class(TXMLNode, IXMLStockType)
  protected
    { IXMLStockType }
    function Get_Exchange: WideString;
    function Get_Name: WideString;
    function Get_Price: WideString;
    function Get_Symbol: WideString;
    function Get_Volume: WideString;
    procedure Set_Exchange(Value: WideString);
    procedure Set_Name(Value: WideString);
    procedure Set_Price(Value: WideString);
    procedure Set_Symbol(Value: WideString);
    procedure Set_Volume(Value: WideString);
  end;

開發Web Service的精靈和元件

Web Service也是現在最熱門的Web技術了,不管是IBM或是Microsoft都在發展
Web
Service的解決方案。Delphi 6在這方面也不落後,Delphi 6提供了SOAP和Web
Service
精靈,讓程式師能夠快速的開發SOAP應用系統,也可以匯入WSDL自動產生骨架程

式碼。由於SOAP是未來Web和分散式應用系統的主流技術,而Web Service更是未來

Web應用系統的主要軟體架構,因此對於程式師來說,掌握這些技術便成了非常重

的課題。

Delphi 6是Borland支援SOAP的第一個產品,由於SOAP是標準的協定,因此藉由
Delphi 6開發的SOAP應用系統可以和COM+,EJB或是Microsoft的.NET溝通,
Delphi

程式師現在就可以使用它開發未來的應用系統。下圖便是Delphi 6提供的SOAP精靈

在Delphi 6中也提供了6個VCL元件讓程式師開發SOAP和Web Service的應用系統。





由於SOAP是Delphi 6重要的功能,又是現在最流行的技術,因此希望在未來的
RUN!PC文章中能夠有機會詳細的為各位介紹如何使用Delphi 6的SOAP和Web
Service
技術開發應用系統 並且和其他的系統整合。
重新再造的執行時期函式館

對於Delphi 6和Kylix來說,Borland進行的隱形工程就是它們的執行時期函式館
(Run
Time Library-RTL)了。Delphi 6的RTL不但為了跨平台而重新的整理過,而且加入
了許
多新的RTL公用函式,以便讓程式師呼叫。這些新增的函式數目超過了數10個,例

,光是有關DateTime的函式就有數10個。此外Borland為了讓Delphi 6中的
Variant型

和函式也能夠使用在Linux平台,因此特別新增了Variants.PAS這個程式單元,讓
兩個
平台同時擁有Variant型態的變數和函式可以使用。

也許應該謝謝Kylix,在Delphi的執行時期函式館將近3個版本沒有什麼大幅改善的

形下,在Delphi 6中Borland終於再次的重整和改善了核心函式館,也許對於大部
份的
Delphi程式師來說可能沒有什麼感覺,但是經過改善的RTL不但功能更豐富,也避

了因為VCL和RTL持續增加功能而會大幅增加編譯出來的執行程式大小巨幅增加的可

能。
第14版的Object Pascal編譯器

Delphi 6的編譯器為了支援視窗和Linux平台以及為了支援SOAP和Interface RTTI
,因此
也進行了不小的改善。在Delphi 6中,以往以I Unknown為基礎介面的架構已經被
更改
為IInterface,所有其他的介面都可以從IInterface繼承下來。IInterface定義了
類似COM
中IUnknown介面所有的方法。Borland如此做是為了讓Window和Linux平台上的介面

機制都趨於一致。

此外Delphi 6也加入了一個新的介面IInvokable,任何從IInvokable介面繼承的介
面以
及實作的類別都具備遠端啟動的能力。這個功能對於Web和分散式應用系統有重要

影響。當然對於提昇Delphi成為分散式開發工具也有相當的效果,Borland在編譯
器方
面持續的進步是值得肯定的。

不過,很可惜的是Borland並沒有在Delphi 6的Object Pascal加入try…except…
finally

個被許多Delphi程式師要求加入的語言架構,雖然這個架構在目前也可以使用巢狀

try…try…except…end…finally來達成相同的效果,但是前者明顯的比較簡潔,

Microsoft的C#和VB.NET則吸收了Object Pascal的這個語言優點,再加入了try…
except
…finally架構。希望Borland能夠在未來的Delphi版本中也可以從善如流的加入。

產品總評

雖然前面的文章介紹了許多Delphi 6新增加的功能,但是仍然有許多的功能是本文

有介紹的,例如Delphi 6對於CORBA的支持和CLX等。下面的表格整理了Delphi 6中

重要的支援功能,並且附加了評語和得分以供讀者參考。




Delphi 6最主要的功能重點是在XML/XSL,Internet/Intranet以及SOAP和Web
Service

面的加強。又為了跨平台的目的,因此也在資料存取引擎,視覺化元件架構和執行

時期函式館方面進行了大幅度的改善。至於在BDE,ADO和COM+方面則只有小幅的

進步。
結論

當Microsoft不再推出 VB/VC 原生視窗開發工具,而Power Builder等其他視窗開
發工具
也逐漸被淘汰出視窗平台之際,Delphi 6可以說是唯一最新的原生視窗開發工具,

是最好的原生視窗開發工具。如果你仍然需要在視窗下開發應用系統,或是需要使

用/整合最新的資訊技術,那麼Delphi 6仍然是非常值得購買和昇級的開發工具。

不過希望在 Borland 全力發展Linux平台上的RAD工具時,不要忘記了視窗平台仍
然有
許多的程式師需要最好的視窗開發工具,Borland仍然需要投注相當的資源和人力

續發展未來版本的 Delphi。

--
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 203.93.19.1]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店