Форум: "Основная";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
ВнизВопрос по поводу записи в файлы Найти похожие ветки
← →
deep.one (2003-08-17 15:45) [0]Скажи пожалуйста, как можно записать в файл записи стрингов больше 256символов? То есть, я хочу записать в файл содержимое RichEdit.Lines.CommaText.
← →
pasha_golub (2003-08-17 15:55) [1]TFileStream
or
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);
for i:=1 to Length(p_strText) div SizeOf(TByteArray) do
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 01:56) [6]А если {$H+}?
← →
Palladin (2003-08-18 07:06) [7]
> Marser © (18.08.03 01:56) [6]
В смысле?
← →
app (2003-08-18 07:31) [8]Marser © (18.08.03 01:56) [6]
Вопрос можно ли применить это к TRichEdit?
А в его ничего не пройдет, он хочет типизированный файл, где элементы строки больше 256символов
Если очень хочет, но это странно, то можно создать тип array[1..N] of char и тогда можно создать file of этот тип
Приведет это к нехорошим последствиям, будет много неиспользованого места в файле и некоторые строки придется обрезать по границе N-1 если они не будут влезать.
← →
deep.one (2003-08-18 09:46) [9]Palladin, cпасибо.. просто хочу написать своего рода записную книжку, которая будет содержать много "листов", однако хочу чтобы она сохраняла все в один файл, на самом деле можно бы было просто 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]Нет, не совсем так, ибо если занести все записаные TStringList в поток, то при последующем чтении первый же TStringList.LoadFromStream загрузи всё и поля и остальные строки. Что не приемлимо. Следует организовать разделение между потоками строк.
Думай. И воздастса тебе :)
← →
deep.one (2003-08-19 00:06) [14]Ладно, большое спасибо... буду пытаться :))
← →
VID (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]
> VID © (19.08.03 01:38) [15]
Гениально, а сразу в FileStream писать не судьба?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c