Delphi

本类阅读TOP10

·游戏外挂设计技术探讨①
·如何使用Delphi设计强大的服务器程序
·分布式网络考试系统原型分析及实现
·用DLL方式封装MDI子窗体。
·使用HOOK随心监视Windows
·Delphi 水晶报表打包解决
·url编码与解码工具附代码
·工人线程中关闭窗体的实现
·hdsi2.0 sql注入部分抓包分析语句
·Borland Delphi 2005 下载

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
翻譯Borland? Delphi? 2005使用 VCL for .NET移植到 .NET(1)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

Borland® Delphi® 2005 Migration to .NET using VCL for .NET
by Bob Swart, Bob Swart Training & Consultancy

摘要: 本教程示範了使用Delphi 2005 VCL (for .NET).Delphi Win32源碼, 單元(units)(數據庫)應用程序移植到Microsoft .NET Framework.

    • 入門
    • VCLVCL for .NET
    • 數據訪問
    • 總結

入門

在這個教程, 我們將使用Delphi 2005移植一個真正的Win32應用程序到Microsoft .NET Framework, 并使用Borland VCL(Visual Component Library)作為框架. 幾個現存的VCL for Win32應用程序Delphi 7的示例目錄中找到將用Delphi 2005 打開, 并且移植到.NET并轉為VCL for .NET.

These exercises will demonstrate several migration issues, small and more significant alike.

這個課程將演示几個移植例子,程序小但有代表性.

 

VCL 和 VCL for .NET
VCL已經可以在.NET Framework下使用, 這讓我們可以更容易的移植Win32 VCL 應用程序到.NET(同樣可能將VCL項目轉為WinForms)

 

Delphi 2005 BDS\3.0\Demos目錄中帶了很多應用程序範例, 同時包含了除了個別外—Delphi.Net Delphi Win32的子目錄. BDS\3.0\DelphiWin32\VCLWin32\目錄下包含了幾個Win32 VCL 例子, 其中一些已經移植到.NET, 可以在BDS\3.0\Delphi.NET\VCL目錄中找到.

 

其中一個還沒移植到.NET的範例Threads, 演示了在多線程中實現QuickSort, SelectionSort BubbleSort算法. Threads 項目是一個Win32 VCL 應用程序, 現在我們將要復印機它到.NET下并使用VCL for .NET

 

首先, 我們為重要的文件創建一個備份.

  • BDS\3.0\Demos\Delphi.NET\VCL下創建一個子目錄Threads,.項目移植後將成為另外一個Delphi for .NET VCL的範例.
  • 從目錄BDS\3.0\Demos\DelphiWin32\VCLWin32\Threads復製所有的文件到目錄BDS\3.0\Demos\Delphi.NET\VCL\Threads
  • 移除thrddemo.bdsproj這個文件, 因為這個文件存在意味著這是一個Delphi Win32項目(而實際我們是想移植到.NET)

現在我們已經準備好要在一個新的Threads項目上工作, 并將其移植到.NET

  • 運行Delphi 2005
  • 單擊歡迎頁上的 Open Project按鈕, 并且打開目錄BDS\3.0\Demos\Delphi.NET\VCL\Threads 下的thrddemo.dpr這個項目文件(我們剛從Win32 範例中復製過來的)

因為這個項目沒有存在bdsproj文件, Delphi 2005 IDE 會詢問你是要陞級到Win32還是.NET項目. 將會出現一個項目陞級對話框, 如下圖示

陞級thrddemo項目到.NET

  • 指定目標為Delphi for .NE, 并按OK按鈕

這樣, 將會生成一個thrddemo.bdsproj文件給我們, 裹面有相應的.NET personality標識,.現在我們保存項目, 新的相關屬性信息就會保存到文件thrddemo.bdsproj.

  • 執行菜單File ! Save All, 保存thrddemo項目, 包括新產生的文件thrddemo.bdsproj
  • Ctrl+F9 來開始編繹thrddemo 項目

你將會得到大概11條警告和5個氏誤信息, 如下面:

[Warning] thrddemo.dpr(8): W1005 Unit 'Borland.Vcl.Forms' is specific to a platform

[Warning] ThSort.pas(6): W1005 Unit 'Borland.Vcl.Windows' is specific to a platform

[Warning] ThSort.pas(6): W1005 Unit 'Borland.Vcl.Messages' is specific to a platform

[Warning] ThSort.pas(6): W1005 Unit 'Borland.Vcl.Graphics' is specific to a platform

[Warning] ThSort.pas(6): W1005 Unit 'Borland.Vcl.Controls' is specific to a platform

[Warning] ThSort.pas(6): W1005 Unit 'Borland.Vcl.Forms' is specific to a platform

[Warning] ThSort.pas(6): W1005 Unit 'Borland.Vcl.Dialogs' is specific to a platform

[Warning] ThSort.pas(7): W1005 Unit 'Borland.Vcl.ExtCtrls' is specific to a platform

[Warning] ThSort.pas(7): W1005 Unit 'Borland.Vcl.StdCtrls' is specific to a platform

[Warning] SortThds.pas(6): W1005 Unit 'Borland.Vcl.Graphics' is specific to a platform

[Warning] SortThds.pas(6): W1005 Unit 'Borland.Vcl.ExtCtrls' is specific to a platform

[Error] SortThds.pas(18): E2397 Unsafe pointer only allowed if compiling with {$UNSAFECODE ON}

[Error] SortThds.pas(57): E2003 Undeclared identifier: 'Point'

[Error] SortThds.pas(65): E2396 Unsafe code only allowed in unsafe procedure

[Error] SortThds.pas(107): E2396 Unsafe code only allowed in unsafe procedure

[Fatal Error] ThSort.pas(39): F2063 Could not compile used unit 'SortThds.pas'

 

我們現在可以忽略所有的警告信息, 等一會我們再回頭來處理. 首先, 我們先改正那些編繹錯誤

 

第一個錯誤是在SortThds.pas文件的第18, 提示是: t "unsafe pointer only allowed if compiling with {$UNSAFECODE ON}".(不安全的指針只有在使用{$UNSAFECODE ON}才能編繹).引起錯誤的代碼是在TSortThread類中聲明了指向FSortArray的類型PSortArray:

type

  PSortArray = ^TSortArray;

  TSortArray = array[0..MaxInt div SizeOf(Integer) - 1] of Integer;

 

  TSortThread = class(TThread)

  private

    FBox: TPaintBox;

    FSortArray: PSortArray;

 

PSortArray是指向TSortArray的指針, 而指針不是安全類型, 因此,會引發警告提示.後面還有一些其它不安全聲明的警告, 只要是使用了這個不安全的指針類型.

 

雖然最後的版本將不會使用到不安全的類型或代碼, 但首先, 將代碼標記為不安全的方式來解決編繹錯誤比較容易先使項目順利編繹, 然後再將不安全的部分用安全的代碼代替.

  • TSortThread類聲明之前增加{$UNSAFECODE ON}這個編繹指示, 這樣, 聲明指向FSortArray的類型就可以被通過
  • Shift+F2保存所有項目中的文件, 然後按Shift+F9來重新編繹項目.

忽略相關的警告信息, 還有4個錯誤剩下.

[Error] SortThds.pas(59): E2003 Undeclared identifier: 'Point'

[Error] SortThds.pas(67): E2396 Unsafe code only allowed in unsafe procedure

[Error] SortThds.pas(109): E2396 Unsafe code only allowed in unsafe procedure

[Fatal Error] ThSort.pas(39): F2063 Could not compile used unit 'SortThds.pas'

 

現在有一個聲明為Point未知類型變量.這行令人不快的代碼如下:

procedure PaintLine(Canvas: TCanvas; I, Len: Integer);

begin

  Canvas.PolyLine([Point(0, I * 2 + 1), Point(Len, I * 2 + 1)]);

end;

 

看上去它呼叫了(兩次)一個函數Point, 但不知為什麼, .NET的編繹器無法找到函數Point. 這是一個使用重構(Refactor)--- Find Unit functionality(查找單元函數)的好機會, 它會幫我們定位的缺少的單元(定義函數Point), 并且增加到單元的uses子句中.

  • 在代碼編輯器中, 將光標定位到源代碼的其中一個Point標識符中,然後按右鍵選擇菜單Refactor 下的子菜單Find Unit(另外一種選擇是在系統主菜單Refactor中選擇Find Unit選項)

這樣將會調用Find Unit對話框, 裹面包含查找到所有定義Point的標準單元. 許多單元被查找到, 包含Borland.Vcl.Types.Point, 一個看起來最適合這裹代碼的定義.

  • 選擇Borland.Vcl.Types.Point單元,然後選擇Interface或者Implementation來決定在SortThds.pas代碼中的那個uses子句中加入本單元的聲明
  • Refactoring - Find Unit
  • Shift+F2保存所有項目中的文件, 然後按Shift+F9重新編繹項目.
  •  
  • 現在還剩下3個錯誤. 就如平時一樣, 最後一個(嚴重的)錯誤是由前面兩個錯誤引起的. 所以, 實際上, 我們保有兩個錯誤要修改.
  • [Error] SortThds.pas(70): E2396 Unsafe code only allowed in unsafe procedure

    [Error] SortThds.pas(112): E2396 Unsafe code only allowed in unsafe procedure

    [Fatal Error] ThSort.pas(39): F2063 Could not compile used unit 'SortThds.pas'

     

    我們仍使用FSortArray的不安全指針, 這是提示兩個錯誤發生的原因. 第一個錯誤相關代碼行中Create構造器中, 在這裹,我取得參數SortArray的地址并且指配給一個不安全的FSortArray類指針. 這個代碼是不安全的, 并且是編繹不過的, 除非我們給Create構造器標識一個unsafe的關鍵字.

     

    • 增加unsafeCreate構造器的實現代碼中, 如下面:

    ·                constructor TSortThread.Create(Box: TPaintBox; var SortArray: array of Integer); unsafe;

    ·                begin

    ·                  FBox := Box;

    ·                  FSortArray := @SortArray;

    ·                  FSize := High(SortArray) - Low(SortArray) + 1;

    ·                  FreeOnTerminate := True;

    ·                  inherited Create(False);

    ·                end;

     

    • Shift+F2保存所有項目中的文件, 然後按Shift+F9重新編繹項目.

     

    現在, Create 構造器中的不安全代碼錯誤提示已經不再出現了,然而, 另外一個關于Create 構造器的錯誤信息出現了:

    [Error] SortThds.pas(72): E2305 'Self' might not have been initialized

    [Error] SortThds.pas(112): E2396 Unsafe code only allowed in unsafe procedure

    [Fatal Error] ThSort.pas(39): F2063 Could not compile used unit 'SortThds.pas'

     

    這個錯誤的實質是, 我們能夠在初始化一些特定的屬性後再呼叫inherited構造器. 然而, 除非你有很好的理由不這樣做, 建議的做法是在使用自定義的代碼前先呼叫inherited構造器. 這個錯誤當然非常容易修改.

     

    • 將呼叫inherited Create移到 Create構造器函數的第一行, 如下所示:

    ·                constructor TSortThread.Create(Box: TPaintBox; var SortArray: array of Integer); unsafe;

    ·                begin

    ·                  inherited Create(False);

    ·                  FBox := Box;

    ·    &n