![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
CodeMonkey |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Items
это свойство Items объекта TTestObjectCollection. TTestObjectCollection - это контейнер из TTestObject. Items = "свойство равно" Items = <> "свойство равно пустому набору объектов" Items = < объекты > "свойство равно набору объектов" Что тут необычного? Вот, вполне стандартный пример:
Набор объектов - это коллекция. Используется для сохранения набора объеков, которые не являются компонентами. Добавлено через 3 минуты и 50 секунд Имеется в виду, что когда у тебя в контейнере - компоненты, то они сохраняются так:
Но этот синтаксис не может быть использован для сохранения не компонентов - потому что у них нет Name. Поэтому используется другой синтаксис. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
||||
|
|||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
CodeMonkey,
У Вас ангельское терпение. Спасибо. Я первый раз с таким синтаксисом встретился. стало быть <> между тегами набор объектов? Сижу в демке, но 90 процентов кода не понимаю. -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Я не просто так это делаю, а с корыстной целью ![]() По итогам я собираюсь написать очередную статью, где рассказать про сохранение/загрузку данных в файлы и потоки. И ответить на возникающие вопросы. Да. Каждый элемент заключён в item/end. Тот код, что в .pas модулях - понимать не надо. Это служебный код, который надо взять и использовать. Сама демка - это код в .dpr. Вот его надо разбирать. Смотрите, как я уже говорил выше, TPersistent сам себя сохранять не умеет. Это можно легко добавить. Так сделано в http://delphikingdom.ru/asp/viewitem.asp?catalogid=1426 Там создаётся наследник TPersistent, который получает возможность сериализовать и десериализовать сам себя. Как видите, там всего пара строчек. Вот, если вы наследуетесь от TBaseObject из той статьи, то автоматом получаете SaveToStream и LoadFromStream. Но. Если вам нужно сериализовывать TPersistent (а не наследника) и вам нужно больше контроля, то можно действовать сложнее - как сделал я в своей демке. Я не думаю, что есть смысл разбирать мой код. Вся его суть сводится к тем же нескольким строчкам из http://delphikingdom.ru/asp/viewitem.asp?catalogid=1426 Всё остальное - это внешний обвес, позволяющий делать дополнительные плюшки. А вам из этого кода нужно вынести только одно: _WritePersistent сохраняет объект в поток, _ReadPersistent - загружает. Остальное - в .dpr. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
CodeMonkey,
Ящик пива с меня. Холодного. Я кончено рискую ВАс замучить, но object CategoryPanel1: TCategoryPanel Вот например, никогда бы не подумал, что можно и так написать. Всегда считал, что все создается через классы.
Дело в том, что толковых книг по концепции ООП вообще практически нет. А вопросов у меня куча мала... Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 17:29 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Эээээ.... а вы отличаете .dfm и .pas файлы? Вот у вас написано:
Вы что думаете это такое? Это - определение класса. Указана ли здесь информация о состоянии класса (т.е. "кнопка Button1 расположена по центру окна, которое имеет размеры 800x600")? Нет. Эта информация хранится отдельно - в .dfm файле. И загружается оттуда LoadFromStream (в моём примере: аналог - _ReadPersistent). Вот в .dfm и написано:
Это - не Паскаль. Это - не код. Это - не определение класса. Это - сохранённое состояние объекта в текстовой форме. Т.е. просто данные. Да, сохранённые данные, несомненно, связаны с определением класса. Но это - разные вещи. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
||||||
|
|||||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Я понял.
В общем все реальные данные о состоянии вынесены в отдельный файл. Уфф. Продолжаю разбираться. Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 18:11 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
CodeMonkey, РАЗБИРАЮСЬ. С Б-ей и Вашей помощью. UnitDefaultPersFiler in '..\UnitDefaultPersFiler.pas', UnitPersistent in '..\UnitPersistent.pas'; Какие-то особые модули, идущие в комплекте? _WritePersistent(FS, T, TDefaultTextWriter); Вопрос. Что означает символ подчеркивания в начале строки? Передаваемые параметры. ПРавильно ли я понимаю: 1) FS - файловый поток Указатель-объект, класса TFileStream 2) T - сам записываемый объект. 3) TDefaultTextWriter - хотелось бы уточнить что это? На параметр не похоже. Указание особого режима? Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 18:34 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Почему везде употребляется служебное слово const? И что оно означает в данном конкретном случае. Если это передаваемый параметр, он ведь может изменяться? Т.е. ему нельзя быть const? Разве недостаточно constructor Create(AStr: String; AInt: Integer); Или const в данном случае означают те значения, которые будут переданы в поля, если конструктор вызван без параметров? Object = TClass.Create; //Полям подставляются значения-константы. В нашем случае ' ' и 0 Вместо Object = TClass.Create(значение, значение); //Поля принимают введенные значения Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 18:55 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
||||||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Это PersistentDemo.zip\UnitDefaultPersFiler.pas и PersistentDemo.zip\UnitPersistent.pas. Лежат в каталоге выше от PersistentDemo.zip\Demo\ProjectDemo.dpr В эти модули вынесен служебный код. Там находится реализация _WritePersistent и _ReadPersistent Ничего. Мне так захотелось.
Прототип функции записан в UnitPersistent.pas. Его можно увидеть, если зажать Ctrl и щёлкнуть левой кнопкой мыши по _WritePersistent. Вот:
Это опциональный параметр. Указывает, какой сериализатор использовать при сохранении. По умолчанию сериализатор в Delphi гонит в двоичный формат TPF0. Вы можете использовать другой сериализатор. Например, тот, который пишет в текстовой форме. Именно это и делает TDefaultTextWriter - пишет в стандартный текстовый формат Delphi. Так что вам не нужно вызывать ObjectBinaryToText. Список доступных сериализаторов можно посмотреть в модуле UnitDefaultPersFiler.pas. Пока их всего 4: читалка/писалка в двоичный формат и читалка/писалка в текстовый формат. Добавлено через 4 минуты и 22 секунды Потому что это хороший стиль. Constant Parameters
Достаточно, но плохо.
Нет. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
||||||||||||
|
|||||||||||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Верно ли я понимаю, что
_WritePersistent(FS, T); _ReadPersistent(FS, T); те самые функции, код которых и расположен в подключаемых выше файлах? Никогда не сталкивался с FS := TFileStream.Create('.\SaveDemo.bin', fmCreate or fmShareExclusive); словом or в данном случае. Записать все три способа сохранения в одну процедуру Run? Наверно, лучше отдельные процедуры - для каждого способа своя. Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 19:13 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Да. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Немного зеленых вопросов по ООП
1) Я написал класс на основе другого класса. Например:
Вопросы знатокам: 1) Все ли описано верно? 2) Возможно ли в конструкторе обращение не к полям а к свойствам (В конструкторе выполнится функция, обслуживающая поле, вместо простого присвоения значения. 3) Главный вопрос. Нужен ли классу деструктор? Ведь стандартный деструктор Persistent ничего не знает о новых полях, следовательно он не сможет их погасить? Или же не так? 4) Если деструктор все-таки нужен, как прописать там уничтожение полей? Это сообщение отредактировал(а) PsiMagistr - 12.5.2011, 10:11 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
||||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
За исключением нескольких опечаток - да. Но вот так будет "правильнее":
В основном тут стилистические исправления.
Да. Вообще, если свойство не имеет методов-акцессоров, то обращаться к полю или сасому свойству - без разницы и дело вкуса. Если у свойства есть метод-акцессор, то тут надо смотреть, чего мы хотим. Как правило, обращение будет идти к свойству. Делать это можно где угодно. Нет.
Все строковые данные являются авто-финализируемыми типами. Они удаляются автоматически при освобождении объекта. Это даже не деструктор делает.
или
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
||||||||||
|
|||||||||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Все строковые данные являются авто-финализируемыми типами. Они удаляются автоматически при освобождении объекта. Это даже не деструктор делает.
А если встречаются не строковые? Вот например у меня там есть интегровый тип Добавлено через 9 минут и 22 секунды Вообще, если свойство не имеет методов-акцессоров, то обращаться к полю или сасому свойству - без разницы и дело вкуса. Не совсем так. Я слышал, что ежели мы собираемся серилизовывать объект, то свойства необходимы. Причем в секции published -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Они удаляются автоматически при освобождении объекта.
А что же его освобождает окромя деструктора? Это сообщение отредактировал(а) PsiMagistr - 12.5.2011, 13:47 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |