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 );
- 如何创建数组,并对其进行操作(添加、删除
...) 与 'name'?
- 如何保存它(数组),并从本地存储轻松加载它? (前任:
File.dat)
我找到了一些信息 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;
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;
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.
感谢大家的帮助!
我正在寻找有关如何将 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 );
- 如何创建数组,并对其进行操作(添加、删除 ...) 与 'name'?
- 如何保存它(数组),并从本地存储轻松加载它? (前任: File.dat)
我找到了一些信息 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;
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;
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.
感谢大家的帮助!