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



我想显示一个导出的.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.BeginUpdateLines.EndUpdate包围块,这样控件就不会为每添加一行重新绘制!

最新更新