我想显示一个导出的.reg文件,例如。 abc.eg;我想在备忘录框中显示其内容。我使用的是Delphi 7.这是我用过的代码:
edit2.Text :=openDialog2.FileName;
ShowMessage(edit2.Text) ;
fileData2.LoadFromFile(edit2.Text);
for i:=0 to fileData2.Count-1 do
begin
str:=fileData2[i];
memo2.Lines.Append(str);
end;
此代码正确显示INI文件的内容。
我做错了什么? 在此先感谢
答案 0 :(得分:4)
作为Cosmin答案的补充,我提供此版本的Utf16 - >安斯转换:
function ReadUtf16TextFile(const FileName: string): string;
const
WideCharSize = SizeOf(WideChar);
var
Stream: TFileStream;
Utf16: WideString;
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
Try
if Stream.Size>WideCharSize then begin
SetLength(Utf16, (Stream.Size div WideCharSize)-1);
Stream.Position := WideCharSize;//skip the BOM
Stream.ReadBuffer(Utf16[1], Length(Utf16)*WideCharSize);
Result := Utf16;
end else begin
Result := '';
end;
Finally
Stream.Free;
End;
end;
面对空文件,它是非常健壮的,非空终止的文件实际上是常态。 (Cosmin可能已经修复了他的版本。)
你可以像这样使用它:
memo2.Lines.Text := ReadUtf16TextFile(edit2.Text);
如果你想变得可爱,可以在文件中查找BOM,然后决定加载UTF-16,UTF-8等,具体取决于BOM的内容。在这段代码中,我假设文件被编码为带有BOM的UTF-16,就像你的文件一样。
答案 1 :(得分:2)
.REG
生成的regedit.exe
文件是使用UTF-16编码的纯文本文件。 Delphi 7不支持Unicode,并且无法直接处理它:您需要自己转换为AnsiString。
这是一个将文本文件加载到TStrings
的例程;它支持加载UTF-8,UTF-16 Little Endian并将其他所有内容都视为Ansi。使用BOM检查文件类型,我使用所有3种类型的文件(UTF-8,UTF-16和Ansi)在Delphi 7上测试了例程:
procedure LoadTextFile(const FileName:string; const Strings: TStrings);
var FS: TFileStream;
Buff: PByteArray;
begin
FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
if FS.Size = 0 then Exit;
Buff := AllocMem(FS.Size + 2); // Enough space to read the whole file and space to add a terminator
try
// Read the file
FS.ReadBuffer(Buff^, FS.Size);
// Init the NULL terminator
Buff[FS.Size] := 0;
Buff[FS.Size+1] := 0;
// Check the BOM
if (Buff[0] = $ff) and (Buff[1] = $fe) then
begin
// UTF-16, Little Endian encoding
Strings.Text := PWideChar(@Buff[2]); // Skip BOM, automatic UTF16->ANSI encoding
end
else if (Buff[0] = $ef) and (Buff[1] = $bb) and (BUff[2] = $bf) then
begin
// UTF8 Encoding
Strings.Text := Utf8ToAnsi(UTF8String(PAnsiChar(@Buff[3]))); // Skip BOM, explicit UTF8->ANSI
end
else
begin
// Unknown or unsupported BOM, assume Plain Ansi File
Strings.Text := PAnsiChar(Buff);
end
finally FreeMemory(Buff);
end;
finally FS.Free;
end;
end;
在加载.reg
文件的特定情况下,您可以执行以下操作:
LoadTextFile('C:\test.reg', Memo1.Lines);
或
LoadTextFile(Edit1.Text, Memo1.Lines);
答案 2 :(得分:2)
这是一种将文本文件加载到TMemo
控件中的非常糟糕(而且速度慢!)的方法!
一次添加一行,每次都重新绘制一次!
如果您只想将文本文件加载到TMemo
控件中,只需执行
Memo1.Lines.LoadFromFile(FileName);
,如
with TOpenDialog.Create(nil) do
try
if Execute then
Memo1.Lines.LoadFromFile(FileName);
finally
Free;
end;
如果您确实要将文本文件的内容添加到控件的当前内容之下,则可以使用AddStrings
方法,如
var
newlines: TStringList;
begin
with TOpenDialog.Create(nil) do
try
if Execute then
begin
newlines := TStringList.Create;
try
newlines.LoadFromFile(FileName);
Memo1.Lines.AddStrings(newlines);
finally
newlines.Free;
end;
end;
finally
Free;
end;
而且,如果你出于某种原因真的需要一次添加一行,就像你在原始代码中所做的那样,那么为了上帝的缘故,请用Lines.BeginUpdate
围绕该块。 Lines.EndUpdate
,因此不会为每个添加的行重新绘制控件!