如何在delphi中显示备忘录框中的REG文件条目
我想显示导出的.reg文件,例如abc.eg;我想在备忘录框中显示它的内容。我使用的是Delphi7。这是我使用的代码:如何在delphi中显示备忘录框中的REG文件条目,delphi,Delphi,我想显示导出的.reg文件,例如abc.eg;我想在备忘录框中显示它的内容。我使用的是Delphi7。这是我使用的代码: edit2.Text :=openDialog2.FileName; ShowMessage(edit2.Text) ; fileData2.LoadFromFile(edit2.Text); for i:=0 to fileData2.Count-1 do begin
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结尾的,事实上这是正常的。(科斯明现在可能已经修正了他的版本。)
您可以这样使用它:
memo2.Lines.Text := ReadUtf16TextFile(edit2.Text);
LoadTextFile('C:\test.reg', Memo1.Lines);
如果你想变得可爱,你可以在文件中查找BOM表,然后根据BOM表的内容决定加载UTF-16、UTF-8等等。在这段代码中,我假设文件和您的文件一样,都是用BOM编码为UTF-16。
regedit.exe
生成的.REG
文件是用UTF-16编码的纯文本文件。Delphi 7没有启用Unicode,它无法直接处理它:您需要自己进行转换,以转换为AnsiString
下面是一个将文本文件加载到TStrings
中的例程;它支持加载UTF-8、UTF-16 Little-Endian,并将所有其他内容都视为Ansi。使用BOM检查文件类型,我在Delphi 7上用所有3种类型的文件(UTF-8、UTF-16和Ansi)测试了例程:
在加载.reg
文件的特定情况下,可以执行以下操作:
memo2.Lines.Text := ReadUtf16TextFile(edit2.Text);
LoadTextFile('C:\test.reg', Memo1.Lines);
或
将文本文件加载到TMemo
控件中是一种非常糟糕(而且速度很慢!)的方法
它将一次添加一行,并每次重新绘制控件
如果您只是想将文本文件加载到TMemo
控件中,只需执行以下操作即可
Memo1.Lines.LoadFromFile(FileName);
如
如果确实要将文本文件的内容添加到控件的当前内容下面,可以使用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;
而且,如果您出于某种原因确实需要一次添加一行,就像您在原始代码中所做的那样,那么看在上帝的份上,请用
行围绕块。BeginUpdate
和行。EndUpdate
,这样就不会为每个添加的行重新绘制控件 @Cosmin在Unicode问题上是正确的。除此之外,您上面的代码最容易写成:memo2.Lines.LoadFromFile(edit2.Text)
但这只是对代码的注释-您仍然需要处理UTF-16->ANSI。请明确提及您的delphi版本。@warren question表示delphi7@sunandan,请参见编辑。我假设您看到的是页面的旧版本,因为我在最初回答后很快添加了代码示例。您可能需要一些错误检查,以防文件为空。而且它可能不是零终止的。为什么不直接使用inc(PW)
跳过BOM表呢?实际上,这段代码会失败,因为文件不是以空结尾的。@David,关于空终止符的理解很好。当我测试时,它没有AV,我也没有滚动备忘录来查看垃圾@大卫:我知道。但这需要说明。@David,你没有检查BOM!如果文件是真正的UTF-8编码,或者是Ansi编码,那该怎么办?(是的,我正在推广我自己的改进版本,因为我的版本正在处理所有3个)@Cosmin您错过了UTF16-BE和两个UTF-32编码。;-)这正在变成一场军备竞赛!如果你能让我的产品更实用一点,我很乐意删除我的产品。我在开其他编码的玩笑。您最好返回一个字符串,而不是推入一个字符串。我还认为我对WideString的使用比你的PWideChar更干净,尤其是空终止符的处理。@David,我的代码处理BOM,因此在决定BOM的大小和实际负载的起始位置之前,需要加载文件。因为我在内存中有数据,所以使用PWideChar
似乎是很自然的选择。@Cosmin不,您只需读取文件的前3个字节,然后从中计算出来。使用指针是代码有点混乱的原因,没有冒犯的意思。
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;