![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Ребята, работе проги это не мешает, но получаю такой варнинг:
[DCC Warning] Unit1.pas(118): W1057 Implicit string cast from 'ShortString' to 'string' Впринципе я знаю, что это, но вот как можно от этого избавиться? -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Amphiluke |
|
|||
![]() ☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 6 Всего: 112 |
||||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
http://www.transl-gunsmoker.ru/2009/09/pchars.html#d2009
Короткие строки оставлены для обратной совместимости пятнадцать лет назад. Иными словами, их нужно было перестать использовать ещё пятнадцать лет назад. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
CodeMonkey, они попадаются в system.pas (правда переосмысленные в utf8)
-------------------- Обижено школьников: 8 |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Ни за что! Они так удобны для использования в записях. P.S. К тому же и сам Борланд до сих пор ими пользуется, имхо. Иначе откуда ограничение в редакторе IDE на количество букв в строке pas-файла ![]() -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
у меня для тебя плохие новости
Добавлено через 1 минуту и 44 секунды
-------------------- Обижено школьников: 8 |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Это какие? "в этом коротком литерале могут быть unicode-символы" - эти что ли? Оставляю за строкой неправильное упоминание термина литерал. Что IDE Delphi уже умеет в своём редакторе вставлять в текст исходника unicode-символ? Или она научилась понимать такой символ в строке pas-файла. Ты уж уточни, пожалуйста. ![]() -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Бедные азиатские пользователи ваших программ... ...а также программисты других языков (которым придётся ручками писать функции обработки этих строк). То-то и оно, что пользуется он ими только по соображениям совместимости. И, как заметил bems, часто это не чистый ShortString. Они туда пихают UTF-8, чтобы компенсировать ограничения ShortString - откуда и лезет целый ворох проблем. Я бы предпочёл, чтобы они это выкинули на помойку (раз отладить до сих пор не могут) и сделали бы как надо.
Unicode в редакторе и .pas файлах поддерживается начиная с D2005. Unicode-идентификаторы - с D2009. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Ну увы им, этим азиатским пользователям. Так я и не рассчитываю на их рынок.
А вот это для меня новость. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Я бы тоже много чего предпочёл изменить в своих ранних, но до сих пор поддерживаемых проектах. Но "где деньги, Зин"? -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
PsiMagistr |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Ребята, вкратце
Для чего мне это нужно?
Это будет писаться в файл. Вот так:
Если не будет ограничения длины, не видать нам записи в файл... Это сообщение отредактировал(а) PsiMagistr - 8.5.2011, 08:33 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
||||
|
|||||
bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
![]() нет, ты не оставляй. Ты мне скажи что не правильно, потому что иначе я буду считать что ты не знаешь где именно имеет место ограничение в 255 символов
Разумеется. С разморозкой Вас ![]() Добавлено через 3 минуты и 50 секунд PsiMagistr, с ограничением по длине это уже ShortString а он единственный строковой тип, который не указатель. А писать указатель в файл не очень хорошая идея. Можно конечно и нормальные строки писать в файл, но там нужно чуточку больше телодвижений (которые впрочем можно возложить на rtl/vcl) -------------------- Обижено школьников: 8 |
||||
|
|||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
bems, Развивайте мысль!
![]() Возложите, плиз. У меня не строки. В том то и дело. Записи у меня, со строковыми вкраплениями. Их и надо писать в файл. Если вам удастся обойти ShortString без лишних телодвижений ![]() -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
PsiMagistr, не, просто записать весь рекор одним махом не выйдет. а так вообще вот статейка
http://www.rsdn.ru/article/delphi/serialization.xml -------------------- Обижено школьников: 8 |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Вообще забавная задача...
ЗАДАЧА: Записать в файл некоторый рекорд со строковыми вкраплениями произвольной длины. Ясно, что никакой шортстринг не прокатэ ))) Нужен чистый Стринг. Поднимать для этого дела серилизацию объектов? Круто. И что будем делать, Штирлиц? Это сообщение отредактировал(а) PsiMagistr - 8.5.2011, 08:45 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
пиши каждое строковое поле отдельно. Для каждой строки пиши сначала её длину, а потом собственно символьные данные.
-------------------- Обижено школьников: 8 |
|||
|
||||
CodeMonkey |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
А чего, собственно, её поднимать? Она и так есть. По умолчанию. Достаточно
заменить на:
И всё. И мы можем сохранять/загружать такой объект одной строчкой. Ежели это всё равно кажется чем-то неудобным, то: http://www.delphikingdom.ru/asp/viewitem.a...talogid=1206#06 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
||||
|
|||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Немного разобрался. Наследовал, правда не от TPersistent, а от TComponent
и тогда FileStream.WriteComponent(объект) Но записей можно хоть целую кучу в одном файле хранить и далее смещая файловый курсор-указатель (Seek) на длину (SizeOf(Record) записи, находить нужную. А как с объектами быть? Если мне их надо в одной пачке хранить. У меня по файлу с пачками записей образуется динам. массив записей. В нем столько ячеек, сколько записей в файле. Они туда все считываются. Но количество записей я рассчитать могу (Общая длинаФайла, деленная на длину 1 записи) А с пачкой объектных данных как быть? Заранее спасибо. Это сообщение отредактировал(а) PsiMagistr - 8.5.2011, 18:38 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Отвечать на форуме считаю неправильным решением. Отвечать в личке? -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
northener, пиши тут
-------------------- Обижено школьников: 8 |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Ну так и быть - пишу тут. Вот вы произнесли/сказали - "короткий литерал" в сообщении от 7.5.2011, 13:54. А что значит этот термин "короткий литерал"? Я такого термина не знаю. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Есть несколько подходов. Самый грамотный - набор объектов должен загружать/сохранять объект контейнер. Совсем простой вариант - так же, как и с "пачками записей". Пишем объекты друг за другом в один поток. При чтении - читаем, пока не конец потока. В середине между двумя способами есть куча промежуточных вариантов. К примеру, можно в начало потока записать количество записей. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Давайте забудем об объектах. Автору объекты как таковые не нужны. Так он считает и я с ним согласен. Ведь он что хочет - записывать записи в файл и потом считывать их из файла. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Я говорил что 255 символов это ограничение на длину строкового литерала в дельфи (собственно поэтому я и назвал их короткими), а не на длину строки, как говорил ты. -------------------- Обижено школьников: 8 |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Хм. Давай всё же перейдём в личку. И там спокойно, со временем, разберёмся что, кто и когда говорил. Ибо я никогда не говорил ту ересь, которую ты мне приписываешь. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Говорил. Вот тут ты говоришь что речь идет именно о термине "литерал"
Не нужно. Есть предложение просто закрыть эту тему -------------------- Обижено школьников: 8 |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Кстати ребята,
Вот создал я объект на основе другого объекта. Добавил новые поля. Забаррикадировал поля свойствами. Нужно ли мне переписывать деструктор? Ведь если я воспользуюсь стандартным (присущим объекту родителю) то новые поля не будут уничтожены. Ведь старый деструктор ничего не знает о добавленных полях. И Если я должен переработать деструктор, что я туда должен записать? Как уничтожить поля? -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Тяжела ты шапка программиста.
Имеется массив Mass, содержащий объекты с разными данными, но все естественно одинакового класса. Пытаюсь записать массив в файл.
Имею файл. В файле (хвала Рандому столько объектов сколько ячеек в массиве. И О УЖАС - во всех объектах одинаковые данные!) Вот этот файл. Отчетливо видно два экземпляра. А вот данные одни и те же... object Persones Name = 'Olya' Sirname = 'fdfd' Family = 'fdf' end object Persones Name = 'Olya' Sirname = 'fdfd' Family = 'fdf' end -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Нечто похожее обсуждается здесь.
http://forum.delphiexpert.ru/index.php?topic=1550.0 Фишка в том, что у меня если надо один объект в файл засейвить, то он худо-бедно сериализуется. А если много в один и тот же файл (Массив объектов и цикл соответственно) - полный обломейшн. Но не под каждый же объект свой файл заводить? Это ж сколько файлофф будет? -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Neobrat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.8.2007 Репутация: нет Всего: нет |
Implicit string cast from 'ShortString' to 'string' читайте как Implicit string cast from 'AnsiString' to 'string' с вытекающими отсюда последствиями так как ShortString как был массив из AnsiChar так и остался. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Neobrat, я понял. спс.
Чумная вещь эта сериализация. С массивами объектов происходит жестяная штука. Сохраняется первый элемент массива и хоть кол теши. Причем в файле имею Кучу записей. И все заполнены первым элементом. Хотя массив содержит разные данные (тестировано). Это сообщение отредактировал(а) PsiMagistr - 10.5.2011, 14:10 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Neobrat |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.8.2007 Репутация: нет Всего: нет |
Зачем? не проще..
код
работает. Ищите ошибки в своем коде. Зачем Вы приминаете сериализацию не совсем ясно. Это сообщение отредактировал(а) Neobrat - 10.5.2011, 14:46 |
||||||||
|
|||||||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Neobrat, WriteComponent из той же оперы
-------------------- Обижено школьников: 8 |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Надо данные объекта сохранить. Но объекты в массиве. В динамическом массиве. И считываться должны в массив.
Это сообщение отредактировал(а) PsiMagistr - 10.5.2011, 14:50 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
На пальцах: сериализация в Delphi осуществляется на базе TPersistent, TComponent и TCollection.
TPersistent - это базовый класс, который можно сериализировать. Единственная проблема с ним в том, что по умолчанию его сериализирует TComponent. Сам TPersistent себя сериализировать не может. Это, впрочем, можно легко исправить. Поэтому, главный сериализируемый класс в варианте по умолчанию - TComponent. Далее, наборы из объектов сериализируются как составная часть объекта-контейнера. Таковыми (опять же, по умолчанию) в Delphi выступают TComponent и TCollection. Соответственно, для того, чтобы сериализовать массив из 3-х TComponent, их надо добавить в четвёртый TComponent, который будет контейнером, и сериализовать уже его. Обо всём остальном позаботится TComponent. Либо же, мы можем использовать TCollection и добавить 3 объекта в неё. И она нам всё засериализует. Это грубо, но наглядно. К сожалению, на руках у меня демки с TComponent и TCollection нет, а разбираться в вашем коде - нет времени, но вот здесь можно посмотреть пример сериализации одного объекта TPersistent и набора из трёх объектов TPersistent. Думаю, что это ещё лучше, чем TComponent и TCollection. Эта демка сохраняет и загружает один объект и коллекцию в бинарном и текстовом виде. Вот пример сохранения одного объекта в текстовом виде:
Вот пример сохранения коллекции в текстовом виде:
Это сообщение отредактировал(а) CodeMonkey - 10.5.2011, 15:02 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
||||
|
|||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Neobrat, и какая разница:
Добавлено через 3 минуты и 29 секунд CodeMonkey, весьма благоДарен. Т.е. как я понимаю, засерилизовыать массив без применения TCollection или объекта-контейнера не получится? -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Neobrat |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.8.2007 Репутация: нет Всего: нет |
"Зачем Вы приминаете сериализацию не совсем ясно. " Возможно не совсем правильно выразился. Какие предпосылки вынуждают использовать сериализацию? "Надо данные объекта сохранить. Но объекты в массиве. В динамическом массиве. И считываться должны в массив." Смотря что за объекты, что за данные и для каких целей. Лично мой взгляд, если нужны просто данные, то использовать рекорды. если используются объекты VCL, то встроенную сериализацию. если собственные объекты, то а) пишется своя реализация сериализации, а по русски говоря дописывается две функции LoadFile SaveFile, а так же объект "загрузчик" которые следит за целостностью файла и т.д. и т.п. б) используется XML у всех есть свои плюсы и минусы, которые я не вижу смысла обсуждать, каждый решает сам. в вашей же задачи я не вижу смысла использовать встроенную сериализацию, так как из обычной записи(читай набора байт) создаете VCL-ый объект. Добавлено через 5 минут и 48 секунд
мм.. не в ту сторону смотрите. чуток оптимизировал ваш код просто. |
||||||
|
|||||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Neobrat,
Вкратце Для чего это нужно: Записываются характеристики игрового персонажа. Персонаж скорее всего будет объектом. Так логичнее. Отсюда и сериализация И в чем оптимизация между FileStream.WriteComponent и MemoryStream.WriteComponent -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Neobrat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.8.2007 Репутация: нет Всего: нет |
по поводу оптимизации, опять же не туда смотрите.. избавились от лишнего стрима и посмотри код ObjectBinaryToText, оно вам надо? вопрос есть ли свойство у персонажа, которое не доступно для записи, но доступно на чтение, которое необходимо сохранять и подгружать? если есть, то попробуйте со стандартной сериализацией это провернуть. лично я скорее всего сделал бы "Загрузчик" и добавил две функции к персанажу LoadFile SaveFile либо стал бы использовать xml Это сообщение отредактировал(а) Neobrat - 10.5.2011, 15:39 |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
ObjectBinaryToText, оно вам надо? Желательно. Чтобы можно было редактировать в обычном блокноте.
вопрос есть ли свойство у персонажа, которое не доступно для записи, но доступно на чтение, которое необходимо сохранять и подгружать? Нет. если есть, то попробуйте со стандартной сериализацией это провернуть. лично я скорее всего сделал бы "Загрузчик" и добавил две функции к персанажу LoadFile SaveFile Я тоже так хочу. либо стал бы использовать xml что есть XML и с чем го кушать. Добавлено @ 15:51 Почему отказался от рекордов: При записи строковых переменных переменной длины (они у меня входят в рекорд) возникают траблы. Добро пожаловать в ShortString
Это сообщение отредактировал(а) MetalFan - 13.5.2011, 18:52 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Neobrat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.8.2007 Репутация: нет Всего: нет |
по поводу xml, google в помощь. как раз там и сможете редактировать свойства и поддерживать версионость.
"Почему отказался от рекордов: При записи строковых переменных переменной длины (они у меня входят в рекорд) возникают траблы. Добро пожаловать в ShortString" 1. Признайтесь себе лично, реально ли у вас будут данные длиннее 255, из за чего вы не можете использовать ShortString; 2. Посмотрите куда смотрит указатель строки string и ShortString а так же посмотрите где лежит реальное начало строки, думаю поймете от куда грабли растут почему рекорды с обычным string не сохраняться.
3. если уж вам все таки надо использовать string с переменой длиной, то так как вы все равно делаете в объекте то в SaveFile пишите сначала длину строки а потом саму строку, ну и при загрузке наоборот сначала читаете длину, подготавливаете строку SetLength, или GetMem и т.п., и читаете саму строку |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Признайтесь себе лично, реально ли у вас будут данные длиннее 255
Дело совсем-совсем не в этом. Если они будут меньше 255, в файле будут барахтаться пустышки Это сообщение отредактировал(а) PsiMagistr - 10.5.2011, 16:29 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
мы помним что разговор начинался с того чтобы не делать этого вручную? ![]() -------------------- Обижено школьников: 8 |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
bems, именно так.
Добавлено через 5 минут и 15 секунд если уж вам все таки надо использовать string с переменой длиной, то так как вы все равно делаете в объекте Если я делаю в объекте, то долой рекорд и да здравствует сериализация! -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Neobrat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.8.2007 Репутация: нет Всего: нет |
мда.. ну и задачу вы себе выбрали..
не хотим что бы были пустышки и не хотим делать ручками.. кроме как пожелать вам удачи не чем помочь не могу. ) посмотрите в сторону IniFile может поможет ))))) |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
что нереального в задаче? сериализация потомков TPersistent нормально справляется
-------------------- Обижено школьников: 8 |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Я не говорю, что она плохо справляется.
Но мне необходима инфа по сериализации отдельных объектов и коллекций. Т.к. я в этом деле совсем зеленый. -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Я не понял: а чего с моей демкой не так?
Всё, что там надо сделать - наследовать объект от TPersistent. Остальное сделает встроенный механизм сериализации. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Neobrat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.8.2007 Репутация: нет Всего: нет |
я не спорю. справляется. но это примерно как стрелять пушкой по воробьям. цель достигнута, а какими средствами не важно)) ухожу из темы. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
нет, совершенно целевое использование
-------------------- Обижено школьников: 8 |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
CodeMonkey,
Все так. Демку анализирую. Будут вопросы. Добавлено через 3 минуты и 17 секунд CodeMonkey, Кстати, какой объект избрать контейнером? Форму? Она запишет много чего лишнего. Создавать спецобъект-пустышку без свойств и полей, только ради контейнера? -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Объект-контейнер, конечно же, не обязателен - это просто удобно, потому что он почти всё сделает сам.
Что точно не нужно делать: - Пытаться притянуть существующий объект, не связанный с вашими данными (форму). - Относиться к контейнеру как к пустышке. По последнему: ведь у вас в программе будет куча действий по управлению списоком, поиска по нему, ещё что-то. Вместо того, чтобы размазывать эти действия по программе - почему бы не внести их в класс-контейнер. Пример: http://programmersforum.ru/showthread.php?...6354#post796354 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
CodeMonkey, если это будет коллекция, то ему нужно наследоваться от TCollectionItem, а оно вроде как слишком для этой задачи - менять иерархию. Хотя он уже раз поменял, и ничего...
-------------------- Обижено школьников: 8 |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
-------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Слово коллекция я употребляю как "набор объектов". Когда я имею в виду TCollection - я так и говорю: TCollection. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Во, наткнулся на текст: http://delphikingdom.ru/asp/viewitem.asp?catalogid=1426
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
CodeMonkey,
Чтоб я в этом да что-то понимал. ![]() Сериализовал, сериализовал. Не выходит. А ежели объект наследовать от формы - выходит. Но от формы не годится, форма и свои свойства запишет. Интересно, как от Persistent записывать, если из методов только Write--ReadComponent, куда только от класса TComponent передать можно? Чудеса в решете. -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Ёлки-палки, я вам две демки на это дал, как это делать и использовать. Одну - свою (в том сообщении - ссылка на ZIP архив с демкой. Пропустили?), вторую - чужую. Добавлено через 2 минуты и 22 секунды В чём проблема-то возникает? -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 15:14 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
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 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Integer и вовсе не динамический тип. Он уйдёт вместе с объектом. Объекты грубо можно считать расширенными записями. Вы же не удаляете в записи каждое Integer поле индивидуально? Вот ежели вы GetMem-ом выделите память и сохраните в указателе-поле объекта - вот это другое дело.
В одну кучу не нужно смешивать: "наличие/отсутствие свойства" и "если свойство есть, то с чем работать: с полем или свойством". Оригинальный вопрос звучал так: Здесь нет ни слова про "необходимость" или "обходимость" свойств. Вопрос про то, можно ли обращаться к свойствам из конструктора. На этот вопрос я и отвечал. Магия компилятора. Если вы посмотрите на деструктор TObject (базовый объект, который является предком любого класса в Delphi), то увидите, что его деструктор пуст, ничего не делает вовсе. В Delphi выделение и освобождение памяти под объект занимается магия компилятора. Конструктор и деструктор являются инициализаторами и чистильщиками. При этом под объект память всегда выделяется обнулённая, а при её освобождении учитываются все автоматические типы (вроде строк, интерфейсов, вариантов и т.п.). Тут надо понимать, что за исключением полей, имеющих тип автоматических типов данных, при этом не происходит индивидуальной работы с полями. Выделение и освобождение памяти происходит одним махом, на все поля сразу. Технически, на уровне ассемблера - таки да, эту работу выполняет конструктор и деструктор. Но на уровне языка ВУ это так не выглядит. Это сообщение отредактировал(а) CodeMonkey - 12.5.2011, 19:29 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
||||
|
|||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 12 Всего: 20 |
Это стоило бы выделить жирным шрифтом. Имхо. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Ребята,
Решаю продолжить свои зеленые вопросы по ООП. А то из-за плохого знания предмета, выйдет сплошная сериализация сюрреализация. Да и продираться сквозь материал надо. Материал тяжелый для (моего) понимания, а на вооружении у меня только книги. Сердечно благодарю CodeMonkey и всех остальных откликающихся. Итак: 1) Верно ли что для перекрытия родительского метода в классе-потомке используется директива override тогда и только тогда, когда Метод потомка не только имеет одинаковое имя, но и одинаковый набор параметров, передаваемых в метод? Т.е. процедура является полным близнецом. Если набор параметров различен, ничего делать не нужно? 2) overload пишется тогда, когда мы хотим использовать два разных метода с одинаковыми именами, разным набором параметров и расположенных на одном иерархическом уровне. Если на разных, то это связь предок-потомок и нужен override[B] для перекрытия родительского (сам родительский при этом объявим виртуальным). 3) В чем разница между [b]overload и reitroduce. Не могу уловить, хоть ты разбейся. ))) 4) Верно ли утверждение, что деструкторы пишутся если в работе класса каким либо образом участвуют др. объекты? Т.е. в основном, чтобы их (эти другие) гасить. Например какое-либо поле определенно объектом. Или внутри метода объявлена переменная-указатель-на-объект? Много ли вообще существует НЕ-автофинализируемых типов? Я знаю что даже динам-массивы магия компилятора освобождает. Давеча попалась на глаза книга "Искусство создания компонентов Дельфи". Некто Валерий Фаронов. Утверждение там такое (цитата): "Методы класса не должны обращаться к полям, так как в общем случае они вызываются без (!) создания объекта, а следовательно в момент вызова полей просто не существует"... Постойте, как это методы не должны обращаться к полям? Они же только и делают, что обращаются. Иначе зачем они вообще нужны, если не для работы над полями? Лично я пока только один метод знаю, который способен вне объекта вызываться - constructor. Это сообщение отредактировал(а) PsiMagistr - 13.5.2011, 09:42 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Такой вопрос еще. Создал я класс - потомок от некоего класса. У того некоторый метод. Мне от него ни холодно, ни жарко и я пишу свой с тем же именем но с др набором параметрофф.
Теперь у моего класса два метода от предка и собственный. Я так понял надо overload своему методу писать, если хочу в проге оба метода использовать? А если только один хочу, свой собственный, то не надо... Так я понимаю. -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Очень любопытно. Выходит конструктор TObject НЕвиртуален.
Это сообщение отредактировал(а) PsiMagistr - 13.5.2011, 10:38 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
||||||||||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Рекомендую к прочтениею: http://www.delphikingdom.ru/lyceum/seminar.asp?ID=6
Нет. Директива override используется для введения новой версии виртуального метода. И, таки да, если это происходит, прототип должен полностью совпадать. А для простого перекрытия override не нужен - просто пишем новый метод. Да. И это применимо не только к методам, но и обычным процедурам, например:
Он может, но вовсе не обязан быть виртуальным. Соответственно, override будет указываться или нет, смотря по тому, что мы в итоге решим.
overload с reitroduce не связан никак, а вот override и reitroduce - понятия близкие. override "продолжает" цепочку наследования, вводя новый вариант виртуального метода. reitroduce "прерывает" цепочку наследования, "замещает" метод, вводя новый, который никак не связан с унаследованным виртуальным. reitroduce используется очень редко и только в одном случае: у тебя в предке есть виртуальный метод, но в твоём классе и любых его наследниках этот метод не нужен. Но зато у тебя есть потребность создать новый метод, который было бы очень удобно назвать так же, как и тот унаследованный виртуальный. Вот и вводишь ты метод и пишешь reintroduce. Иногда использование reitroduce говорит о допущенных ошибках при проектировании иерархии. Деструктор нужен когда ему есть что делать. Удалить поле объекта. Раз-регистрировать элемент из его контейнера при удалении. Закрыть открытый объектом файл. И т.п. В остальных случаях деструктор не нужен. К автофинализируемым типам в Delphi очевидным образом относятся все статические (просто потому, что они не нуждаются в финализации): Integer, записи и т.п., а кроме них: строки (String, AnsiString, UnicodeString, WideString), интерфейсы (IInterface, IDispatch, да и вообще любые), динамические массивы, варианты (Variant и OleVariant). Вроде, никого не забыл. Все прочие типы к таковым не относятся. К примеру, объекты, динамически выделенная память (GetMem, AllocMem, New). Но даже если память освобождается - автоматом это не значит, что делать нечего. К примеру, твой Integer может быть описателем открытого через CreateFile файла - и тогда в деструкторе файл надо закрыть. Вы путаете методы объекта и методы класса. Методы объекта - это:
Методы класса - это:
Не обязательно. Если ты хочешь сделать два метода доступными - то надо оба их объявить с overload. Если унаследованный объявлен без overload - надо в своём классе его продублировать с overload и вызвать унаследованный. Ну а в своём варианте делать что хочешь. Да.
По той простой причине, что вызываешь ты его через свой класс: [B]MyClass.Create.
Если ты вызываешь деструктор напрямую - то он может быть не виртуальным. И иногда (очень редко) так делают для хитрых целей. Но ты вызываешь деструктор через метод-обёртку Free, которая реализована у TObject. Т.е. если деструктор не виртуальный, то единственный деструктор, который сможет вызвать Free при любом раскладе будет деструктор TObject. В этом и смысл виртуальности: что при вызове из базового класса, используется метод потомка. Это сообщение отредактировал(а) CodeMonkey - 13.5.2011, 13:37 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
||||||||||||||||
|
|||||||||||||||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
CodeMonkey, Верно ли я понимаю, что деструктор оверрайдится практически всегда. Ведь Free, как правило принадлежит предку, а он должен вызывать новую версию деструктора.
-------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Да, всегда.
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Странное дело. Просто пытаюсь разобраться. Не лупите сильно, ладно?
![]() Создаю объект А. Владелец этого объекта (Owner) - форма. Объект класса TComponent Создаю объект Б. класс TComponent. Внимание - Владелец - объект А. Заполняю свойства объекта А. Заполняю свойства объекта Б. Открываю файл, записываю данные объекта А (WriteComponent) При записи объект А должен потянуть за собой и детище - объект Б. Тянет же за собою форма все остальные компоненты. Т.е. файл должен содержать и данные А, и данные Б. Не тут то было... При записи в файл вижу данные только объекта А. Это сообщение отредактировал(а) PsiMagistr - 16.5.2011, 12:34 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Как я уже говорил: навскидку с TComponent я не отвечу. Надо время, чтобы смотреть и разбираться. А его у меня нет.
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Понятно. Ничего страшного. Спасибо. Я пока сижу, с TPresistent
-------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Вот в чем оказывается дело:
Об ответственности за сериализацию Не пугайтесь названия этого раздела. Речь пойдёт всего лишь о том, как сделать так, чтобы компонент записывал вместе с собой в поток другие. Было бы ошибкой предполагать, что компонент сериализует то, чем он владеет. Владение и ответственность за сериализацию – это разные отношения, и по умолчанию компонент не сериализует вместе с собой ничего. Впрочем, в VCL есть два класса-наследника TComponent, которые сериализуют именно то, чем владеют: это TForm и TDataModule, и если посмотреть их исходный код, можно увидеть, что в них переопределён protected-метод TComponent.GetChildren. procedure GetChildren(Proc: TGetChildProc; Root: TComponent); dynamic; где type TGetChildProc = procedure (Child: TComponent) of object; GetChildren – переопределяемый метод, в классе TComponent он пуст. Он автоматически вызывается в тот момент, когда система сериализации хочет опросить компонент о том, какие ещё компоненты нужно сохранять. В свою очередь, те компоненты тоже будут опрошены, и т. д. В аргумент Root передаётся ссылка на компонент, для которого когда-то был запущен метод TStream.WriteComponent, и если мы пришли к сериализации данного компонента через один или несколько «каскадов», Root<>Self. В GetChildren от программиста требуется, чтобы он один или несколько раз вызвал Proc, указывая в качестве аргумента те компоненты, которые нужно сериализовать вместе с данным. Например, в классах TForm и TDataModule в GetChildren организуется цикл по элементам массива TComponent.Components: var I: Integer; OwnedComponent: TComponent; begin inherited GetChildren(Proc, Root); if Root = Self then for I := 0 to ComponentCount - 1 do begin OwnedComponent := Components[I]; if not OwnedComponent.HasParent then Proc(OwnedComponent); end; end; В методе же TCustomActionList.GetChildren имеется цикл по Action’ам, которые входят в данный ActionList. Как выглядит результат работы GetChildren в dfm-формате, мы уже видели: объект сохраняется как бы «внутри» того, который отвечает за его сериализацию. Так, на представленном выше фрагменте dfm-файла, Form1 отвечает за сериализацию Button1, Button2 и ActionList1, а ActionList1 – за сериализацию Action1 и Action2. Во время же загрузки из потока компонент может узнать о том, кто отвечал за его сериализацию, и предпринять соответствующие действия. Для этого надо переопределить метод procedure SetParentComponent(Value: TComponent); dynamic; Например, TAction таким образом при десериализации может зарегистрировать себя в сериализовавшем его ActionList’е. Сериализацию наладил, содрав код в котором смыслю мало что... Дело за десериализацией. -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |