Delphi Trichedit到数组和本地存储



我正在寻找有关如何将trichedit放入数组中并将其保存到本地文件(ex: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 );
  • 如何创建数组并在其上进行操作(添加,删除...)用"名字"?
  • 如何保存它(数组),然后轻松地从本地存储中加载它?(前任:file.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 ,但还没有找到该怎么做。我已经看了超级射击,但找不到如何处理它。OMXL看起来很棒又容易,但免费试用... :(

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

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.

感谢您的帮助!

如何创建数组并在其上进行操作(添加,删除 ...)用"名称"?

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

如果您问" 如何创建数组?",如" "如何创建这样的列表,因此我可以添加,删除'name'字段然后,我建议Tdictionary(而不是城市名称使用您的字段'名称'作为密钥)进行操作,然后保存时使用此操作

如何保存(数组)并轻松地从本地存储中加载它? (例如:file.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;
    

相关内容

  • 没有找到相关文章

最新更新