分享
 
 
 

翻譯Borland? Delphi? 2005使用 VCL for .NET移植到 .NET(3)

王朝delphi·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

沒有QuickReports

這個問題的原因是CustRpt.pas 單元引用的Quickrpt.dcuil單元無法找到: QuickReport for .NET沒有包含在Delphi 2005中, 推荐陞級這個功能的辦法是在這個範例中使用Rave報表來代替. 或者尋找QuickReports相應的.NET版本, 或者使用其它的報表框架來代替.

報表部分就留給有興趣的讀者再去進一步修改, 但在這裹, 我們還是要使項目能夠被編繹—就算沒有報表功能.

操作菜單Project | View Source來打開項目文件mastapp.dpr, 并且在uses子句中查找QuickReports單元(應該有几行會引用到TQuickRep類型), 將這些行註釋掉, 如下所示:

uses

Forms,

Main in 'MAIN.PAS' {MainForm},

Brparts in 'BRPARTS.PAS' {BrPartsForm},

QryCust in 'QryCust.pas' {QueryCustDlg},

Edparts in 'EDPARTS.PAS' {EdPartsForm},

BrCstOrd in 'BrCstOrd.pas' {BrCustOrdForm},

Edcust in 'EDCUST.PAS' {EdCustForm},

Edorders in 'EDORDERS.PAS' {EdOrderForm},

SrchDlg in 'SrchDlg.pas' {SearchDlg},

Splash in 'SPLASH.PAS' {SplashForm},

Pickdate in 'PICKDATE.PAS' {BrDateForm},

About in 'ABOUT.PAS' {AboutBox},

Pickrep in 'PICKREP.PAS' {PickRpt},

//CustRpt in 'CustRpt.pas' {CustomerByInvoiceReport: TQuickRep},

//OrderRpt in 'OrderRpt.pas' {OrdersByDateReport: TQuickRep},

//InvcRpt in 'InvcRpt.pas' {InvoiceByOrderNoReport: TQuickRep},

PickInvc in 'PickInvc.pas' {PickOrderNoDlg},

DataMod in 'DataMod.pas' {MastData: TDataModule};

一個快速將源代碼標記為註釋的方法是按Ctrl+/ 鍵. 這個快捷鍵的作用是將一行正常的代碼標記為註釋, 然後將光標移動到下一行. 用這個方法, 你能快速的將上面三行標記為註釋行.

*注意, 你也能同時選擇几行構成的一個代碼塊, 然後再按Ctrl+/ 來將整個區塊標記為註釋.

移到項目文件的代碼的最下面, 并定位到創建QuickReports窗體的那三個CreateForm聲明, 同時選擇這三行, 按Ctrl+/ 將它們標記為註釋行, 結果如下所示:

begin

Application.Initialize;

SplashForm := TSplashForm.Create(Application);

SplashForm.Show;

SplashForm.Update;

Application.Title := 'Marine Adventures Order Entry';

Application.HelpFile := 'MASTAPP.HLP';

Application.CreateForm(TMainForm, MainForm);

Application.CreateForm(TBrPartsForm, BrPartsForm);

Application.CreateForm(TQueryCustDlg, QueryCustDlg);

Application.CreateForm(TEdPartsForm, EdPartsForm);

Application.CreateForm(TBrCustOrdForm, BrCustOrdForm);

Application.CreateForm(TEdCustForm, EdCustForm);

Application.CreateForm(TEdOrderForm, EdOrderForm);

Application.CreateForm(TSearchDlg, SearchDlg);

Application.CreateForm(TBrDateForm, BrDateForm);

Application.CreateForm(TAboutBox, AboutBox);

Application.CreateForm(TPickRpt, PickRpt);

// Application.CreateForm(TCustomerByInvoiceReport, CustomerByInvoiceReport);

// Application.CreateForm(TOrdersByDateReport, OrdersByDateReport);

// Application.CreateForm(TInvoiceByOrderNoReport, InvoiceByOrderNoReport);

Application.CreateForm(TPickOrderNoDlg, PickOrderNoDlg);

Application.CreateForm(TMastData, MastData);

SplashForm.Hide;

SplashForm.Free;

Application.Run;

end.

這個做還沒完成工作, 因為在程序的其它地方還有使用到QuickReports. 我們需要將所有相關行找出來并將其註釋掉.

執行菜單Search | Find in Files, 查找CustRpt(在其它的几個單元的uses了句都會使用到, 必須將它們移除掉)

Delphi 2005 查找文件對話框

*注意, 我們能夠將查找文件的結果分組, 查找到的文件將會顯示在另外一個新的treeview中. 最後, 打開Main.pas單元.

打開文件Main.pas, 在implementation部分檢查uses子句, 這裹也包含了CustRpt單元.

*注意, 在錯誤即時窗口(Error Insight)會自動標示出這些有問題的單元, 就如OrderRpt 和 InvcRpt單元不可用一樣會標識出來(編繹器無法解釋相應的單元名字)

無法解釋unit名字—顯示其它無法編繹的代碼

使用Ctrl+/ 將引用到CustRpt, OrderRpt, 和InvcRpt單元的代碼註釋

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

下一個錯誤會出現在PrintCustomerReport方法中.

選擇PrintCustomerReport方法中的代碼, 并將其全部標記為注釋. 如下面所示(可以選擇多几行或少几行注釋, 沒有影響的)

procedure TMainForm.PrintCustomerReport(Preview: Boolean);

begin

with MastData.CustByLastInvQuery do

begin

Open;

// if Preview then

// CustomerByInvoiceReport.Preview

// else

// CustomerByInvoiceReport.Print;

Close;

end;

end;

下一個問題是發生在PrintOrderReport方法中, 同樣必須將其代碼註釋掉.

選擇PrintOrderReport方法裹面的代碼, 按Ctrl+/來將所有選擇的代碼標記為註釋, 如下:

註釋了的PrintOrderReport方法

現在還有留下一個地方: PrintInvoiceReport

選擇PrintInvoiceReport方法中的代碼, 將其標識為註釋, 如下所示(可以自由選擇多一行或少一行註釋)procedure TMainForm.PrintInvoiceReport(Preview: Boolean);

begin

if PickOrderNoDlg.ShowModal = mrOk then

// if Preview then

// InvoiceByOrderNoReport.Preview

// else

// InvoiceByOrderNoReport.Print;

end;

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

這次, 項目可以沒有問題通過編繹和鏈接了.

數據庫路徑

這裹還有一些地方需要注意. 如果你現在試運行下程序, 程序可能可以運行, 但也有可能你會得到一個無法定位數據庫所在的提示信息.

這個錯誤其實是程序本身的代碼造成的. 在數據模塊中, 有一個函數DataDirectory, 如下定義:

function TMastData.DataDirectory: string;

begin

{ Assume data is in ..\..\..\..\..\Common Files\Borland Shared\DATA\data relative to where we are }

Result := ExtractFilePath(ParamStr(0));

//Result := ExpandFileName(Result + '..\..\DATA\');

Result := ExpandFileName(Result + '..\..\..\..\..\Common Files\Borland Shared\DATA\');

end;

就如註釋中注明的, 它假定了數據所在路徑是在相對它自己所在路徑的..\..\..\..\..\Common Files\Borland Shared\DATA\data目錄下. 在原來的Demo目錄這個路徑可能是對的, 但在現在這個我們將要分發的程序中是不重要的.

實際上, 在我們開始移植這個項目時, 我們确認了在設計時數據控件能聯接到數據庫. 所以, Database.DatabaseName已經指到正确的位置上了.

DataDirectory只在一個地方用到: MastDataCreate方法. 我們必須撤消在這裹做的東西.

編繹datamod.pas單元, 并定位到MastDataCreate方法, 确認正确的給DataFile賦予Database.DatabaseName的值, 覆蓋點DataDirectory的值, 如下:

procedure TMastData.MastDataCreate(Sender: TObject);

var

DataFile: string;

begin

DataFile := DataDirectory + 'MASTSQL.GDB';

DataFile := Database.DatabaseName; // already working at design-time!

if not FileExists(DataFile) then

if MessageDlg('Could not locate MASTSQL.GDB. Would you like to locate the file?',

mtError, [mbYes, mbNo], 0) = mrYes then

if OpenDialog.Execute then

begin

if UpperCase(ExtractFileName(OpenDialog.FileName)) = 'MASTSQL.GDB' then

DataFile := OpenDialog.FileName

else

raise Exception.Create('Invalid File: ' + OpenDialog.FileName);

end

else

raise Exception.Create('Cannot locate Interbase data file: MASTSQL.GDB');

Database.DatabaseName := DataFile;

Database.Open;

Transaction.StartTransaction;

end;

*注意, 你也可以將呼叫DataDirectory方法的代碼移除掉, 但還是需要給賦個新值給DataFile.

按Shift+F2來保存項目中的所有文件

運行航海冒險活動定購登錄程序

按Shift+F9來重編繹重個項目.

項目仍舊可以通過編繹和運行, 航海冒險活動定購登錄程序運行時如下圖所示:

航海冒險活動定購登錄程序的主界面

點擊按鈕New Order來進入到訂購窗體Order Form:

訂購窗體(Order Form)

關閉訂購窗體(Order Form)并點擊按鈕

Browse來進入到顧客訂購窗體(Orders by Customer Form):

顧客訂購窗體(Orders by Customer Form)

關閉顧客訂購窗體(Orders by Customer Form), 點擊按鈕Parts來打開瀏覽部門窗體(

Browse Parts Form):

瀏覽部門窗體(

Browse Parts Form)

關閉瀏覽部門窗體(

Browse Parts Form), 并且, 如果你不是運行在陞級過的Delphi 2005, 點擊按鈕Reports來打開報表選擇窗體(Report Selection Form):

報表選擇窗體(Report Selection Form)

*注意, 三個報表都不可用—相關的按鈕并不能工作—因為我們將所有使用到QuickReports的代碼, 還有報表窗體都註釋掉了. 你可以自己增加報表部分.

總結

在這個教程, 我們演示了如何使用Delphi 2005將一個存在的Win32 VCL程序移植到.NET下的VCL for .NET. 我們開始先用了一個範例threading, 先將其陞級為不安全的.NET程序, 然後進一步將其轉化為100%安全的.NET本地程序. 接著, 我們使用了一個更復雜的, 并使用了數據庫的範例.

想要將Win32下的VCL程序移植到.NET下, 需要的工作遠遠不止只是重新編繹程序代碼那麼簡單. Delphi 2005 提供了很多移植到.NET的幫助, 可以保護我們已經在Win32應用程序開發上的投資.

(全文完)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有