我正在寻找有关如何将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;
-
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;