Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка при работе с типизованным файлом [D5, Win95/98, Win2k]


VJar ©   (2002-11-16 15:37:00) 

...
Type TRec = record
ID:word;
Theme:string[100];
Desc:TStringList;
Content:TStringList;
end;
const FN = "c:\test.dat";
var
Data:TRec;
F:File of TRec;
...

//write to file FN

AssignFile(F,FN);
Rewrite(F);
with Data do
begin
id:= 1;
Theme:= "Theme1";
Desc:= TStringList.Create;
Desc.Clear;
Desc.Add("Desc1");Desc.Add("Desc2");
Content:= TStringList.Create;
Content.Clear;
Content.Add("Content1");Content.Add("Content2");
end;
write(F,Data);
CloseFile(F);
...

//Read From File FN

...
AssignFile(F,FN);
Reset(F);
Read(F,Data);
Memo1.Lines:= Data.Desc; // Тут возникает ошибка
CloseFile(F);
...

Если сразу записать и прочитать, то все нормально.
А если записать. Закрыть программу. Запустить программу. Прочитать файл,
то тогда возникает ошибка в отмеченом месте. Почему? Может я не правильно
записываю или читаю?


Николай Быков   (2002-11-17 12:05:00) [1]

Удалено модератором


Юрий Зотов   (2002-11-17 11:59:00) [2]

> VaS

1. Я и не расстраиваюсь. С чего?
2. Это не ошибка, а было пропущено умышленно. Странно, что не всем это очевидно.

> Fantasist

Поправка не по делу. Незачем засорять ответы деталями, не имеющими прямого отношения к сабжу. А если уж пишете про выравнивание, так надо любо объяснить человеку, что это такое, либо дать ссылку, где о нем прочитать. Иначе больше напоминает придирку к словам, а не поправку. Цель?


Fantasist   (2002-11-17 08:52:00) [3]


> Не расстраивайтесь Вы так, Юрий

Точно! Мы ведь не в качестве подавления или самовыпячивания, а наоборот, для поддержки. Думаю, никто не сомневается, что Вы об этом знаете, а вот если бы

> так никто и не узнал бы

то эти никто потом могли бы еще долго голову ломать попадись им такой трюк.
Так что хоть и не Архиважнейшаяно все-таки поправка.


VaS   (2002-11-17 08:05:00) [4]

Не расстраивайтесь Вы так, Юрий. Все ошибаются :)


Юрий Зотов   (2002-11-17 01:41:00) [5]

> Fantasist

Архиважнейшая и чрезвычайно полезная поправка. Главное, по самой сути сабжа. Нисколько не уводит в сторону от темы.

Tnx. А то так никто и не узнал бы.


Fantasist   (2002-11-17 00:24:00) [6]


> Проверьте сами - SizeOf(TRec) всегда даст 111 (2 + 101 +
> 4 + 4),


А вот и нет. :) Скорее всего 112. Выравнивание. :)
Хотя, то что независимо, это точно.


Gigabyte   (2002-11-16 15:59:00) [7]

Проблема возникает из-за того, что система записывает в файл не сами данные из TStringList, а адрес памяти по которому они записаны. При повторном запуске програми этот адрес естественно меняется.
по крайней мере у меня размер записи

Rec.S.Add("Test0")
Rec.S.Add("Test1")
Rec.S.Add("Test2")

в файле не превышает 4 байта. И это я могу обяснить только вышеизложенным
Исходним поей программы:


Type TRec = packed record
A,B:Integer;
S:TStringList;
.........
var Rec:TRec
.............
Rec.A:=01;
Rec.B:=01;
Rec.S:=TStringList.Create;
Rec.S.Add("Test0");
Rec.S.Add("Test1");
Rec.S.Add("Test2");


Юрий Зотов   (2002-11-16 15:47:00) [8]

Desc и Content - это адреса объектов в текущем сеансе работы. Сохранять их в файле бессмысленно, надо сохранять не адреса, а сами строки.

Проверьте сами - SizeOf(TRec) всегда даст 111 (2 + 101 + 4 + 4), независимо от того, что содержится в StringList"ах.


Наверх

Титульная страница Поиск, карта сайта Написать письмо