はじめまして
Delphi7で製作したものをDelphi 12でリビルドしようとしています
このとき、StrLenのなどの文字配列処理に差異があってうまくいきません
nil終端文字配列の長さを求めようとしています
Delphi 7 では正しく動作していましたが
RADになってからは警告がでます
例)------------------------------
var
szVal : array[1..256] of Char;
nLen : Integer;
begin
nLen := StrLen(@szVal[1]);
------------------------------
szVal = '1’+'8'+'0'+'0'+$0 だった場合でも4にはならない
stringにいれてもダメなようです
これらはどのように解決していますでしょうか?
(記法がアレですみません)
いろいろやってみてますが
----------------------------
var
szVal : array[1..256] of Char;
pVal : PAnsiChar;
nLen : Integer;
begin
nLen := StrLen(PAnsiChar(@szVal[1]));
これはダメ
pVal := PAnsiChar(@szVal[1]);
nLen := StrLen(pVal);
これもダメ
----------------------------
var
szVal : array[1..256] of AnsiChar;
pVal : PAnsiChar;
nLen : Integer;
begin
nLen := StrLen(@szVal[1]);
これはダメ
nLen := StrLen(PAnsiChar(@szVal[1]));
これはOK
pVal := @szVal[1];
nLen := StrLen(pVal);
これはOK
----------------------------
解決といっていいのかわかりません
いろいろやってみましたが、
どうやら、これまでの Char は Wide っぽい気がしました
もう少し調べてみます
大変失礼しました
自己解決しました
--------------------------------
var
szVal : array[1..256] of Char;
nLen : Integer;
begin
nLen := StrLen(PWideChar(@szVal[1]));
--------------------------------
これでいけました
以前の「Char」は「WideChar」になったようです
解決されたようですが…
Delphiは2009以降で文字、文字列がUTF-16LEベースに変更されています(従来はANSI/Shift_JIS)。
文字型はChar、AnsiChar、WideCharがあり、CharはWideCharの別名に、文字列型はString、AnsiString、WideString、UnicodeStringがあり、StringはUnicodeStringの別名になっています。
(Delphi 7以前からあるWideStringはUnicodeStringと異なり、参照カウントがありません)
またWin32APIなどの定義でA版とW版があるものも、W版がデフォルトになっています(例えばTextOutは従来はTextOutAだったものがTextOutWに)。
このあたりも見ておくとよいと思います。
Delphi 2009とUnicode:Part I - Support
https://docwiki.embarcadero.com/Support/ja/Delphi_2009%E3%81%A8Unicode:Part_I
Delphi 2009とUnicode:Part II - Support
https://docwiki.embarcadero.com/Support/ja/Delphi_2009%E3%81%A8Unicode:Part_II
Delphi 2009とUnicode:Part III - Support
https://docwiki.embarcadero.com/Support/ja/Delphi_2009%E3%81%A8Unicode:Part_III
HFUKUSHI さま
ありがとうございます!
そうだったんですね
型が変わるというのはひどく迷惑な話ですね
嫌になります
うまくいかなくて7を使い続けていたのはこういうことだったんですけどね
十数年ごしにちゃんと向き合って解決しました
| ツイート |
|