yTakeです。
DELPHI7のプロジェクトをXEへ移行しました。
すると、構文チェックで、
”E2251 'StrPas'へのオーバーロード呼び出しはあいまいです”
と言うエラーが出ます。
7の時は通過していたのですが、XEではだめの様です。
取得文字列から、CR+LFを取り除き代わりにNULLを置く為に使っているつもりです。
StrPasを使わない方が良いという事でしょうか?
ご教授下さい。
自己レスです
少し説明に誤りがあります。
"StrPas"はChar配列を文字列に変換する為に用いています。
後々の処理を文字列操作で楽にする為です。
Char配列のまま、操作するのが一般的なのでしょうか?
問題を再現できる最小限のコードを晒して頂けると、
レスが付きやすいと思います。
幾つもの ANSI アプリケーションを Unicode アプリケーションへマイグレーションしましたが、
私は StrPas() で件のエラーを出した記憶はないですね...。
DEKOさん、ありがとうございます
コード掲載にあたり、よく見直したら肝心のStrPasで文字列変換された文字列を使用していませんでした。つまり、StrPasは削除しても差し支えのない様なプログラムにしていました。
取り敢えず、コメントアウトすることでエラーはなくなりました。お騒がせしました。
ただ、後学の為、StrPasの正しい使い方はご教授願いたいと思い、敢えてコメントアウトしたソースを転記しています。
================
if i_CRLF > 0 then
begin
while rev_buf.pre <> rev_buf.post do
begin
buf[ n ] := rev_buf.buf[ rev_buf.post ]; // bufferが空じゃない間文字を取り出す
inc( n );
inc( rev_buf.post );
if rev_buf.post > BUF_SIZE then rev_buf.post := 1; // リングバファ
end;
buf[ n - 2 ] := Char(0); // CRLF を除きヌルターミネート
// str := StrPas( @buf[1] ); // コピー
if rtn <> 0 then
begin
for m := 1 to l do
begin
if (( ptr + m - 1 )^ <> buf[ m ] ) then // コマンドの応答が同じか、比較する
begin
ret := -1; // 違えば −1
break;
end;
end;
end;
dec( i_CRLF );
ret := 0;
break;
end;
================
上のソースでは、Char配列のまま1文字ずつ比較しています。
ここを文字列変換すれば、StrComp等が使えそうと思いました。
よろしくお願いします。
オーバーロードされた 2 つの StrPas() があるので、
buf[ n - 2 ] := WideChar(0); // CRLF を除きヌルターミネート
str := StrPas( PWideChar(@buf[1]) );
または、単純に
str := buf;
でいいのではないでしょうか?
[SysUtils.StrPas より抜粋]
この関数は,下位互換性を保つだけの目的で用意されています。
ヌルで終わる文字列を AnsiString または Delphi のネイティブ言語に変換するには,
型キャストまたは単に代入してください。
DEKOさん
ありがとうございました。
単純に、
str := buf;
で、うまく行きました。
DELPHI7の時は変数の型が違うとエラーが出た気がしました。
ツイート | ![]() |