|
Вопрос # 2 163/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Суть в следующем. Есть свой класс Tsignature, определяемый в отдельном юните. У экземпляра класса есть три стринговых поля. Для хранения базы экземпляров класса используется типизированный файл (объявление в пиложении). Возникает проблема:
Если в файл сначала записать экземпляры класса, а потом СРАЗУ ЖЕ, не делая CloseFile, прочитать - все читается. Но если файл открыть и сразу прочитать, не записывая ничего нового (файл не пустой, естественно, там записи есть) вылетает ошибка Access Violation at adress... Перепробовал все. Ничего не понимаю. Помогите...
Приложение: Переключить в обычный режим-
- type
- TSignature = class(TObject)
- private
- public
- name : String;
- ext : String;
- dscr : String;
- end;
-
- -------------
- uses sign
- ...
- var
- rec2 : Tsignature;
- begin
- ...
- AssignFile(database, datapath);
- Reset(database);
- for j := 0 to Filesize(database) do
- begin
- Seek(database, j);
-
- Memo1.Lines.Add(IntToStr(j)+' '+rec2.name+' | '+rec2.ext+' | '+rec2.dscr);
- end;
-
-
 |
Вопрос задал: 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 (статус: Посетитель), 6 декабря 2008, 13:14 [#2]:
Без него тоже не работает... Да и циклы всякие перепробовал... Та же ситуация. В тестовом примере, вообще без циклов. Просто вводится вручную позиция, с которой читать.
|
|
Nasgool (статус: 2-ой класс), 6 декабря 2008, 13:17 [#3]:
Напиши пожалюйста как объявляется типизированный файл.
|
|
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 (статус: Посетитель), 6 декабря 2008, 13:25 [#5]:
Убрал строки вообще. Тестировал на integer'ных полях - не помогло
|
|
Mike Drnk (статус: Посетитель), 6 декабря 2008, 13:27 [#6]:
Объявляется так:
var
database : file of Tsignature
begin
...
AssignFile(database, datapath);
Reset(database);
Строки ограничел, кстати, тоже. Не помогло.
|
|
Nasgool (статус: 2-ой класс), 6 декабря 2008, 13:29 [#7]:
Может проблема не в работе с файлами, а в работе с объектами? как записываешь в файл, как читаешь?
|
|
Mike Drnk (статус: Посетитель), 6 декабря 2008, 13:36 [#8]:
var
rec : TSignature;
write(database, rec);
read(database, rec);
А что - как-то еще можно?
|
|
Mike Drnk (статус: Посетитель), 6 декабря 2008, 13:40 [#9]:
Nasgool, спасибо. Если использовать записи - все работает.
|
|
Вадим К (статус: Академик), 6 декабря 2008, 18:28 [#10]:
А не смущаал размер файла после записи туда объектов? Не смущало ли то, что на каждый записанный объект было 4 байта? дело в том, что писались в файл указатели . Правильным подходом будет конечно либо использование структур (при этом нельзя использовать String, а только ShortString, что и было предложено Nasgool), либо более красивый путь - класс должен уметь сам себя писать/читать.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 7 декабря 2008, 00:53 [#11]:
Подписываюсь под ответом Вадим Ки. Я именно так и делаю. Могу прислать примерчег.
А то слишком геморройно у тебя написано.
Посмотри мой ответ тут.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|