ばかげた質問で申し訳ありませんが、私は混乱しています。次の方法を検討してください (ノイズの多いコメントで申し訳ありません。これは開発中の実際のコードです)。
function HLanguages.GetISO639LangName(Index: Integer): string;
const
MaxIso639LangName = 9; { see msdn.microsoft.com/en-us/library/windows/desktop/dd373848 }
var
LCData: array[0..MaxIso639LangName-1] of Char;
Length: Integer;
begin
{ TODO : GetLocaleStr sucks, write proper implementation }
//Result := GetLocaleStr(LocaleID[Index], LOCALE_SISO639LANGNAME, '??');
Length := GetLocaleInfo(LocaleID[Index], LOCALE_SISO639LANGNAME, @LCData, System.Length(LCData));
Win32Check(Length <> 0);
SetString(Result, @LCData, Length); // "E2008 Incompatible types" here, but why?
end;
参照演算子を削除すると、暗黙のキャスト$X+
が助けになり、メソッドがコンパイルされます。コンパイラが参照演算子を使用してこのコードを拒否する理由は、私の理解を超えています。
これは Delphi XE2 であり、この動作は Delphi XE2 に固有のものである可能性があります。
そして、このエラーの範囲内で、同等のプロトタイプを組み込みのテスト ケース ダミーとして追加すると、HLanguages.GetISO639LangName
魔法のように消えます。
procedure SetString(var s: string; buffer: PChar; len: Integer);
begin
{ test case dummy }
end;