Питання щодо запису у файли
Скажи будь ласка, як можна записати у файл запису стрінгів більше 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]