すみません、宜しくお願いいたします。
delphi2005で使用してたソースなのですが、delphixe5ではコンパイルエラーになります。何がいけないのでしょう?
os、windows7 64bit
以下ソース
概要はUDLファイルからDBのパスを取得のようですが、
私、理解できてないです。
function M_GetDBPathFromUDL(const strUDL : string): String;
var
strTarget : string;
wstrSet : WideString;
f : TFileStream;
intStart : Integer;
intEnd : Integer;
begin
Result := '';
if not FileExists(strUDL) then exit;
f := TFileStream.Create(strUDL, fmOpenRead);
try
SetLength(wstrSet, f.Size);
f.Read(wstrSet[1], f.Size);
finally
f.Free;
end;
intStart := Pos('Source=', wstrSet) + 7; ←エラー箇所
intEnd := Pos(';Persist', wstrSet); ←エラー箇所
strTarget := Copy(wstrSet, intStart, intEnd - intStart);
Result := strTarget;
end;
以下エラーメッセージ
[dcc32 エラー] aaFunc.pas(748): E2251 'Pos' へのオーバーロード呼び出しはあいまいです
System.pas(29784): 関連メソッド: function Pos(const string; const string; Integer): Integer;
System.pas(29944): 関連メソッド: function Pos(const WideString; const WideString; Integer): Integer;
宜しくお願いいたします。
XE5では(2009以降では)WideStringは単なるString=UnicodeStringに置き換えてOKですというか
置き換えてください。
あー、よく見たらコンパイルエラーは出ていなくても、ファイルの読み込みがうまくないですね。
function M_GetDBPathFromUDL(const strUDL : string): String;
var
strTarget : string;
strSet : string;
f : TFileStream;
intStart : Integer;
intEnd : Integer;
begin
Result := '';
if not FileExists(strUDL) then exit;
f := TFileStream.Create(strUDL, fmOpenRead);
try
SetLength(strSet, f.Size div SizeOf(Char));
f.Read(PChar(strSet), f.Size);
finally
f.Free;
end;
intStart := Pos('Source=', strSet) + 7;
intEnd := Pos(';Persist', strSet);
strTarget := Copy(strSet, intStart, intEnd - intStart);
Result := strTarget;
end;
ファイルはUTF-16(BOMなし)で記録されているんですよね?
ANSI版(2007およびそれ以前)からUnicode版(2009およびそれ以降)にポーティングするときは
文字列の扱いを(基本的に)全て見直す必要があります。Embarcaderoの公式サイトにも
DEKOさんのところにもいろいろ資料がありますので、一通り目を通されたほうがよいかと。
コンパイルエラー、なくなりました。
その他色々と教えていただいた事を、これから勉強していきます。
ご回答いただきましてありがとうございました。
ツイート | ![]() |