| 
| 
 | Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |