-1

我正在寻找有关如何将 TRichEdit 放入数组并将其保存到本地文件(例如:File.dat)的信息。目标是存储大量文本、描述和它的“名称”。

我想我必须从:

type
   TMessage = record
     Name : string;
     Desc : string;
     Text : TMemoryStream;
end;

var ARListMessages: array[1..50] of TMessage 

并使用以下内容添加数据:

richedit.Lines.SaveToStream( ARListMessages[i].Text );
  • 如何创建数组,并使用“名称”对其进行操作(添加、删除...)?
  • 如何保存它(数组),并从本地存储轻松加载它?(例如:文件.dat)

我在这里找到了一些信息,但无法使某些东西正常工作。

谢谢你的时间。

[编辑 18/09/2017]

我仍在寻找解决方案,并尝试找到将我的信息保存到本地文件的方法。

我要测试的实际代码是:

var
  MessageArray  : array of TMessage;

// // // //

  SetLength(MessageArray, 1);
  MessageArray[0].Name := 'Hey You';
  MessageArray[0].Desc := 'Im here and will stay here, just in case';
  MessageArray[0].Text := TMemoryStream.Create;
  MessageArray[0].Text.Position := 0;
  RichEdit1.plaintext := false;
  RichEdit1.Lines.SaveToStream( MessageArray[0].Text );

因此,希望保存MessageArray,但还没有找到如何做到这一点。我看过SuperObjet,但找不到如何处理它。Omxl 看起来很棒而且很简单,但免费试用...... :(

4

2 回答 2

1

我已经能够得到答案了。如果有人需要解决方案,我在这里分享。

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Generics.Collections, Classes, System.Zip;


type
  TPersonne = class
  strict private
     FNom   : string;
     FPrenom: string;
  public
    property Nom:    string read FNom    write FNom;
    property Prenom: string read FPrenom write FPrenom;
  end;

  TFamille = class(TDictionary<string, TPersonne>)
  private
    procedure LoadFromStream(stream: TStream);
    procedure SaveToStream(stream: TStream);
  public
    procedure LoadFromFile(const AFileName: string);
    procedure SaveToFile(const AFileName: string);
  end;

procedure TFamille.SaveToStream(stream: TStream);
var
   i: Integer;
   Personne: TPersonne;
   Pair: System.Generics.Collections.TPair<string, TPersonne>;
   Writer: TWriter;
begin
   Writer := TWriter.Create(stream, 4096);
   try
      Writer.WriteListBegin;
      for Pair in Self do
      begin
         Writer.WriteString(Pair.Key);
         Writer.WriteListBegin;

         Personne := Pair.Value;

         Writer.WriteString(Personne.Nom);
         Writer.WriteString(Personne.Prenom);

         Writer.WriteListEnd;
      end;
      Writer.WriteListEnd;
   finally
      Writer.Free;
   end;
end;

procedure TFamille.LoadFromStream(stream: TStream);
var
   Personne: TPersonne;
   Reader: TReader;
   sKey: string;
begin
   Clear;
   Reader := TReader.Create(stream, 1024);
   try
      Reader.ReadListBegin;
      while not Reader.EndOfList do
      begin
         sKey     := Reader.ReadString;
         Personne := TPersonne.Create;

         Reader.ReadListBegin;

         while not Reader.EndOfList do
         begin
            Personne.Nom    := Reader.ReadString;
            Personne.Prenom := Reader.ReadString;
         end;

         Reader.ReadListEnd;
         Add(sKey, Personne);
      end;
      Reader.ReadListEnd;
   finally
      Reader.Free;
   end;
end;

procedure TFamille.LoadFromFile(const AFileName: string);
var
   Stream: TStream;
begin
   Stream := TFileStream.Create(AFileName, fmOpenRead);
   try
      LoadFromStream(Stream);
   finally
      Stream.Free;
   end;
end;

procedure TFamille.SaveToFile(const AFileName: string);
var
   stream: TStream;
begin
   stream := TFileStream.Create(AFileName, fmCreate);
   try
      SaveToStream(stream);
   finally
      stream.Free;
   end;
end;

var
   Famille:  TFamille;
   Personne: TPersonne;
begin
   try
      Famille := TFamille.Create;
      try
         Personne := TPersonne.Create;
         Personne.Nom    := 'Julie';
         Personne.Prenom := 'Albertine';

         Famille.Add('1', Personne);

         Famille.SaveToFile('D:\famille.txt');

      finally
         FreeAndNil(Famille);
      end;

      Famille := TFamille.Create;
      try
         Famille.LoadFromFile('D:\famille.txt');

         if Famille.Count > 0 then
            Writeln(Famille['1'].Nom + ' ' + Famille['1'].Prenom);
      finally
         FreeAndNil(Famille);
      end;

      Readln;
   except
   on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
   end;
end.

感谢你的帮助 !

于 2017-09-22T08:12:25.910 回答
0

如何创建数组,并使用“名称”对其进行操作(添加、删除...)?

从您的第一个代码中,数组已经创建。无需进一步的工作。即使您使用动态数组,您仍然不必做任何事情,只需声明它就足够了。

如果您要问“如何创建数组? ”如“如何创建这样的列表,所以我可以添加,使用 'name' 字段删除”,那么我建议TDictionary(而不是城市名称使用您的字段' name' 作为键)进行操作,然后在保存时使用它

如何保存它(数组),并从本地存储轻松加载它?(例如:文件.dat)

你不能直接喜欢array.savetofile;。你需要使用像TFileStream这样的文件处理方法之一来存储数组

注意:在您的编辑中,内存流只会给您带来麻烦,因为每次创建它时,您都需要在使用后释放它,而不是使用这些函数来提取格式化文本并将字段更改Text : TMemoryStream;Text : string;

  1. RichTextToStr: 将富格式文本转换为string.

    function RichTextToStr(RichEdit:TRichEdit):string;
    var
    SS : TStringStream;
    begin
    SS := TStringStream.Create('');
      try
      RichEdit.Lines.SaveToStream(SS);
      Result := SS.DataString;
      finally
      SS.Free;
      end;
    end;
    
  2. loadToRichedit: 将格式化的文本加载到后面RichEdit

    procedure loadToRichedit(Const St:string;RichEdit:TRichEdit);
    var
    SS : TStringStream;
    begin
    SS := TStringStream.Create(St);
       try
       RichEdit.Lines.LoadFromStream(SS);
       finally
       SS.Free;
       end;
    end;
    
于 2017-09-18T21:28:12.203 回答