Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 163

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Суть в следующем. Есть свой класс Tsignature, определяемый в отдельном юните. У экземпляра класса есть три стринговых поля. Для хранения базы экземпляров класса используется типизированный файл (объявление в пиложении). Возникает проблема:
Если в файл сначала записать экземпляры класса, а потом СРАЗУ ЖЕ, не делая CloseFile, прочитать - все читается. Но если файл открыть и сразу прочитать, не записывая ничего нового (файл не пустой, естественно, там записи есть) вылетает ошибка Access Violation at adress... Перепробовал все. Ничего не понимаю. Помогите...

Приложение:
  1.  
  2. type
  3. TSignature = class(TObject)
  4. private
  5. public
  6. name : String;
  7. ext : String;
  8. dscr : String;
  9. end;
  10.  
  11. -------------
  12. uses sign
  13. ...
  14. var
  15. rec2 : Tsignature;
  16. begin
  17. ...
  18. AssignFile(database, datapath);
  19. Reset(database);
  20. for j := 0 to Filesize(database) do
  21. begin
  22. Seek(database, j);
  23.  
  24. Memo1.Lines.Add(IntToStr(j)+' '+rec2.name+' | '+rec2.ext+' | '+rec2.dscr);
  25. end;
  26.  
  27.  


Mike Drnk Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Mike Drnk (статус: Посетитель)
Вопрос отправлен: 6 декабря 2008, 12:44
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 7 декабря 2008, 00:53; участников в обсуждении: 5.
Косолапов Дмитрий Юрьевич

Косолапов Дмитрий Юрьевич (статус: 8-ой класс), 6 декабря 2008, 13:12 [#1]:

Кажется, seek не нужно делать... Да и цикл, видимо, while not EOF(database) do...
Кстати, странно, что такая запись пишется в файл - строки-то безразмерные. Потенциально гораздо меньше проблем, если строки будут заданной длины (string[50], к примеру).
Mike Drnk

Mike Drnk (статус: Посетитель), 6 декабря 2008, 13:14 [#2]:

Без него тоже не работает... Да и циклы всякие перепробовал... Та же ситуация. В тестовом примере, вообще без циклов. Просто вводится вручную позиция, с которой читать.
Nasgool

Nasgool (статус: 2-ой класс), 6 декабря 2008, 13:17 [#3]:

Напиши пожалюйста как объявляется типизированный файл.
Nasgool

Nasgool (статус: 2-ой класс), 6 декабря 2008, 13:22 [#4]:

И еще! Зачем в файзаписывать объект? Если нужно записать только стринги, делай так:
type
TRec = record
name : String[255];
ext : String[255];
dscr : String[255]; // при работе с файлами у стринга обязательно указывается длина
end;
TSignature = class(TObject)
private
public
Rec: TRec;
end;


......


var database: file of Trec; //объявление файла
Mike Drnk

Mike Drnk (статус: Посетитель), 6 декабря 2008, 13:25 [#5]:

Убрал строки вообще. Тестировал на integer'ных полях - не помогло
Mike Drnk

Mike Drnk (статус: Посетитель), 6 декабря 2008, 13:27 [#6]:

Объявляется так:
var
database : file of Tsignature
begin
...
AssignFile(database, datapath);
Reset(database);
Строки ограничел, кстати, тоже. Не помогло.
Nasgool

Nasgool (статус: 2-ой класс), 6 декабря 2008, 13:29 [#7]:

Может проблема не в работе с файлами, а в работе с объектами? как записываешь в файл, как читаешь?
Mike Drnk

Mike Drnk (статус: Посетитель), 6 декабря 2008, 13:36 [#8]:

var
rec : TSignature;

write(database, rec);
read(database, rec);

А что - как-то еще можно?:)
Mike Drnk

Mike Drnk (статус: Посетитель), 6 декабря 2008, 13:40 [#9]:

Nasgool, спасибо. Если использовать записи - все работает.
Вадим К

Вадим К (статус: Академик), 6 декабря 2008, 18:28 [#10]:

А не смущаал размер файла после записи туда объектов? Не смущало ли то, что на каждый записанный объект было 4 байта? дело в том, что писались в файл указатели:). Правильным подходом будет конечно либо использование структур (при этом нельзя использовать String, а только ShortString, что и было предложено Nasgool), либо более красивый путь - класс должен уметь сам себя писать/читать.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 7 декабря 2008, 00:53 [#11]:

Подписываюсь под ответом Вадим Ки. Я именно так и делаю. Могу прислать примерчег.
А то слишком геморройно у тебя написано.
Посмотри мой ответ тут.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:02
Выполнено за 0.03 сек.