Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在delphi中显示备忘录框中的REG文件条目_Delphi - Fatal编程技术网

如何在delphi中显示备忘录框中的REG文件条目

如何在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

我想显示导出的.reg文件,例如abc.eg;我想在备忘录框中显示它的内容。我使用的是Delphi7。这是我使用的代码:

         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;