我想显示一个导出的.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文件的内容。
我做错了什么?提前感谢
作为对Cosmin答案的补充,我提供了这个版本的Utf16->Ansi转换:
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;
它在面对空文件时是稳健的,这些文件不是以null结尾的,这实际上是常态。(Cosmin现在可能已经修复了他的版本。)
你可以这样使用它:
memo2.Lines.Text := ReadUtf16TextFile(edit2.Text);
如果你想变得可爱,你可以在文件中查找BOM,然后根据BOM的内容决定加载UTF-16、UTF-8等等。在这段代码中,我假设文件被编码为带有BOM的UTF-16,就像您的文件一样。
regedit.exe
生成的.REG
文件是使用UTF-16编码的纯文本文件。Delphi7没有启用Unicode,它不能直接处理它:您需要自己转换到AnsiString。
下面是一个例程,它将把一个文本文件加载到TStrings
中;它支持加载UTF-8、UTF-16 Little Endian,并将其他一切都视为Ansi。使用BOM检查文件类型,我在Delphi7上测试了所有3种类型的文件(UTF-8、UTF-16和Ansi)的例程:
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);
将文本文件加载到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
包围块,这样控件就不会为每添加一行重新绘制!