Delphi TRichEdit 到数组和本地存储

Delphi TRichEdit to Array and local storage

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

我想我必须开始:

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

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

并添加数据,例如:

richedit.Lines.SaveToStream( ARListMessages[i].Text );

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

感谢您的宝贵时间。

[编辑 2017 年 9 月 18 日]

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

我要测试的实际代码是:

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 看起来很棒而且简单,但可以免费试用...:(

How to create the Array, and make manipulations on it (Add, remove ...) with the 'name'?

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

如果您问“如何创建数组?”如“如何创建这样的列表,那么我可以添加、删除'name' 字段" 那么我会建议 TDictionary (instead of the city names use your field 'name' as a key) to do the manipulations and then when saving use this

How can I save it (Array), and load it easily from local storage ? (Ex: File.dat)

你不能直接像array.savetofile;一样。你需要使用像TFileStream to store the array这样的文件处理方法之一。

注意:在您编辑内存流时只会给您带来麻烦,因为每次创建它时您都需要在使用后释放它,而不是使用这些函数来提取格式化文本并将字段 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;
    

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

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.

感谢大家的帮助!