Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение и загрузка списков объектов 
:(
    Опции темы
Cheba
Дата 2.7.2005, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



Есть объект класса TList, который содержит ссылки на кучу других объектов.

Как это все нормально сохранить в файл и так же без особых заморочек потом все это дело из файла подгрузить?
PM MAIL ICQ   Вверх
Snowy
Дата 4.7.2005, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Cheba @ 2.7.2005, 16:56)
Есть объект класса TList, который содержит ссылки на кучу других объектов.
Как это все нормально сохранить в файл и так же без особых заморочек потом все это дело из файла подгрузить?

Ссылки на объекты бесполезно сохранять. Винда все равно расположит все по другому при следующем запуске.
Нужно сохранять данные объектов.
В объекте нужно сделать метод SaveToFile (SaveToStream) в котором вручную сохранять все поля.
При сохранении перебираем все объекты, сохраняем их в файл.
В объекте создаем метод LoadFromFile (LoadFromStream) в котором читаем все поля.
Создаем TList.
Открываем файл и создаем поочередно все объекты, подгружая данные.
Запихиваем объекты в TList.
Все придется делать вручную... Автоматики здесь нет никакой.
PM MAIL   Вверх
Cheba
Дата 4.7.2005, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



Цитата(Snowy @ 4.7.2005, 13:51)
Ссылки на объекты бесполезно сохранять. Винда все равно расположит все по другому при следующем запуске.

Это я знаю. Именно поэтому (и потому, что я ленивый) возник вопрос.

Сначала думал применить TWriter и TReader. о оказалось, чтоони тоже не выкупают как сохранять такие объекты. Да и из одного файла, наверное, не получится подгрузить таким образом много объектов. А их очень много тысяч 70. А столько файликов плодить неохота...
PM MAIL ICQ   Вверх
Snowy
Дата 4.7.2005, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Cheba @ 4.7.2005, 14:50)
Это я знаю. Именно поэтому (и потому, что я ленивый) возник вопрос.

До сих пор ничего универсального не придумано. Приходится самому...
Цитата(Cheba @ 4.7.2005, 14:50)
Да и из одного файла, наверное, не получится подгрузить таким образом много объектов. А их очень много тысяч 70. А столько файликов плодить неохота...

Откуда такие странные мысли? Очень даже получится.
Открываем файл стримом, а потом передаем указатель на этот стрим функциям сохранения или чтения. Все очень даже получится.
А плодить тысячи файлов это точно бестолковая затея.
PM MAIL   Вверх
Cheba
Дата 4.7.2005, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



А как бфть, если эти объекты должны занимать определенное положение в списке? При чем могуть быть и нулевые поинтеры в списке на некоторых местах. То есть этот TList может содержать в середине списка nil. И если сохранять список, то нулевые указатели, конечно же, будут пропускаться, а сами объекты не знают на каком месте в списке они находятся. При подгрузке из файла TReader'ом вряд ли удастся восстановить весь список вместе с нулевыми указателями. Или я опять ошибаюсь?
PM MAIL ICQ   Вверх
Snowy
Дата 4.7.2005, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Cheba @ 4.7.2005, 15:20)
А как бфть, если эти объекты должны занимать определенное положение в списке? При чем могуть быть и нулевые поинтеры в списке на некоторых местах. То есть этот TList может содержать в середине списка nil.

Если это так необходимо, то можно в файл сохранять пустой или левый объект, у которого в одном из полей будет прописан признак по которому при чтении можно будет определить, что это несуществующий объект. И в TList добавлять пустую запись.
Правда я не знаю зачем это может быть нужно...
Но тогда придется делать не метод объекта, а наследовать TList и в нем встраивать методы сохранения и чтения (поскольку нельзя выполнить метод от nil). Либо сделать для этого отдельные процедуры сохранения/чтения.
PM MAIL   Вверх
Cheba
Дата 4.7.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



Унаследовался от TList. Даже работает.

Работет это так. При выходе из проги сохраняется состояние этого списка. При старте, если есть этот файлик, то объеты подгружаются из него. Вот только заметил, что если файлик битый, то приложение выдает мне ошибку и приложение не стартует. Как можно это дело предотвратить? Как проверить нормальный ли файлик? И если не нормальный, то не грузиться из него.
PM MAIL ICQ   Вверх
Snowy
Дата 4.7.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Битый в смысле не того вормата или какие-то данные повреждены?
Если не того формата, это можно пофиксить созданием заголовка файла.
Если заголовок не наш, то не открываем.
Если повреждены данные, то это можно вылечить путем добавления контрольной суммы к каждой записи. Если сумма не сходится, то два варианта:
1. Не грузим файл вообще.
2. Заполняем битые записи nil'ами, а пользователю кричим о повреждении данных.
PM MAIL   Вверх
Quadr0
Дата 5.7.2005, 00:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 22:34
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0869 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.