String型で渡された変数がUnicodeStringなのかAnsiStringなのかを判定することは可能でしょうか。
GoogleのAIサービスBardでこんな回答が来ました
使えそうでしょうか?
var
StringType: TType;
begin
StringType := GetType(MyString);
if StringType = TType.AnsiString then
begin
// MyString is an AnsiString
end else if StringType = TType.UnicodeString then
begin
// MyString is a UnicodeString
end;
end;
型自動変換されるから無理じゃない?
Delphi 2009以降だとString型はUnicodeString型のエイリアスなので、質問は
| UnideString型で渡された変数がUnicodeStringなのかAnsiStringなのかを判定する
ということになってしまい、意味を成しませんよね?
たとえば
procedure Foo(const S: AnsiString); overload;
procedure Foo(const S: UnicodeString); overload;
とすると、
var
S1: AnsiString;
S2: UnicodeString;
begin
Foo(S1); // AnsiString版が呼ばれる
Foo(S2); // UnicodeString版が呼ばれる
とか、こういうことですか?もう少し具体的にやりたいこと、困った状況を説明してもらえると回答が付きやすいかと思います。
情報不足ですみませんでした。
Delphi6環境からDelphi10.3環境への載せ替え作業で
Length関数の戻り値がバイト数から桁数に変わることへの対応で
バイト数を戻す関数を作ってLength関数を置換しようとしているのですが
中にはLength(WideString(aaa))のように桁数を取得している箇所もあるため
バイト数を戻す関数内で引数がどちらか判定できればと考えております。
そのアプリの移行で文字コードをどうするのかの方針によって答えが変わってきます
1.引き続きAnsiStringを使いたい(制御系アプリのため)
2.Delphi10の形式に移行したい
1だと変数も命令も全部AnsiStringを使えば動きます
2だと公式に助言があります
https://www.embarcadero.com/images/jp/dm/technical-papers/delphi_unicode_wp_jp.pdf
> String型で渡された変数がUnicodeStringなのかAnsiStringなのかを判定することは可能でしょうか。
できません.
引数の変数に渡すということは,その型の変数に代入するのと同じです.
文字列に限らず,代入後の変数には,元の型の情報はありません.
Delphi 2009 以降の String ( UniCodeString) 型のハイト数を取得するには
例えば ByteLength 関数を使用できます.
function Length(Value: String): Integer; overload;
begin
RESULT := System.Length(Value) * 2;
end;
おすすめはしなけど
これ追加しておけばソース変えないで WideString も AnsiString と同じになる
皆様ご助言ありがとうございました。
ツイート | ![]() |