Питання щодо запису у файли

Скажи будь ласка, як можна записати у файл запису стрінгів більше 256 символів? Тобто я хочу записати у файл вміст RichEdit.Lines.CommaText.

pasha_golub (2003-08-17 15:55) [1]

TFileStream або RichEdit.lines.SaveToFile

deep.one (2003-08-17 16:53) [2]

Ні, мені потрібно саме у File of blah-blah. у типізований файл тобто :)

Palladin (2003-08-17 17:45) [3]

deep.one (2003-08-17 23:23) [4]

Cоррі, друкарська помилка. поспішаю-с.

Palladin (2003-08-18 00:04) [5]

поспішаєш-с :) вже близько 5 годин поспішаєш-с

власне проблема у чому. в тому, що типізований файл працює з записами мають фіксований розмір. що у випадку RichEdit зовсім не має місце, бо довжина тексту це не щось постійне

Вихід (тільки я звичайно не зовсім розумію на якийсь чорт тобі це треба, але раз треба так треба), розбити текст на записи фіксованої довжини і писати їх.

type PByteArray=^TByteArray; TByteArray=array [0..255] of byte;

procedure StupidTextSave(p_strFileName,p_strText:string); var f:file of TByteArray; u:PByteArray; i:integer; begin AssignFile(f,p_strFileName);Rewrite(f); для i:=1 до Length(p_strText) div SizeOf(TByteArray) до begin u:=@p_strText[(i-1)*SizeOf(TByteArray)+1]; write(f,u^); end; if Length(p_strText) mod SizeOf(TByteArray)<>0 then begin new(u); i:=Length(p_strText) div SizeOf(TByteArray); move(p_strText[i*SizeOf(TByteArray)+1],u^,Length(p_strText) mod SizeOf(TByteArray)); u^[Length(p_strText) mod SizeOf(TByteArray)+1]:=0; write(f,u^); dispose(u); end; CloseFile(f); end;

function StupidTextLoad(p_strFileName:string):string; var f:file of TByteArray; u:TByteArray; s:string; begin Result:=""; SetLength(s,SizeOf(TByteArray)); AssignFile(f,p_strFilename);Reset(f); while not eof(f) do begin Read(f,u); move(u,s[1],sizeof(u)); result:=result+s; end; CloseFile(f); end;

Як користуватись? Так просто:

Збереження StupidTextSave("c:\test.txt",RichEdit1.Lines.Text); Завантаження RichEdit1.Lines.Text:=StupidTextLoad("c:\test.txt");

ЗИ: І все ж, у чому ж прикол? А?

Marser (2003-08-18 1:56) [6]

Palladin (2003-08-18 07:06) [7]

app (2003-08-18 07:31) [8]

deep.one (2003-08-18 09:46) [9]

Palladin, спасибо.. просто хочу написати свого роду записну книжку, яка буде містити багато "аркушів", проте хочу щоб вона зберігала все в один файл, насправді можна було б просто RichEdit.Lines.CommaText по черзі переписати в файл, але я хотів би додати ще поля до файлу. до приєра "пароль", а якщо це буде текстовий файл, то пароль видерти буде набагато простіше

Palladin (2003-08-18 10:02) [10]

Варто замислитися над TFileStream, тоді буде ще простіше, тобі лише залишається до кожного листа "причепити" об'єкт TStringList - містить поля. і весь твій запис з полями зведеться до запису рядків "аркуша" та до запису рядків об'єкта з полями.

deep.one (2003-08-18 19:33) [11]

Так цікаво. Дякую спробую. а як пов'язати всі ТStringList"и між собою в потік?

Song (2003-08-18 20:06) [12]

TStringList.SaveToStream потім потоки об'єднуєш (TStream.Write) і записуєш у файл - TStream.SaveToFile()

Palladin (2003-08-18 22:19) [13]

deep.one (2003-08-19 00:06) [14]

Гаразд, дякую. намагатимуся :))

V > 2003-08-19 01:38) [15]

MemoryStrem:TMemoryStream; FileStream:TFileStream; I:Integer; . FileStream.Position := 0;

//Початок циклу MemoryStream.Clear; StringList.SaveToStream(MemoryStream); I:=MemoryStream.Size; FileStream.Write(I, 4); MemoryStream.Position := 0; FileStream.CopyFrom(MemoryStream, MemoryStream.Size); MemoryStream.Clear; //Кінець циклу //У файл описаний перший StringList

FileStream.Position := 0; //Початок циклу FileStream.Read(I, 4); MemoryStream.Clear; MemoryStream.CopyFrom(FileStream, I); MemoryStream.Position := 0; StringList.LoadFromStream(MemoryStream); MemoryStream.Clear; //Кінець циклу //Прочитано перший StringList

Palladin (2003-08-19 07:26) [16]