To Paradise: Delphi 2005 的三個問題反映 |
|
darkside
一般會員 發表:15 回覆:42 積分:16 註冊:2002-03-11 發送簡訊給我 |
To Paradise & all Delphi fan: 小弟這兩天用 Delphi 2005 把以前開發的 Delphi 5 元件 package 升級
成 VCL.NET 的 assembly,升級中間當然有些 language 的小問題,這些
查 help 就能解決,但有三個問題我覺得應該提出來給 Borland 及其他
Delphi 同好知道: 第一:.dcpil 檔案
Delphi 2005 建立的 assembly 竟然必須要附帶 .dcpil 檔案,才能讓
其他 assembly 專案引用,可是 Delphi 8 建立的 asembly 不用耶。而且
以 .NET assembly 的規格來說,應該也是只需要 assembly 的 .DLL 檔
就夠了,何以 Delphi 2005 這麼特別?這會增加開發人員在部署上的麻煩。
只是猜想:是不是因為 D8 有 .NET 1.1 SP1 相容性的問題,使得 Borland
RD 決定用自己的 symbol file?
不管怎樣,還是希望解除這個限制。 第二:DesignIntf 和 DesignEditor 到哪裡去了?
元件開發者必定很熟這兩個檔案了,我在 Borland 附的 source 目錄底下
有找到這兩個檔案,可是 uses 這兩個單元會無法編譯通過,我該把哪個
assembly DLL 檔加入專案的 references 清單?
我試過手動加入 Borland.Studio.Vcl.Design.dll,並沒有用,編譯錯誤: [Fatal Error] MyVclReg.pas(23): F1026 File not found: 'DesignIntf.dcuil' 我該如何解決這個問題? 第三:bug
當我升級完一個視覺化元件的 package 時,寫了個 VCL.NET form 程式來
測試,發現元件會丟出錯誤訊息: "並未將物件參考設定為物件的執行個體" 英文訊息我查過了,是:
System.NullReferenceException: Object reference not set to an instance of an object. 這個錯誤應該跟 null pointer exception 的意思一樣,可是我反覆的追蹤
之後,發現問題竟然出在這裡: procedure WMKillFocus(var Msg: TMessage); message WM_KILLFOCUS; 上面的宣告必須改成: procedure WMKillFocus(var Msg: TWMKillFocus); message WM_KILLFOCUS; 這樣就行了。有點詭異,不是嗎?我有好幾視覺化元件都會這樣,一一修改後
就不會出現前面的錯誤訊息了,因此我想應該是 VCL.NET 的 bug。
這個問題應該很容易 reproduce。 發表人 - darkside 於 2004/12/05 12:03:42
|
darkside
一般會員 發表:15 回覆:42 積分:16 註冊:2002-03-11 發送簡訊給我 |
引言: 第二:DesignIntf 和 DesignEditor 到哪裡去了?這個問題在 Borland newsgroup 有為仁兄給我提示之後,已經解決了。 專案的 Requires 清單必須加入 Borland.Studio.Vcl.Design.dll, 然後在 MyReg.pas 中的 uses 子句: uses Borland.Vcl.Design.DesignIntf, Borland.Vcl.Design.DesignEditors; 不能直接寫 DesignIntf,之前一直沒想到要寫全名。 供大家參考。 |
Gordon Li
一般會員 發表:1 回覆:25 積分:20 註冊:2004-11-15 發送簡訊給我 |
>第一:.dcpil 檔案
Delphi 2005 建立的 assembly 竟然必須要附帶 .dcpil 檔案,才能讓
其他 assembly 專案引用,可是 Delphi 8 建立的 asembly 不用耶。而且
以 .NET assembly 的規格來說,應該也是只需要 assembly 的 .DLL 檔
就夠了,何以 Delphi 2005 這麼特別?這會增加開發人員在部署上的麻煩。
只是猜想:是不是因為 D8 有 .NET 1.1 SP1 相容性的問題,使得 Borland
RD 決定用自己的 symbol file?
不管怎樣,還是希望解除這個限制。 No, 沒有這個問題, 我用Delphi 2005建立一個Assembly, 只需要.dll就可以讓VS.NET 2003的C# Project和Delphi 2005的Delphi.NETProject使用,完全沒問題. 下面是簡易的step: 1. 在Delphi 2005中建立一個Delphi.NET Package Project.
2. 建立一個class file :
unit uTestClass; interface type
TClass1 = class
private
{ Private Declarations }
public
constructor Create;
function GetVersion : String;
end; implementation constructor TClass1.Create;
begin
inherited Create;
// TODO: Add any constructor code here
end; function TClass1.GetVersion: String;
begin
Result := Environment.Version.ToString;
end; end. 3. compile這個Package成為一個Assembly. 4.在VS.NET或是Delphi 2005中建立一個WinForms Project,
5.在reference中加入Step 3的Assembly.
6. 在WinForms表單中import Class File的namespace, 例如我的例子是 : using uTestClass;
uses uTestClass; 7. 撰寫下面的程式碼
private void button1_Click(object sender, System.EventArgs e)
{
TClass1 aClass; aClass = new TClass1();
this.textBox1.Text = aClass.GetVersion();
} procedure TWinForm4.Button1_Click(sender: System.Object; e: System.EventArgs);
var
aClass : TClass1;
begin
aClass := TClass1.Create;
Self.TextBox1.Text := aClass.GetVersion;
end; 8. 為了確認不需要dcpil檔, 在執行前delete dcpil檔
9. C#/Delphi.NET WinForms程式正確執行
10. Game Over.
|
darkside
一般會員 發表:15 回覆:42 積分:16 註冊:2002-03-11 發送簡訊給我 |
引言: >第一:.dcpil 檔案 No, 沒有這個問題, 我用Delphi 2005建立一個Assembly, 只需要.dll就可以讓VS.NET 2003的C# Project和Delphi 2005的Delphi.NETProject使用,完全沒問題. 下面是簡易的step:Dear Lee sir: Are you sure? 您確定您的 .dcpil 檔案沒有在 search path 裡面? 或者是您寫的測試範例太單純,以致於不會產生這個問題? 因為我再試了一次,還是一樣,如果沒有 .dcpil 檔,其他 D2005 專案 就無法編譯,因為找不到組件的 .dcpil 檔。 Borland 論壇也有人發現這個問題, TeamB 成員也 confirm 過了,這 確實是 D2005 的問題。參考: http://groups.google.com.tw/groups?hl=zh-TW&lr=&threadm=41dc4364%40newsgroups.borland.com&rnum=3&prev=/groups%3Fq%3Dassembly%2Bdcuil%26hl%3Dzh-TW%26lr%3D%26group%3Dborland.public.delphi.language.delphi.dotnet%26scoring%3Dd 剪貼 TeamB 成員的回答: ----------------------- > Can anybody explain why do I need to specify path to the .dcuil > files when I try to link .NET assembly that was created in Delphi > 2005 into Delphi 2005 project? The Delphi language includes certain constructs that are not part of the FCL. As a result, Delphi does not support round-tripping of Delphi-generated assemblies - if you want to use Delphi assemblies, you either need the .dc?il files or the source code. -- Yorai Aminov (TeamB) (TeamB cannot answer questions received via email.) Shorter Path - http://www.shorterpath.com Yorai's Page - http://www.yoraispage.com ------------------------------------------------- Delphi is a superset of the CLI, and the extra information must be stored somewhere. That is why Delphi requires .dcpil files, to get at the extra information required to use Delphi-specific types, which simply can't be used like that in other languages. Rudy Velthuis [TeamB] http://rvelthuis.bei.t-online.de 發表人 - darkside 於 2005/03/20 10:01:50 |
allan1314
一般會員 發表:3 回覆:3 積分:1 註冊:2004-10-06 發送簡訊給我 |
|
boblin
一般會員 發表:0 回覆:7 積分:1 註冊:2004-07-01 發送簡訊給我 |
我本打算也???一下第一???,不?在?其?,我??另一?我不解的??:
我的VCL.NET Package中有4?Controls, 如果我把它?到VCL.NET 的 Control Panel 中,可以看到全部4?Controls, 但是如果加到WinForm 的 Control Panel中,?只能?到其中的三?,企?加到VS.NET中也一?只能?到三?。不能?到的??是派生自TLabel,而能?到的其中一?是派生自TComponent,照理?TLabel也是?自TComponent,?理由?看不?的!
?其中又有什么?妙呢?
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |