全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2969
推到 Plurk!
推到 Facebook!

有關於D5升級到XD的錯誤訊息

答題得分者是:mephise
superdeer
一般會員


發表:3
回覆:8
積分:2
註冊:2010-10-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-01-08 12:18:30 IP:60.249.xxx.xxx 訂閱
原程式在D5環境下是沒有問題的,但想移植到XE上,編譯上出現了以下問題:
1. [DCC Error] : Incompatible tpyes : ' PAnsiChar ' and ' PWideChar '
2. Undeclared identifier : ' Printer '
3. Incompatible types: 'AnsiChar' and 'Char'

目前尋找到的解決1和3的辦法 :
是 AnsiChar及Char轉換問題==>改AnsiChar

但是這邊不清楚如何修改?

那第2個問題 : 不清楚是不是需要安裝元件,如果排除元件問題的話?是否還有其他原因導致?

問題有點多且複雜,請各位大大提點!! 謝謝~~
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-01-08 22:46:20 IP:118.169.xxx.xxx 未訂閱
第2個問題與你發的前一帖不是同一種問題?
xe 目前我還沒用過, 如果xe不提供, 試著在Delphi5系統中搜尋printers.pas 或printers.dcu 加入到 xe 中 再uses看看
編輯記錄
P.D. 重新編輯於 2011-01-09 10:09:03, 註解 無‧
mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-01-09 20:35:23 IP:59.115.xxx.xxx 訂閱
1,3 是同一種問題
對 Delphi 而言, 在以前 Char, String, PChar 都標示單位元組,
也就是現在的 AnsiChar, AnsiString, PAnsiChar

到了 XE 以後, 因為 Unicode 變成新的標準, 所以
Char = WideChar
String = UnicodeString
PChar = PWideChar 所以當你 migrate 你的程式時, 型態必須修改 (很辛苦, 我知道, 但全世界的程式設計師都有這個問題)

第二個問題, 版主已經說的很清楚啦
有兩種可能,
1. 有個變數叫 Printer, 但是沒宣告. 這比較不可能, 因為 Printer 本身就是保留字
2. 使用 Printers.Printer 這個函數 (請查XE的Hehp), 這個函數要 Use Printers 這個 Unit, 但是您沒有 use

希望能對您有幫助 ^^


------
Mephise Chen
前興德工程師
superdeer
一般會員


發表:3
回覆:8
積分:2
註冊:2010-10-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-01-10 08:26:28 IP:60.249.xxx.xxx 訂閱
前一帖在XE的uses掛入VARIANTS,vartostr錯誤訊息就消失了,可是我用同樣方法掛入PRINTERS就不能用了,我也覺得這兩個問題應該是同一種,謝謝P.D.大大的意見  我再去試試。
===================引 用 P.D. 文 章===================
第2個問題與你發的前一帖不是同一種問題?
xe 目前我還沒用過, 如果xe不提供, 試著在Delphi5系統中搜尋printers.pas 或printers.dcu 這個加入到 xe 中 再uses看看
superdeer
一般會員


發表:3
回覆:8
積分:2
註冊:2010-10-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-01-10 09:21:27 IP:60.249.xxx.xxx 訂閱
XE的線上help上面有說printer :Description

Returns a global instance of TPrinter to manage interaction with the printer.
Printer creates an instance of a global TPrinter object the first time it is called. Use the Printer function to print using the TPrinter object.
Printer is declared in the Printers unit. To use the Printer function and the TPrinter object, add Printers to the uses clause of your unit (Delphi) or include Printers.hpp in the source file (C ).
作法 : 1.在uses上加入PRINTERS --> 失敗
2.在XE的source找出Printers.pas加入我的project --> 失敗
1和2一樣,PRINTER都是identifier

Help這樣寫起來,printer應該是XE的保留字吧....而且xe原本的source有printers.pas @@? 小弟是delphi的新手,目前只想到這兩種方法試....還是我的方法有誤!!
===================引 用 mephise 文 章===================
1,3 是同一種問題
對 Delphi 而言, 在以前 Char, String, PChar 都標示單位元組,
也就是現在的 AnsiChar, AnsiString, PAnsiChar

到了 XE 以後, 因為 Unicode 變成新的標準, 所以
Char = WideChar
String = UnicodeString
PChar = PWideChar 所以當你 migrate 你的程式時, 型態必須修改 (很辛苦, 我知道, 但全世界的程式設計師都有這個問題)

第二個問題, 版主已經說的很清楚啦
有兩種可能,
1. 有個變數叫 Printer, 但是沒宣告. 這比較不可能, 因為 Printer 本身就是保留字
2. 使用 Printers.Printer 這個函數 (請查XE的Hehp), 這個函數要 Use Printers 這個 Unit, 但是您沒有 use

希望能對您有幫助 ^^


編輯記錄
superdeer 重新編輯於 2011-01-09 18:24:17, 註解 無‧
superdeer 重新編輯於 2011-01-09 18:25:36, 註解 無‧
mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-01-10 10:12:20 IP:60.250.xxx.xxx 訂閱
Printers 這個 Unit 一定是有的, 不然無法印表
位置就在 \Program Files\Embarcadero\RAD Studio\8.0\lib\Printers.dcu
如同以前所說的, 這是一個 Delphi Compile Unit

我稍為寫了一個小小的測試程式, 他會把 "This is a test" 印到預設印表機, 經過測試無誤

[code delphi]
請在此區域輸入程式碼
uses Printers;

procedure TForm1.Button1Click(Sender: TObject);
var
prn: TextFile;
begin
AssignPrn(prn); // 這行一定要 use Printers
Rewrite(prn); // Open printer
Writeln(prn,'This is a test');
CloseFile(prn);
[/code]

仔細想了一下, 這玩意可能根本走錯方向了
這年頭印表都靠 QuickReport, Rave Report, FastReport 之類的玩意兒, 很少有人直接使用 Printers
所以還是建議您看看原程式到底是要幹嘛? 真的是要印表嗎?
反正, 根據錯誤訊息, Delphi 不知道啥是 Printer, 這點是肯定的! 請往這方面 debug ^^
------
Mephise Chen
前興德工程師
superdeer
一般會員


發表:3
回覆:8
積分:2
註冊:2010-10-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-01-10 11:05:21 IP:60.249.xxx.xxx 訂閱
procedure SelectPrinter(psQR: TQuickRep; psName: string);
var i: Smallint;
begin
for i := 1 to psQR.Printers.Printer.printers[i - 1])) > 0 then
psQR.PrinterSettings.PrinterIndex := i - 1;
end;

程式應該是選擇印表機,在D5下是可以跑的,不過在XE就有問題,原程式不是我寫的,功能應該是這樣@@"
結果會是FAST REPORT的問題嗎? 燈燈!!
===================引 用 mephise 文 章===================
Printers 這個 Unit 一定是有的, 不然無法印表
位置就在 \Program Files\Embarcadero\RAD Studio\8.0\lib\Printers.dcu
如同以前所說的, 這是一個 Delphi Compile Unit

我稍為寫了一個小小的測試程式, 他會把 "This is a test" 印到預設印表機, 經過測試無誤

[code delphi]
請在此區域輸入程式碼
uses Printers;

procedure TForm1.Button1Click(Sender: TObject);
var
prn: TextFile;
begin
AssignPrn(prn); // 這行一定要 use Printers
Rewrite(prn); // Open printer
Writeln(prn,'This is a test');
CloseFile(prn);
[/code]

仔細想了一下, 這玩意可能根本走錯方向了
這年頭印表都靠 QuickReport, Rave Report, FastReport 之類的玩意兒, 很少有人直接使用 Printers
所以還是建議您看看原程式到底是要幹嘛? 真的是要印表嗎?
反正, 根據錯誤訊息, Delphi 不知道啥是 Printer, 這點是肯定的! 請往這方面 debug ^^
編輯記錄
superdeer 重新編輯於 2011-01-09 20:05:57, 註解 無‧
superdeer 重新編輯於 2011-01-09 20:07:22, 註解 無‧
superdeer 重新編輯於 2011-01-09 20:09:38, 註解 無‧
superdeer 重新編輯於 2011-01-09 20:13:50, 註解 無‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-01-10 11:20:53 IP:59.120.xxx.xxx 未訂閱
你的程式碼是在使用Quick Report
然後卻在問是不是FAST REPORT的問題???
請先搞清楚是在用什麼報表...


===================引 用 superdeer 文 章===================
procedure SelectPrinter(psQR: TQuickRep; psName: string);
var i: Smallint;
begin
for i := 1 to psQR.Printers.Printer.printers[i - 1])) > 0 then
psQR.PrinterSettings.PrinterIndex := i - 1;
end;

程式應該是選擇印表機,在D5下是可以跑的,不過在XE就有問題,原程式不是我寫的,功能應該是這樣@@"
結果會是FAST REPORT的問題嗎? 燈燈!!
===================引 用 mephise 文 章===================
Printers 這個 Unit 一定是有的, 不然無法印表
位置就在 \Program Files\Embarcadero\RAD Studio\8.0\lib\Printers.dcu
如同以前所說的, 這是一個 Delphi Compile Unit

我稍為寫了一個小小的測試程式, 他會把 "This is a test" 印到預設印表機, 經過測試無誤

[code delphi]
請在此區域輸入程式碼
uses Printers;

procedure TForm1.Button1Click(Sender: TObject);
var
prn: TextFile;
begin
AssignPrn(prn); // 這行一定要 use Printers
Rewrite(prn); // Open printer
Writeln(prn,'This is a test');
CloseFile(prn);
[/code]

仔細想了一下, 這玩意可能根本走錯方向了
這年頭印表都靠 QuickReport, Rave Report, FastReport 之類的玩意兒, 很少有人直接使用 Printers
所以還是建議您看看原程式到底是要幹嘛? 真的是要印表嗎?
反正, 根據錯誤訊息, Delphi 不知道啥是 Printer, 這點是肯定的! 請往這方面 debug ^^
superdeer
一般會員


發表:3
回覆:8
積分:2
註冊:2010-10-22

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-01-10 11:22:24 IP:60.249.xxx.xxx 訂閱
是..QUICK REPORT (....誤)
===================引 用 老大仔 文 章===================
你的程式碼是在使用Quick Report
然後卻在問是不是FAST REPORT的問題???
請先搞清楚是在用什麼報表...


===================引 用 superdeer 文 章===================
procedure SelectPrinter(psQR: TQuickRep; psName: string);
var i: Smallint;
begin
for i := 1 to psQR.Printers.Printer.printers[i - 1])) > 0 then
psQR.PrinterSettings.PrinterIndex := i - 1;
end;

程式應該是選擇印表機,在D5下是可以跑的,不過在XE就有問題,原程式不是我寫的,功能應該是這樣@@"
結果會是FAST REPORT的問題嗎? 燈燈!!
===================引 用 mephise 文 章===================
Printers 這個 Unit 一定是有的, 不然無法印表
位置就在 \Program Files\Embarcadero\RAD Studio\8.0\lib\Printers.dcu
如同以前所說的, 這是一個 Delphi Compile Unit

我稍為寫了一個小小的測試程式, 他會把 "This is a test" 印到預設印表機, 經過測試無誤

[code delphi]
請在此區域輸入程式碼
uses Printers;

procedure TForm1.Button1Click(Sender: TObject);
var
prn: TextFile;
begin
AssignPrn(prn); // 這行一定要 use Printers
Rewrite(prn); // Open printer
Writeln(prn,'This is a test');
CloseFile(prn);
[/code]

仔細想了一下, 這玩意可能根本走錯方向了
這年頭印表都靠 QuickReport, Rave Report, FastReport 之類的玩意兒, 很少有人直接使用 Printers
所以還是建議您看看原程式到底是要幹嘛? 真的是要印表嗎?
反正, 根據錯誤訊息, Delphi 不知道啥是 Printer, 這點是肯定的! 請往這方面 debug ^^
mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-01-10 12:05:55 IP:60.250.xxx.xxx 訂閱
哈哈! 我知道了!

在 D5 的時代, Delphi 會包裝 QuickReport 來幫助製作報表
但是到了 D7 以後, 改成使用 Rave Report 了, 所以現在沒有 QRReport 這個類別, 當然其下的類別一起死光光

解決方式
1. 買一套 Quick Report 然後裝起來
2. 程式重寫, 改成使用 Rave Report

報告完畢 ^^
------
Mephise Chen
前興德工程師
superdeer
一般會員


發表:3
回覆:8
積分:2
註冊:2010-10-22

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-01-10 12:33:34 IP:60.249.xxx.xxx 訂閱
感謝 mephise 大大的回覆, 不過QR我有抓 for XE的版本,安裝上去也沒有問題,QR在版本升級的時候,相對的一些寫法也會改變嗎?
本來以為會是XE問題,不過現在應該是QR升級後某些語法改變了是嗎?
===================引 用 mephise 文 章===================
哈哈! 我知道了!

在 D5 的時代, Delphi 會包裝 QuickReport 來幫助製作報表
但是到了 D7 以後, 改成使用 Rave Report 了, 所以現在沒有 QRReport 這個類別, 當然其下的類別一起死光光

解決方式
1. 買一套 Quick Report 然後裝起來
2. 程式重寫, 改成使用 Rave Report

報告完畢 ^^
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2011-01-10 16:23:42 IP:118.160.xxx.xxx 未訂閱
如果可以改程式的話, 不要使用QR的PRINTER, 直接引用PRINTERS 的PRINTER 一樣做的到
ComboBox1.Items:= Printer.Printers;
這就可以取得印表機設定中的所有印表機種了, 再來做底下的判斷就好了
FOR I:= 0 TO COMBOBOX1.ITEMS.COUNT-1 DO
IF POS(PSNAME, UPPERCASE(COMBOBOX1.ITEMS.STRINGS[I])>0 THEN ....

但你會面臨一個UNICODE的問題, 就是使用POS 與 ANSIPOS的不同, 還有 UPPERCASE轉換在UNICODE 中文上的問題,
因為印表機的名稱很有可能有 中文 設定的東東
===================引 用 superdeer 文 章===================
procedure SelectPrinter(psQR: TQuickRep; psName: string);
var i: Smallint;
begin
? for i := 1 to psQR.Printers.Printer.printers[i - 1])) > 0 then
? psQR.PrinterSettings.PrinterIndex := i - 1;
end;

程式應該是選擇印表機,在D5下是可以跑的,不過在XE就有問題,原程式不是我寫的,功能應該是這樣@@"
結果會是FAST REPORT的問題嗎? 燈燈!!
===================引 用 mephise 文 章===================
Printers 這個 Unit 一定是有的, 不然無法印表
位置就在 \Program Files\Embarcadero\RAD Studio\8.0\lib\Printers.dcu
如同以前所說的, 這是一個 Delphi Compile Unit

我稍為寫了一個小小的測試程式, 他會把 "This is a test" 印到預設印表機, 經過測試無誤

[code delphi]
請在此區域輸入程式碼
uses Printers;

procedure TForm1.Button1Click(Sender: TObject);
var
prn: TextFile;
begin
AssignPrn(prn); // 這行一定要 use Printers
Rewrite(prn); // Open printer
Writeln(prn,'This is a test');
CloseFile(prn);
[/code]

仔細想了一下, 這玩意可能根本走錯方向了
這年頭印表都靠 QuickReport, Rave Report, FastReport 之類的玩意兒, 很少有人直接使用 Printers
所以還是建議您看看原程式到底是要幹嘛? 真的是要印表嗎?
反正, 根據錯誤訊息, Delphi 不知道啥是 Printer, 這點是肯定的! 請往這方面 debug ^^
mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#13 引用回覆 回覆 發表時間:2011-01-11 13:43:02 IP:60.250.xxx.xxx 訂閱
早上去下載了 Quick Report 5.05 的試用版裝上去了
在 Quick Report 的 Help 中有 Printer 這個屬性, 但是一使用就會有 Undeclared Identifer 這個錯誤
如果改用 TQuickRep.QRPrinter.Printer 那就不會有錯誤訊息, 但是執行會有 "Access Violation at address xxxxxx" 這個錯誤訊息
回去仔細看了一下 Quick Report 的 Help, 結果是完全沒說明

我覺得是 Quick Report 本身的錯誤, 看來改寫程式, 使用原生 VCL 的 TPrinter 類別是無法避免的
此外, 直接 TQuickRep.Preview 裡面就會顯示印表機設定的 Speed Button, 要不要考慮改變一下界面呢 ^^

------
Mephise Chen
前興德工程師
superdeer
一般會員


發表:3
回覆:8
積分:2
註冊:2010-10-22

發送簡訊給我
#14 引用回覆 回覆 發表時間:2011-01-12 13:41:19 IP:60.249.xxx.xxx 訂閱
試了psQR.qrPrinter.Printers.Count 程式就可以跑了,我的xe執行並沒有出現"Access Violation at address xxxxxx" 這個錯誤訊息
QR的help是寫The current printer. Properties and methods may be safely accessed.
令人匪夷所思!! 謝謝 mephise 和 P.D. 大大的建議。
針對第1和3的問題,能請mephise大大提供XE較完整的型態轉換資訊嗎?
應該不只這三種型態是嗎?
Char = WideChar
String = UnicodeString
PChar = PWideChar
小弟在此先謝謝大大們!!
===================引 用 mephise 文 章===================
早上去下載了 Quick Report 5.05 的試用版裝上去了
在 Quick Report 的 Help 中有 Printer 這個屬性, 但是一使用就會有 Undeclared Identifer 這個錯誤
如果改用 TQuickRep.QRPrinter.Printer 那就不會有錯誤訊息, 但是執行會有 "Access Violation at address xxxxxx" 這個錯誤訊息
回去仔細看了一下 Quick Report 的 Help, 結果是完全沒說明

我覺得是 Quick Report 本身的錯誤, 看來改寫程式, 使用原生 VCL 的 TPrinter 類別是無法避免的
此外, 直接 TQuickRep.Preview 裡面就會顯示印表機設定的 Speed Button, 要不要考慮改變一下界面呢 ^^


mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#15 引用回覆 回覆 發表時間:2011-01-12 16:08:40 IP:60.250.xxx.xxx 訂閱
這些形態的轉換, 主要是因為 Unicode 的使用來的,
既然是 Unicode, 內容當然也繞著 字元, 字串, 字元指標來打轉啦,
如果想要再深入了解, 其實答案就在您眼前
打開 Delphi 的 Help, 然後 Search "String Type", 裡面就有很豐富的說明囉
此外我也推薦維基百科裡面, 關於 Unicode 的說明
我就是這樣長大的啦 ^^

===================引 用 superdeer 文 章===================針對第1和3的問題,能請mephise大大提供XE較完整的型態轉換資訊嗎?
應該不只這三種型態是嗎?
Char = WideChar
String = UnicodeString
PChar = PWideChar
小弟在此先謝謝大大們!!
------
Mephise Chen
前興德工程師
spig
一般會員


發表:0
回覆:7
積分:6
註冊:2004-11-03

發送簡訊給我
#16 引用回覆 回覆 發表時間:2011-01-12 19:54:16 IP:114.40.xxx.xxx 未訂閱
這是選擇印表機的程式,列印QR報表時使用是預設的印表機,在此可指定要使用那台印表機,是用pos做名稱搜尋,建議要問問題先搞懂你的問題,自己也先研究,不要把全部的問題丟出來等待別人解決,這樣永遠都不會進步,遇到問題只會想要問.....
mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#17 引用回覆 回覆 發表時間:2011-01-15 08:00:46 IP:59.115.xxx.xxx 訂閱
發問者是新手, 有去看Help查問題, 也有去下載 QuickReport 來試裝了, 我覺得誠意很夠了
看不出有哪裡有 "把全部的問題丟出來等待別人解決" 的意思

Delphi 使用者已經夠少了, 用好點的口氣, 多點鼓勵不是很好嗎? 願與大家共勉之


===================引 用 spig 文 章===================
這是選擇印表機的程式,列印QR報表時使用是預設的印表機,在此可指定要使用那台印表機,是用pos做名稱搜尋,建議要問問題先搞懂你的問題,自己也先研究,不要把全部的問題丟出來等待別人解決,這樣永遠都不會進步,遇到問題只會想要問.....
------
Mephise Chen
前興德工程師
系統時間:2024-05-02 10:22:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!