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

舊控件以D2009-Compile-StrMove發生E2250錯誤

缺席
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-07-06 13:09:04 IP:61.218.xxx.xxx 未訂閱
原來的Delphi版本都可正常使用,在Delphi2009編譯卻發生錯誤
E2250 There is no overloaded version of 'StrMove'

程式碼為
StrMove(Result.Sysex, Sysex^.lpData, Sysex^.dwBytesRecorded);
..
StrMove(MyMidiHdr.SysexPointer, TheSysex, msgLength);

我試過改以
StrMove(MyMidiHdr.SysexPointer, PWideChar(TheSysex), msgLength);
無論是PWideChar或是Pchar,雖可編譯,但程式均無法正常執行,會自動關閉程式。

如有想法,還請不吝賜教,謝謝!
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-07-08 13:49:35 IP:59.125.xxx.xxx 訂閱
Delphi 2009 的 PChar = PWideChar
所以你應該改成 PAnsiChar
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-07-08 14:40:45 IP:61.218.xxx.xxx 未訂閱

===================引 用 sryang 文 章===================
Delphi 2009 的 PChar = PWideChar
所以你應該改成PAnsiChar
====================================================

感謝回應,其實D2009之前,PChar和PAnsiChar是一樣的,但D2009以後,PChar就變成了PWideChar,
而Sysex^.lpData即為AnsiChar,所以D2009之前使用都沒有問題,
而StrMove所使用之參數是Char,所以才會改成Pchar(Sysex^.lpData),
這樣就可以進行編譯了,只不過執行時會出現Access violation at address...的錯誤!

相關問題已在網路上搜尋許久,都無法解決,再次感謝。

sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-07-08 14:53:59 IP:59.125.xxx.xxx 訂閱
Record 中原來是 Char 的,可能要修改為 AnsiChar,再用 PAnsiChar 轉型後傳入需要吃  PAnsiChar  的函數

最明顯的例子,你看看 D5 的 nb30.pas 跟 D2009 的 nb30.pas 就知道了
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-07-11 16:44:34 IP:61.218.xxx.xxx 未訂閱
雖然已經儘可能找出問題了,但結果還是令人失望!

strMove(MyMidiHdr.SysexPointer, TheSysex, msgLength);
編譯結果:
[DCC Error] MidiOut.pas(478): E2251 Ambiguous overloaded call to 'StrMove'
SysUtils.pas(7723): Related method: function StrMove(PAnsiChar; const PAnsiChar; Cardinal): PAnsiChar;
SysUtils.pas(7729): Related method: function StrMove(PWideChar; const PWideChar; Cardinal): PWideChar;
StrMove(Result.Sysex, Sysex^.lpData, Sysex^.dwBytesRecorded);
編譯結果:
[DCC Error] Midiin.pas(575): E2250 There is no overloaded version of 'StrMove' that can be called with these arguments

改成Pchar'或PWideChar或PAnsiChar,即使可以編譯也無法正常執行,會出現Access violation at address....

謝謝。
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-07-11 17:46:22 IP:124.8.xxx.xxx 訂閱
這一個控件組可能是無法支援 Unicode 的,所以你可能要將原來宣告為 Char 的,改成 AnsiChar
原來宣告為 PChar 的,改成 PAnsiChar
例如那個 MyMidiHdr
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2010-07-11 17:47:09, 註解 無‧
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-07-12 09:02:48 IP:61.218.xxx.xxx 未訂閱
感謝熱心回應!

strMove(MyMidiHdr.SysexPointer, TheSysex, msgLength);

MyMidiHdr.SysexPointer 和 TheSysex 都是Pointer,而非PAnsichar或PWideChar,該如何轉換?

再次感謝關注。
系統時間:2024-04-19 10:12:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!