StrLenについて

解決


Cyanojp  2025-10-01 00:42:10  No: 152172

はじめまして
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にいれてもダメなようです
これらはどのように解決していますでしょうか?
(記法がアレですみません)


Cyanojp  2025-10-01 01:09:27  No: 152173

いろいろやってみてますが
----------------------------
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
----------------------------
解決といっていいのかわかりません


Cyanojp  2025-10-01 02:36:56  No: 152174

いろいろやってみましたが、
どうやら、これまでの Char は Wide っぽい気がしました
もう少し調べてみます


Cyanojp  2025-10-01 09:13:52  No: 152175

大変失礼しました
自己解決しました

--------------------------------
var
  szVal : array[1..256] of Char;
  nLen : Integer;
begin
  nLen := StrLen(PWideChar(@szVal[1]));
--------------------------------
これでいけました
以前の「Char」は「WideChar」になったようです


HFUKUSHI  2025-10-01 10:27:52  No: 152176

解決されたようですが…
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


Cyanojp  2025-10-01 13:02:12  No: 152177

HFUKUSHI さま
ありがとうございます!
そうだったんですね
型が変わるというのはひどく迷惑な話ですね
嫌になります
うまくいかなくて7を使い続けていたのはこういうことだったんですけどね
十数年ごしにちゃんと向き合って解決しました


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

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







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