DELPHI7からXEで”'StrPas'へのオーバー、、、”

解決


yTake  2011-10-19 19:36:03  No: 41045

yTakeです。

DELPHI7のプロジェクトをXEへ移行しました。

すると、構文チェックで、
”E2251 'StrPas'へのオーバーロード呼び出しはあいまいです”
と言うエラーが出ます。

7の時は通過していたのですが、XEではだめの様です。

取得文字列から、CR+LFを取り除き代わりにNULLを置く為に使っているつもりです。

StrPasを使わない方が良いという事でしょうか?

ご教授下さい。


yTake  2011-10-19 19:49:55  No: 41046

自己レスです

少し説明に誤りがあります。

"StrPas"はChar配列を文字列に変換する為に用いています。
後々の処理を文字列操作で楽にする為です。

Char配列のまま、操作するのが一般的なのでしょうか?


DEKO  2011-10-19 20:27:42  No: 41047

問題を再現できる最小限のコードを晒して頂けると、
レスが付きやすいと思います。

幾つもの ANSI アプリケーションを Unicode アプリケーションへマイグレーションしましたが、
私は StrPas() で件のエラーを出した記憶はないですね...。


yTake  2011-10-19 23:44:44  No: 41048

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等が使えそうと思いました。

よろしくお願いします。


DEKO  2011-10-20 01:54:57  No: 41049

オーバーロードされた 2 つの StrPas() があるので、

  buf[ n - 2 ] := WideChar(0); //  CRLF を除きヌルターミネート
  str := StrPas( PWideChar(@buf[1]) );

または、単純に

  str := buf;

でいいのではないでしょうか? 

[SysUtils.StrPas より抜粋]
この関数は,下位互換性を保つだけの目的で用意されています。
ヌルで終わる文字列を AnsiString または Delphi のネイティブ言語に変換するには,
型キャストまたは単に代入してください。


yTake  2011-10-20 23:12:38  No: 41050

DEKOさん

ありがとうございました。

単純に、
str := buf;
で、うまく行きました。

DELPHI7の時は変数の型が違うとエラーが出た気がしました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加