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

时间:2011-06-24 12:10:10

标签: delphi

我想显示一个导出的.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文件的内容。

我做错了什么? 在此先感谢

3 个答案:

答案 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,因此不会为每个添加的行重新绘制控件!