2017-09-16 28 views
-1

我正在尋找如何把TRichEdit放入數組並將其保存到本地文件(例如:File.dat)的信息。 我們的目標是存儲大量的文字,描述以及它的「名稱」。德爾福TRichEdit陣列和本地存儲

我想我必須開始:

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)

我發現一些信息here,沒有beeing能夠使一些工作。

謝謝你的時間。

[編輯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一直在尋找偉大的和容易的,但免費試用... :(

+0

自動創建一個固定長度的數組。 –

+0

?對不起,我不記得。 – benda

+0

你問過如何分配數組。你沒有。它被自動分配。另一方面,使用動態數組可能會更好。然後你用SetLength分配。 –

回答

0

如何創建磁盤陣列,並在其上作操作(添加,刪除 ...)與「名稱」?

從你的第一個代碼已創建數組,不需要任何進一步的工作。即使你使用動態數組,你還沒有做任何事情剛剛宣佈它將足夠了。

如果你是詢問「如何創建陣列?」,如「如何創建這樣的列表,所以我可以添加,刪除'名稱'字段「,那麼我會建議TDictionary(而不是城市名稱使用您的字段'名稱'作爲一個關鍵)做操作,然後當節省空間use this

如何將其保存(數組)並從本地存儲輕鬆加載? (例如:FILE.DAT)

不能直接就跟array.savetofile;。你需要使用的文件處理方法之一,像TFileStreamstore 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; 
    
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. 

謝謝大家的幫助!

+0

很高興看到你把它變成了你自己,如果我的回答給了你解決問題所需的東西。你會考慮[接受](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –