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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конвертация строк 
:(
    Опции темы
PsiMagistr
Дата 6.5.2011, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Ребята, работе проги это не мешает, но получаю такой варнинг:


[DCC Warning] Unit1.pas(118): W1057 Implicit string cast from 'ShortString' to 'string' 

Впринципе я знаю, что это, но вот как можно от этого избавиться?





--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Amphiluke
Дата 6.5.2011, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 6
Всего: 112



1 минута в google.

Это сообщение отредактировал(а) Amphiluke - 6.5.2011, 19:56
PM   Вверх
CodeMonkey
Дата 7.5.2011, 10:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



http://www.transl-gunsmoker.ru/2009/09/pchars.html#d2009

Короткие строки оставлены для обратной совместимости пятнадцать лет назад. Иными словами, их нужно было перестать использовать ещё пятнадцать лет назад.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
bems
Дата 7.5.2011, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



CodeMonkey, они попадаются в system.pas (правда переосмысленные в utf8)


--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 7.5.2011, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(CodeMonkey @  7.5.2011,  10:54 Найти цитируемый пост)
Иными словами, их нужно было перестать использовать ещё пятнадцать лет назад. 

Ни за что! Они так удобны для использования в записях.
P.S.
К тому же и сам Борланд до сих пор ими пользуется, имхо. Иначе откуда ограничение в редакторе IDE на количество букв в строке pas-файла smile ?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 7.5.2011, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(northener @  7.5.2011,  13:47 Найти цитируемый пост)
К тому же и сам Борланд до сих пор ими пользуется
у меня для тебя плохие новости

Добавлено через 1 минуту и 44 секунды
Цитата(northener @  7.5.2011,  13:47 Найти цитируемый пост)
Иначе откуда ограничение в редакторе IDE на количество букв в строке pas-файла smile ? 
в этом коротком литерале могут быть unicode-символы



--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 8.5.2011, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(bems @  7.5.2011,  13:54 Найти цитируемый пост)
у меня для тебя плохие новости

Это какие?
"в этом коротком литерале могут быть unicode-символы" - эти что ли?

Оставляю за строкой неправильное упоминание термина литерал

Что IDE Delphi уже умеет в своём редакторе вставлять в текст исходника unicode-символ? Или она научилась понимать такой символ в строке pas-файла. Ты уж уточни, пожалуйста. smile



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
CodeMonkey
Дата 8.5.2011, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(northener @  7.5.2011,  14:47 Найти цитируемый пост)
Они так удобны для использования в записях.


Бедные азиатские пользователи ваших программ...

...а также программисты других языков (которым придётся ручками писать функции обработки этих строк).

Цитата(northener @  7.5.2011,  14:47 Найти цитируемый пост)
К тому же и сам Борланд до сих пор ими пользуется, имхо


То-то и оно, что пользуется он ими только по соображениям совместимости. И, как заметил bems, часто это не чистый ShortString. Они туда пихают UTF-8, чтобы компенсировать ограничения ShortString - откуда и лезет целый ворох проблем.

Я бы предпочёл, чтобы они это выкинули на помойку (раз отладить до сих пор не могут) и сделали бы как надо.

Цитата(northener @  8.5.2011,  02:44 Найти цитируемый пост)
Что IDE Delphi уже умеет в своём редакторе вставлять в текст исходника unicode-символ?


Unicode в редакторе и .pas файлах поддерживается начиная с D2005. Unicode-идентификаторы - с D2009.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
northener
Дата 8.5.2011, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(CodeMonkey @  8.5.2011,  02:01 Найти цитируемый пост)
Бедные азиатские пользователи ваших программ...

Ну увы им, этим азиатским пользователям. Так я и не рассчитываю на их рынок.

Цитата

Unicode в редакторе и .pas файлах поддерживается начиная с D2005

А вот это для меня новость.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
northener
Дата 8.5.2011, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(CodeMonkey @  8.5.2011,  02:01 Найти цитируемый пост)
Я бы предпочёл, чтобы они это выкинули на помойку

Я бы тоже много чего предпочёл изменить в своих ранних, но до сих пор поддерживаемых проектах. Но "где деньги, Зин"?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
PsiMagistr
Дата 8.5.2011, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Ребята, вкратце

Для чего мне это нужно?

Код

type
persones = packed record
Name:String[255];
SecondName:String[255];
FamilyName:String[255];
end;
 

Это будет писаться в файл. Вот так:

Код

var F:TFileStream;
Rec:Persones;

//Обработчик
begin
F:=Tfilestream.Create('FileName');
F.Write(Rec,SizeOf(rec));
F.Free;
end;
//Конец


Если не будет ограничения длины, не видать нам записи в файл...

Это сообщение отредактировал(а) PsiMagistr - 8.5.2011, 08:33


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
bems
Дата 8.5.2011, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(northener @  8.5.2011,  01:44 Найти цитируемый пост)
"в этом коротком литерале могут быть unicode-символы" - эти что ли?
нет, про фирму борланд smile

Цитата(northener @  8.5.2011,  01:44 Найти цитируемый пост)
Оставляю за строкой неправильное упоминание термина литерал. 
нет, ты не оставляй. Ты мне скажи что не правильно, потому что иначе я буду считать что ты не знаешь где именно имеет место ограничение в 255 символов

Цитата(northener @  8.5.2011,  01:44 Найти цитируемый пост)
Что IDE Delphi уже умеет в своём редакторе вставлять в текст исходника unicode-символ?
да, конечно

Цитата(northener @  8.5.2011,  01:44 Найти цитируемый пост)
Или она научилась понимать такой символ в строке pas-файла
Разумеется.
С разморозкой Вас smile

Добавлено через 3 минуты и 50 секунд
PsiMagistr, с ограничением по длине это уже ShortString а он единственный строковой тип, который не указатель. А писать указатель в файл не очень хорошая идея. Можно конечно и нормальные строки писать в файл, но там нужно чуточку больше телодвижений (которые впрочем можно возложить на rtl/vcl)


--------------------
Обижено школьников: 8
PM MAIL   Вверх
PsiMagistr
Дата 8.5.2011, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



bems,  Развивайте мысль! smile.

Возложите, плиз. У меня не строки. В том то и дело. Записи у меня, со строковыми вкраплениями. Их и надо писать в файл. Если вам удастся обойти ShortString без лишних телодвижений smile буду благода.




--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
bems
Дата 8.5.2011, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



PsiMagistr, не, просто записать весь рекор одним махом не выйдет. а так вообще вот статейка
http://www.rsdn.ru/article/delphi/serialization.xml


--------------------
Обижено школьников: 8
PM MAIL   Вверх
PsiMagistr
Дата 8.5.2011, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Вообще забавная задача...

ЗАДАЧА:

 Записать в файл некоторый рекорд со строковыми вкраплениями произвольной длины. Ясно, что никакой шортстринг не прокатэ )))

Нужен чистый Стринг.

Поднимать для этого дела серилизацию объектов? Круто.

И что будем делать, Штирлиц?

Это сообщение отредактировал(а) PsiMagistr - 8.5.2011, 08:45


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
bems
Дата 8.5.2011, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



пиши каждое строковое поле отдельно. Для каждой строки пиши сначала её длину, а потом собственно символьные данные.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
CodeMonkey
Дата 8.5.2011, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  8.5.2011,  09:40 Найти цитируемый пост)
Поднимать для этого дела серилизацию объектов? Круто.


А чего, собственно, её поднимать? Она и так есть. По умолчанию.

Достаточно
Код
type
  persones = packed record
    Name:String[255];
    SecondName:String[255];
    FamilyName:String[255];
    Age: Integer;
  end;

заменить на:
Код
type
  persones = class(TPersistent)
  private
    FName: String;
    FSecondName: String;
    FFamilyName: String;
    FAge: Integer;
  published
    property Name: String read FName write FName;
    property SecondName: String read FSecondName write FSecondName;
    property FamilyName: String read FFamilyName write FFamilyName;
    property Age: Integer read FAge write FAge;
  end;


И всё. И мы можем сохранять/загружать такой объект одной строчкой.

Ежели это всё равно кажется чем-то неудобным, то: http://www.delphikingdom.ru/asp/viewitem.a...talogid=1206#06


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 8.5.2011, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Немного разобрался. Наследовал, правда не от TPersistent, а от TComponent

и тогда


 FileStream.WriteComponent(объект)

Но записей можно хоть целую кучу в одном файле хранить и далее смещая файловый курсор-указатель (Seek) на длину (SizeOf(Record)

записи, находить нужную.

А как с объектами быть? Если мне их надо в одной пачке хранить. 

У меня по файлу с пачками записей образуется динам. массив записей. В нем столько ячеек, сколько записей в файле. Они туда все считываются. Но количество записей я рассчитать могу (Общая длинаФайла, деленная на длину 1 записи)

А с пачкой объектных данных как быть?

Заранее спасибо.

Это сообщение отредактировал(а) PsiMagistr - 8.5.2011, 18:38


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
northener
Дата 9.5.2011, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(bems @  8.5.2011,  08:18 Найти цитируемый пост)
нет, ты не оставляй. Ты мне скажи что не правильно, потому что иначе я буду считать

Отвечать на форуме считаю неправильным решением. Отвечать в личке?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 9.5.2011, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



northener, пиши тут


--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 10.5.2011, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(bems @  9.5.2011,  14:22 Найти цитируемый пост)
northener, пиши тут

Ну так и быть - пишу тут.
Вот вы произнесли/сказали - "короткий литерал" в сообщении от 7.5.2011, 13:54.
А что значит этот термин "короткий литерал"? Я такого термина не знаю. 


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
CodeMonkey
Дата 10.5.2011, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  8.5.2011,  19:37 Найти цитируемый пост)
А как с объектами быть? Если мне их надо в одной пачке хранить. 

У меня по файлу с пачками записей образуется динам. массив записей. В нем столько ячеек, сколько записей в файле. Они туда все считываются. Но количество записей я рассчитать могу (Общая длинаФайла, деленная на длину 1 записи)

А с пачкой объектных данных как быть?


Есть несколько подходов. Самый грамотный - набор объектов должен загружать/сохранять объект контейнер.

Совсем простой вариант - так же, как и с "пачками записей".

Пишем объекты друг за другом в один поток. При чтении - читаем, пока не конец потока.

В середине между двумя способами есть куча промежуточных вариантов. К примеру, можно в начало потока записать количество записей.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
northener
Дата 10.5.2011, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(CodeMonkey @  10.5.2011,  01:27 Найти цитируемый пост)
Есть несколько подходов. Самый грамотный - набор объектов должен загружать/сохранять объект контейнер.

Давайте забудем об объектах. Автору объекты как таковые  не нужны. Так он считает и я с ним согласен.
Ведь он что хочет - записывать записи в файл и потом считывать их из файла.



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 10.5.2011, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(northener @  10.5.2011,  01:17 Найти цитируемый пост)
А что значит этот термин "короткий литерал"? Я такого термина не знаю
Сначала ты говорил что я неправильно употребил термин литерал, а теперь говоришь что я говорю о несуществующем термине "короткий литерал"
Я говорил что 255 символов это ограничение на длину строкового литерала в дельфи (собственно поэтому я и назвал их короткими), а не на длину строки, как говорил ты.



--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 10.5.2011, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(bems @  10.5.2011,  02:16 Найти цитируемый пост)
Цитата(northener @  10.5.2011,  01:17 Найти цитируемый пост)
А что значит этот термин "короткий литерал"? Я такого термина не знаю
Сначала ты говорил что я неправильно употребил термин литерал, а теперь говоришь что я говорю о несуществующем термине "короткий литерал"
Я говорил что 255 символов это ограничение на длину строкового литерала в дельфи (собственно поэтому я и назвал их короткими), а не на длину строки, как говорил ты.


Хм. Давай всё же перейдём в личку. И там спокойно, со временем,  разберёмся что, кто и когда говорил. Ибо я никогда не говорил ту ересь, которую ты мне приписываешь.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 10.5.2011, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(northener @  10.5.2011,  02:27 Найти цитируемый пост)
я никогда не говорил ту ересь, которую ты мне приписываешь

Говорил.
Цитата(northener @  8.5.2011,  01:44 Найти цитируемый пост)
Оставляю за строкой неправильное упоминание термина литерал.
Вот тут ты говоришь что речь идет именно о термине "литерал"
Цитата(northener @  7.5.2011,  13:47 Найти цитируемый пост)
Иначе откуда ограничение в редакторе IDE на количество букв в строке pas-файла smile ?
А тут ты говоришь об ограничении длины строки пас-файла в 255 символов, хотя такого ограничения нет (там кажется 1024 или что-то такое), а ограничение в 255 именно что на длину строкового литерала
Цитата(northener @  10.5.2011,  02:27 Найти цитируемый пост)
Давай всё же перейдём в личку
Не нужно. Есть предложение просто закрыть эту тему



--------------------
Обижено школьников: 8
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Кстати ребята,

Вот создал я объект на основе другого объекта.

Добавил новые поля. Забаррикадировал поля свойствами.

Нужно ли мне переписывать деструктор?

Ведь если я воспользуюсь стандартным (присущим объекту родителю) то новые поля не будут уничтожены. Ведь старый деструктор ничего не знает о добавленных полях.

И

Если я должен переработать деструктор, что я туда должен записать? Как уничтожить поля?


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Тяжела ты шапка программиста.



Имеется массив Mass, содержащий объекты с разными данными, но все естественно одинакового класса. 

Пытаюсь записать массив в файл.

Код

procedure TForm1.Button3Click(Sender: TObject);
var i:Integer; F:TFileStream; M:TMemoryStream;
begin
M:=TMemoryStream.Create;
 F:=TFileStream.Create(ExtractFilePath(Application.ExeName)+ 'ПроБА',fmCreate);
 for i := 0 to high(Mass) do
  begin
  M.WriteComponent(Mass[i]);
  M.Position:=0;
  ObjectBinaryToText(M,F);
  end;
  M.Free;
  F.Free;
 end;



Имею файл. В файле (хвала Рандому столько объектов сколько ячеек в массиве. И О УЖАС - во всех объектах одинаковые данные!)

Вот этот файл. Отчетливо видно два экземпляра. А вот данные одни и те же...

object Persones
  Name = 'Olya'
  Sirname = 'fdfd'
  Family = 'fdf'
end
object Persones
  Name = 'Olya'
  Sirname = 'fdfd'
  Family = 'fdf'
end






--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Нечто похожее обсуждается здесь.

http://forum.delphiexpert.ru/index.php?topic=1550.0


Фишка в том, что у меня если надо один объект в файл засейвить, то он худо-бедно сериализуется. А если много в один и тот же файл (Массив объектов и цикл соответственно) - полный обломейшн.

Но не под каждый же объект свой файл заводить? Это ж сколько файлофф  будет?


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Neobrat
Дата 10.5.2011, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.8.2007

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



Цитата(PsiMagistr @ 6.5.2011,  17:11)
Ребята, работе проги это не мешает, но получаю такой варнинг:


[DCC Warning] Unit1.pas(118): W1057 Implicit string cast from 'ShortString' to 'string' 

Впринципе я знаю, что это, но вот как можно от этого избавиться?


Implicit string cast from 'ShortString' to 'string' 
 читайте как
Implicit string cast from 'AnsiString' to 'string'
  с вытекающими отсюда последствиями

так как ShortString как был массив из AnsiChar так и остался.
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Neobrat, я понял. спс.


Чумная вещь эта сериализация. С массивами объектов происходит жестяная штука. Сохраняется первый элемент массива и хоть кол теши.

Причем в файле имею 

Кучу записей.  И все заполнены первым элементом. Хотя массив содержит разные данные (тестировано).


Это сообщение отредактировал(а) PsiMagistr - 10.5.2011, 14:10


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Neobrat
Дата 10.5.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.8.2007

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



Цитата(PsiMagistr @ 10.5.2011,  10:25)
Код

procedure TForm1.Button3Click(Sender: TObject);
var i:Integer; F:TFileStream; M:TMemoryStream;
begin
M:=TMemoryStream.Create;
 F:=TFileStream.Create(ExtractFilePath(Application.ExeName)+ 'ПроБА',fmCreate);
 for i := 0 to high(Mass) do
  begin
  M.WriteComponent(Mass[i]);
  M.Position:=0;
  ObjectBinaryToText(M,F);
  end;
  M.Free;
  F.Free;
 end;




Зачем? не проще..
Код

procedure TForm1.Button3Click(Sender: TObject);
var i:Integer; M:TMemoryStream;
begin
M:=TMemoryStream.Create;
try
 for i := 0 to high(Mass) do
    M.WriteComponent(Mass[i]);

  M.SaveToFile(ExtractFilePath(Application.ExeName)+ 'ПроБА',fmCreate);
finally
  M.Free;
end;


код
Код

  xBtn: TButton;
  xID: Integer;
  xMem: TMemoryStream;
begin
  xMem := TMemoryStream.Create;
  try
  for xID := 0 to 10 do
    begin
    xBtn := TButton.Create(nil);
    xBtn.Caption := IntToStr(xID);
    xBtn.Name := 'MyButton'+IntToStr(xID);
    xMem.WriteComponent(xBtn);
    end;
    xMem.SaveToFile('C:/Test.txt');
  finally
    xMem.Free;
  end;

работает. 
Ищите ошибки в своем коде.
Зачем Вы приминаете сериализацию не совсем ясно. 

Это сообщение отредактировал(а) Neobrat - 10.5.2011, 14:46
PM MAIL   Вверх
bems
Дата 10.5.2011, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Neobrat, WriteComponent из той же оперы


--------------------
Обижено школьников: 8
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Надо данные объекта сохранить. Но объекты в массиве. В динамическом массиве. И считываться должны в массив.

Это сообщение отредактировал(а) PsiMagistr - 10.5.2011, 14:50


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 10.5.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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.

Эта демка сохраняет и загружает один объект и коллекцию в бинарном и текстовом виде.

Вот пример сохранения одного объекта в текстовом виде:
Код
object TTestObject
  Str = 'Predator'#39's crew ready to roll'
  Int = 42
end


Вот пример сохранения коллекции в текстовом виде:
Код
object TTestObjectCollection
  Items = <
    item
      Str = 'There is no cow level'
      Int = 5
    end
    item
      Str = 'Predator'#39's crew ready to roll'
      Int = 42
    end
    item
      Str = 'Size matters'
      Int = 999
    end>
end


Это сообщение отредактировал(а) CodeMonkey - 10.5.2011, 15:02


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 10.5.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Neobrat,  и какая разница:

Код

FileStream.WriteComponent

//Или

MemoryStream.WriteComponent 

//И потом

MemoryStream.SaveToFile('C:/Test.txt');


Добавлено через 3 минуты и 29 секунд
CodeMonkey, весьма благоДарен. Т.е. как я понимаю, засерилизовыать массив без применения  TCollection или объекта-контейнера не получится?


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Neobrat
Дата 10.5.2011, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.8.2007

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



Цитата(bems @ 10.5.2011,  12:46)
Neobrat, WriteComponent из той же оперы



"Зачем Вы приминаете сериализацию не совсем ясно. "

Возможно не совсем правильно выразился.

Какие предпосылки вынуждают использовать сериализацию?


"Надо данные объекта сохранить. Но объекты в массиве. В динамическом массиве. И считываться должны в массив."

Смотря что за объекты, что за данные и для каких целей.
Лично мой взгляд, 
  если нужны просто данные, то использовать рекорды.
  если используются объекты VCL, то встроенную сериализацию.
  если собственные объекты, то 
   а) пишется своя реализация сериализации, а по русски говоря дописывается две функции LoadFile SaveFile, а так же объект "загрузчик" которые следит за целостностью файла и т.д. и т.п.
   б) используется XML

у всех есть свои плюсы и минусы, которые я не вижу смысла обсуждать, каждый решает сам.
в вашей же задачи я не вижу смысла использовать встроенную сериализацию, так как из обычной записи(читай набора байт) создаете VCL-ый объект.

Добавлено через 5 минут и 48 секунд
Цитата(PsiMagistr @ 10.5.2011,  13:02)
Neobrat,  и какая разница:

Код

FileStream.WriteComponent

//Или

MemoryStream.WriteComponent 

//И потом

MemoryStream.SaveToFile('C:/Test.txt');

мм.. не в ту сторону смотрите. 
чуток оптимизировал ваш код просто.
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Neobrat

Вкратце

Для чего это нужно:

Записываются характеристики игрового персонажа.

Персонаж скорее всего будет объектом. Так логичнее.


Отсюда и сериализация


И в чем оптимизация между


FileStream.WriteComponent

и 

MemoryStream.WriteComponent 




--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Neobrat
Дата 10.5.2011, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.8.2007

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



Цитата(PsiMagistr @ 10.5.2011,  13:22)
Neobrat

Вкратце

Для чего это нужно:

Записываются характеристики игрового персонажа.

Персонаж скорее всего будет объектом. Так логичнее.


Отсюда и сериализация


И в чем оптимизация между


FileStream.WriteComponent

и 

MemoryStream.WriteComponent

по поводу оптимизации, опять же не туда смотрите..
избавились от лишнего стрима и посмотри код ObjectBinaryToText, оно вам надо?

вопрос есть ли свойство у персонажа, которое не доступно для записи, но доступно на чтение, которое необходимо сохранять и подгружать?
если есть, то попробуйте со стандартной сериализацией это провернуть.

лично я скорее всего сделал бы "Загрузчик" и добавил две функции к персанажу LoadFile SaveFile
либо стал бы использовать xml

Это сообщение отредактировал(а) Neobrat - 10.5.2011, 15:39
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



ObjectBinaryToText, оно вам надо? Желательно. Чтобы можно было редактировать в обычном блокноте.

вопрос есть ли свойство у персонажа, которое не доступно для записи, но доступно на чтение, которое необходимо сохранять и подгружать?

Нет.

если есть, то попробуйте со стандартной сериализацией это провернуть.

лично я скорее всего сделал бы "Загрузчик" и добавил две функции к персанажу LoadFile SaveFile

Я тоже так хочу. 

либо стал бы использовать xml

что есть XML и с чем го кушать.

Добавлено @ 15:51
Почему отказался от рекордов:

При записи строковых переменных переменной длины (они у меня входят в рекорд) возникают траблы.  Добро пожаловать в ShortString


 ! 
MetalFan
для цитирования есть кнопки "быстрая цитата" и тег [quоte][/quоte]


Это сообщение отредактировал(а) MetalFan - 13.5.2011, 18:52


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Neobrat
Дата 10.5.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.8.2007

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



по поводу xml, google в помощь. как раз там и сможете редактировать свойства и поддерживать версионость.

"Почему отказался от рекордов:

При записи строковых переменных переменной длины (они у меня входят в рекорд) возникают траблы.  Добро пожаловать в ShortString"

1. Признайтесь себе лично, реально ли у вас будут данные длиннее 255, из за чего вы не можете использовать ShortString;
2. Посмотрите куда смотрит указатель строки string и ShortString а так же посмотрите где лежит реальное начало строки, думаю поймете от куда грабли растут  почему рекорды с обычным string не сохраняться.
Код

var
  xStr: string;
  xStr2: ShortString;
begin
  xStr := 'Юникод';
  xStr2 := 'АНСИ';
  memReport.Lines.Add('     String:' + IntToStr(Integer(@xStr))+' Point'+IntToStr(Integer(@xStr[1])));
  memReport.Lines.Add('ShortString:' + IntToStr(Integer(@xStr2))+' Point'+IntToStr(Integer(@xStr2[1])));
end;

3. если уж вам все таки надо использовать string с переменой длиной, то так как вы все равно делаете в объекте то в SaveFile 
  пишите сначала длину строки а потом саму строку, ну и при загрузке наоборот сначала читаете длину, подготавливаете строку SetLength, или GetMem и т.п., и читаете саму строку
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Признайтесь себе лично, реально ли у вас будут данные длиннее 255

Дело совсем-совсем не в этом. 

Если они будут меньше 255, в файле будут барахтаться пустышки

Это сообщение отредактировал(а) PsiMagistr - 10.5.2011, 16:29


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
bems
Дата 10.5.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Neobrat @  10.5.2011,  16:12 Найти цитируемый пост)
пишите сначала длину строки а потом саму строку, ну и при загрузке наоборот сначала читаете длину, подготавливаете строку SetLength, или GetMem и т.п., и читаете саму строку 

мы помним что разговор начинался с того чтобы не делать этого вручную? smile


--------------------
Обижено школьников: 8
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



bems,  именно так.

Добавлено через 5 минут и 15 секунд
если уж вам все таки надо использовать string с переменой длиной, то так как вы все равно делаете в объекте 

Если я делаю в объекте, то долой рекорд и да здравствует сериализация!


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Neobrat
Дата 10.5.2011, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.8.2007

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



мда.. ну и задачу вы себе выбрали..
не хотим что бы были пустышки и не хотим делать ручками..

кроме как пожелать вам удачи не чем помочь не могу. )
посмотрите в сторону IniFile может поможет )))))

PM MAIL   Вверх
bems
Дата 10.5.2011, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



что нереального в задаче? сериализация потомков TPersistent нормально справляется


--------------------
Обижено школьников: 8
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Я не говорю, что она плохо справляется. 

Но мне необходима инфа по сериализации отдельных объектов и коллекций.


Т.к. я в этом деле совсем зеленый.




--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
bems
Дата 10.5.2011, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(PsiMagistr @  10.5.2011,  12:25 Найти цитируемый пост)
M.Position:=0;
ObjectBinaryToText(M,F);

а зачем тебе это?



--------------------
Обижено школьников: 8
PM MAIL   Вверх
CodeMonkey
Дата 10.5.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Я не понял: а чего с моей демкой не так?

Всё, что там надо сделать - наследовать объект от TPersistent. Остальное сделает встроенный механизм сериализации.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Neobrat
Дата 10.5.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.8.2007

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



Цитата(bems @ 10.5.2011,  14:45)
что нереального в задаче? сериализация потомков TPersistent нормально справляется

я не спорю. справляется.
но это примерно как стрелять пушкой по воробьям. цель достигнута, а какими средствами не важно))

ухожу из темы.
PM MAIL   Вверх
bems
Дата 10.5.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



нет, совершенно целевое использование


--------------------
Обижено школьников: 8
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



CodeMonkey

Все так. 

Демку анализирую.

Будут вопросы.

Добавлено через 3 минуты и 17 секунд
CodeMonkey
Кстати, какой объект избрать контейнером? Форму? Она запишет много чего лишнего. 


Создавать спецобъект-пустышку без свойств и полей, только ради контейнера? 




--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 10.5.2011, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Объект-контейнер, конечно же, не обязателен - это просто удобно, потому что он почти всё сделает сам. 

Что точно не нужно делать:
- Пытаться притянуть существующий объект, не связанный с вашими данными (форму).
- Относиться к контейнеру как к пустышке.

По последнему: ведь у вас в программе будет куча действий по управлению списоком, поиска по нему, ещё что-то. Вместо того, чтобы размазывать эти действия по программе - почему бы не внести их в класс-контейнер.

Пример: http://programmersforum.ru/showthread.php?...6354#post796354


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
bems
Дата 10.5.2011, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



CodeMonkey, если это будет коллекция, то ему нужно наследоваться от TCollectionItem, а оно вроде как слишком для этой задачи - менять иерархию. Хотя он уже раз поменял, и ничего...


--------------------
Обижено школьников: 8
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Код


Container=Class(TComponent)//Объект-контейнер
  private
  fName:string;
  published
  Property Name : String read fName write fName;
  End; //



  Persones=class(TComponent) // Объект-элемент
  private
  fName:String;
  fSir:String;
  published
  Property Name : String read fName write fName;
  Property Sir : String read fSir write fSir;
  end;//


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); //Обработчик
var M:TMemoryStream; C:Container; Pers:Persones;
begin
C := Container.Create(Form1);//Создаем объект контейнер владелец форма
C.Name:='Это контейнер';

Pers := Persones.Create(C);// Создаем  объект-элемент владелец контейнер.

Pers.Name:= 'Имя';
Pers.Sir := 'Отчество';

//Заполняем.

 M:=TMemoryStream.Create;
 M.WriteComponent(C);
 M.SaveToFile(ExtractFilePath(Application.ExeName)+ 'Запись.txt');//Вуаля?!
 M.Free;
 Pers.Free; //По идее должен уничтожитьтся само при уничтожении контейнера, но кто знает...
 C.Free;

 //Никаких тебе "вуаля". Не записалось ничего... ВЕРНЕЕ

 Записалось поле Name Контейнера.  И все собственно.

end;

end.




--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 10.5.2011, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(bems @  10.5.2011,  18:26 Найти цитируемый пост)
CodeMonkey, если это будет коллекция


Слово коллекция я употребляю как "набор объектов". Когда я имею в виду TCollection - я так и говорю: TCollection.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
CodeMonkey
Дата 11.5.2011, 04:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Во, наткнулся на текст: http://delphikingdom.ru/asp/viewitem.asp?catalogid=1426


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 11.5.2011, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



CodeMonkey

Чтоб я в этом да что-то понимал. smile

Сериализовал, сериализовал. Не выходит. А ежели объект наследовать от формы - выходит. Но от формы не годится, форма и свои свойства запишет. Интересно, как от Persistent записывать, если из методов только Write--ReadComponent, куда только от класса TComponent передать можно?

Чудеса в решете.


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 11.5.2011, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата
Интересно, как от Persistent записывать, если из методов только Write--ReadComponent, куда только от класса TComponent передать можно?


Ёлки-палки, я вам две демки на это дал, как это делать и использовать. Одну - свою (в том сообщении - ссылка на ZIP архив с демкой. Пропустили?), вторую - чужую.

Добавлено через 2 минуты и 22 секунды
В чём проблема-то возникает?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 11.5.2011, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Код

object TTestObjectCollection
  Items = < // Как понять эту фразу? =< чего?
    item
      Str = 'There is no cow level'
      Int = 5
    end
 



Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 15:14


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 11.5.2011, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Items 
это свойство Items объекта TTestObjectCollection. TTestObjectCollection - это контейнер из TTestObject. 

Items = 
"свойство равно"

Items = <>
"свойство равно пустому набору объектов"

Items = < объекты >
"свойство равно набору объектов"

Что тут необычного? Вот, вполне стандартный пример:
Код
  object HeaderControl1: THeaderControl
    Left = 0
    Top = 0
    Width = 552
    Height = 17
    Sections = <
      item
        ImageIndex = -1
        Text = '123'
        Width = 50
      end
      item
        ImageIndex = -1
        Text = '321'
        Width = 50
      end
      item
        ImageIndex = -1
        Text = '111'
        Width = 50
      end>
    ExplicitLeft = 200
    ExplicitTop = 312
    ExplicitWidth = 0
  end


Набор объектов - это коллекция. Используется для сохранения набора объеков, которые не являются компонентами.

Добавлено через 3 минуты и 50 секунд
Имеется в виду, что когда у тебя в контейнере - компоненты, то они сохраняются так:
Код
    object CategoryPanel1: TCategoryPanel
      Top = 0
      Caption = 'CategoryPanel1'
      TabOrder = 1
      object ProgressBar1: TProgressBar
        Left = 40
        Top = 56
        Width = 150
        Height = 21
        TabOrder = 0
      end
      object TrackBar1: TTrackBar
        Left = 40
        Top = 88
        Width = 150
        Height = 45
        TabOrder = 1
      end
    end

Но этот синтаксис не может быть использован для сохранения не компонентов - потому что у них нет Name. Поэтому используется другой синтаксис.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 11.5.2011, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



CodeMonkey

У Вас ангельское терпение. Спасибо.

Я первый раз с таким синтаксисом встретился.  стало быть

<> между  тегами набор объектов?


Сижу в демке, но 90 процентов кода не понимаю.



--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 11.5.2011, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  11.5.2011,  16:29 Найти цитируемый пост)
У Вас ангельское терпение. Спасибо.


Я не просто так это делаю, а с корыстной целью smile

По итогам я собираюсь написать очередную статью, где рассказать про сохранение/загрузку данных в файлы и потоки. И ответить на возникающие вопросы.


Цитата(PsiMagistr @  11.5.2011,  16:29 Найти цитируемый пост)
стало быть

<> между  тегами набор объектов?


Да. Каждый элемент заключён в item/end.

Цитата(PsiMagistr @  11.5.2011,  16:29 Найти цитируемый пост)
Сижу в демке, но 90 процентов кода не понимаю.


Тот код, что в .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++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 11.5.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



CodeMonkey

Ящик пива с меня. Холодного. 

Я кончено рискую ВАс замучить, но


object CategoryPanel1: TCategoryPanel

Вот например, никогда бы не подумал, что можно и так написать.

Всегда считал, что все создается через классы.


Код


End;

type

Obj =  class(TCategoryPanel)
.
.
.
.
End;


Дело в том, что толковых книг по концепции ООП вообще практически нет. А вопросов у меня куча мала...

Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 17:29


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 11.5.2011, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  11.5.2011,  18:27 Найти цитируемый пост)
Вот например, никогда бы не подумал, что можно и так написать.


Эээээ....  а вы отличаете .dfm и .pas файлы?

Вот у вас написано:

Код
type
  TForm1 = class(TForm) 
    Button1: TButton;
    Label1: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;


Вы что думаете это такое? Это - определение класса. Указана ли здесь информация о состоянии класса (т.е. "кнопка Button1 расположена по центру окна, которое имеет размеры 800x600")? Нет. Эта информация хранится отдельно - в .dfm файле. И загружается оттуда LoadFromStream (в моём примере: аналог - _ReadPersistent).

Вот в .dfm и написано:
Код
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 600
  ClientWidth = 800
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -13
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 120
  TextHeight = 16
  object Button1: TButton
    Left = 176
    Top = 120
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
  end
end

Это - не Паскаль. Это - не код. Это - не определение класса. Это - сохранённое состояние объекта в текстовой форме. Т.е. просто данные.

Да, сохранённые данные, несомненно, связаны с определением класса. Но это - разные вещи.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 11.5.2011, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Я понял.

В общем все реальные данные о состоянии вынесены в отдельный файл. 

Уфф. Продолжаю разбираться.

Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 18:11


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 11.5.2011, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 11.5.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Код

//Объявление конструктора.
constructor Create(const AStr: String = ''; const AInt: Integer = 0);




Почему везде употребляется служебное слово const? И что оно означает в данном конкретном случае. Если это передаваемый параметр, он ведь может изменяться? Т.е. ему нельзя быть const?

Разве недостаточно constructor Create(AStr: String; AInt: Integer);

Или const в данном случае означают те значения, которые будут переданы в поля, если конструктор вызван без параметров?

Object = TClass.Create; //Полям подставляются значения-константы. В нашем случае ' ' и 0

Вместо

Object  = TClass.Create(значение, значение); //Поля принимают введенные значения



Это сообщение отредактировал(а) PsiMagistr - 11.5.2011, 18:55


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 11.5.2011, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  11.5.2011,  19:31 Найти цитируемый пост)
 UnitDefaultPersFiler in '..\UnitDefaultPersFiler.pas',
  UnitPersistent in '..\UnitPersistent.pas';

Какие-то особые модули, идущие в комплекте?


Это PersistentDemo.zip\UnitDefaultPersFiler.pas и PersistentDemo.zip\UnitPersistent.pas. Лежат в каталоге выше от PersistentDemo.zip\Demo\ProjectDemo.dpr

В эти модули вынесен служебный код. Там находится реализация _WritePersistent и _ReadPersistent

Цитата(PsiMagistr @  11.5.2011,  19:31 Найти цитируемый пост)
Что означает символ подчеркивания в начале строки?


Ничего. Мне так захотелось. 

Цитата(PsiMagistr @  11.5.2011,  19:31 Найти цитируемый пост)
Передаваемые параметры.

ПРавильно ли я понимаю:

1) FS - файловый поток Указатель-объект, класса TFileStream

2) T - сам записываемый объект.


Прототип функции записан в UnitPersistent.pas. Его можно увидеть, если зажать Ctrl и щёлкнуть левой кнопкой мыши по _WritePersistent.

Вот:
Код
function _ReadPersistent(const AStream: TStream; const AInstance: TPersistent; const AReaderClass: TPersistentReaderClass = nil): TPersistent; overload;
function _ReadPersistent(const AStream: TStream; const AInstance: TPersistent; const AReader: TPersistentReader): TPersistent; overload;

procedure _WritePersistent(const AStream: TStream; const AInstance: TPersistent; const AWriterClass: TPersistentWriterClass = nil); overload;
procedure _WritePersistent(const AStream: TStream; const AInstance: TPersistent; const AWriter: TPersistentWriter); overload;


Цитата(PsiMagistr @  11.5.2011,  19:31 Найти цитируемый пост)
3) TDefaultTextWriter - хотелось бы уточнить что это? На параметр не похоже. Указание особого режима?


Это опциональный параметр. Указывает, какой сериализатор использовать при сохранении. По умолчанию сериализатор в Delphi гонит в двоичный формат TPF0.

Вы можете использовать другой сериализатор. Например, тот, который пишет в текстовой форме. Именно это и делает TDefaultTextWriter - пишет в стандартный текстовый формат Delphi. Так что вам не нужно вызывать ObjectBinaryToText.

Список доступных сериализаторов можно посмотреть в модуле UnitDefaultPersFiler.pas. Пока их всего 4: читалка/писалка в двоичный формат и читалка/писалка в текстовый формат.

Добавлено через 4 минуты и 22 секунды
Цитата(PsiMagistr @  11.5.2011,  19:47 Найти цитируемый пост)
Почему везде употребляется служебное слово const?


Потому что это хороший стиль.

Цитата(PsiMagistr @  11.5.2011,  19:47 Найти цитируемый пост)
И что оно означает в данном конкретном случае


Constant Parameters

Цитата(PsiMagistr @  11.5.2011,  19:47 Найти цитируемый пост)
Разве недостаточно constructor Create(AStr: String; AInt: Integer);


Достаточно, но плохо.

Цитата(PsiMagistr @  11.5.2011,  19:47 Найти цитируемый пост)
Или const в данном случае означают те значения, которые будут переданы в поля, если конструктор вызван без параметров?


Нет.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 11.5.2011, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 11.5.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  11.5.2011,  20:12 Найти цитируемый пост)
Верно ли я понимаю, что

_WritePersistent(FS, T);

 _ReadPersistent(FS, T);


те самые функции, код которых и расположен в подключаемых выше файлах?


Да.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 12.5.2011, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Немного зеленых вопросов по ООП

1) Я написал класс на основе другого класса. Например:

Код

type

MySuperClass = class(TPersistent)
private

//Прайвит Поля

fMyName:String;//
fMySirName:String;//
fMyFamilyName:String;//
fMyAge:Integer;//

//Свойства

public //Конец секции прайвит, открываемся публике.

Property MyName:String read fMyName write fMyName;
Property MySirName:String read fMySirName write fMySirName;
Property MyFamilyName:String read fMyFamilyName write fMyFamilyName;
Property MyAge:Integer read MyAge write fMyAge;

// И Методы

//Конструктор

constructor Create (MyName:String;MySirName:String; MyFamilyName:String;MyAge:Integer); 

end; //Конец описания класса


implementation //Секция имплементейшн Реализуем конструктор. Присвоение полям начальных значений.

constructor MySuperClass.Create (MyName:String;MySirName:String; MyFamilyName:String;MyAge:Integer); 

begin
inherited Create;
FMyName:MyName;
FMySirName:= MySirName;
FMyFamilyName:=FamilyName;
FMyAge:=MyAge;
end;

//Конец реализации конструктора.



Вопросы знатокам:

1) Все ли описано верно?

2) Возможно ли в конструкторе обращение не к полям а к свойствам (В конструкторе выполнится функция, обслуживающая поле, вместо простого присвоения значения.

3) Главный вопрос. Нужен ли классу деструктор? Ведь стандартный деструктор Persistent ничего не знает о новых полях, следовательно он не сможет их погасить? 

Или же не так?

4) Если деструктор все-таки нужен, как прописать там уничтожение полей?


Это сообщение отредактировал(а) PsiMagistr - 12.5.2011, 10:11


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 12.5.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  12.5.2011,  10:16 Найти цитируемый пост)
1) Все ли описано верно?


За исключением нескольких опечаток - да.

Но вот так будет "правильнее":

Код
type
  TMySuperClass = class(TPersistent)
  private
    FName: String;
    FSirName: String;
    FFamilyName: String;
    FAge: Integer;
  public
    constructor Create(const AName, ASirName, AMyFamilyName: String; const AMyAge: Integer); 
  published
    property Name: String read FName write FName;
    property SirName: String read FSirName write FSirName;
    property FamilyName: String read FFamilyName write FFamilyName;
    property Age: Integer read FAge write FAge;
  end;

implementation

constructor TMySuperClass.Create(const AName, ASirName, AFamilyName: String; const AAge: Integer); 
begin
  inherited Create;
  FName := AName;
  FSirName := ASirName;
  FFamilyName := AFamilyName;
  FAge := AAge;
end;


В основном тут стилистические исправления.

Цитата(PsiMagistr @  12.5.2011,  10:16 Найти цитируемый пост)
2) Возможно ли в конструкторе обращение не к полям а к свойствам (В конструкторе выполнится функция, обслуживающая поле, вместо простого присвоения значения.


Да.

Вообще, если свойство не имеет методов-акцессоров, то обращаться к полю или сасому свойству - без разницы и дело вкуса. Если у свойства есть метод-акцессор, то тут надо смотреть, чего мы хотим. Как правило, обращение будет идти к свойству. Делать это можно где угодно.

Цитата(PsiMagistr @  12.5.2011,  10:16 Найти цитируемый пост)
3) Главный вопрос. Нужен ли классу деструктор?


Нет.

Цитата(PsiMagistr @  12.5.2011,  10:16 Найти цитируемый пост)
Ведь стандартный деструктор Persistent ничего не знает о новых полях, следовательно он не сможет их погасить? 


Все строковые данные являются авто-финализируемыми типами. Они удаляются автоматически при освобождении объекта. Это даже не деструктор делает.

Цитата(PsiMagistr @  12.5.2011,  10:16 Найти цитируемый пост)
как прописать там уничтожение полей?


Код
FName := '';


или

Код
Finalize(FName );



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 12.5.2011, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Все строковые данные являются авто-финализируемыми типами. Они удаляются автоматически при освобождении объекта. Это даже не деструктор делает.

А если встречаются не строковые? Вот например у меня там есть интегровый тип

Добавлено через 9 минут и 22 секунды
Вообще, если свойство не имеет методов-акцессоров, то обращаться к полю или сасому свойству - без разницы и дело вкуса. 

Не совсем так. Я слышал, что ежели мы собираемся серилизовывать объект, то свойства необходимы. Причем  в секции published


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 12.5.2011, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Они удаляются автоматически при освобождении объекта.

А что же его освобождает окромя деструктора?

Это сообщение отредактировал(а) PsiMagistr - 12.5.2011, 13:47


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 12.5.2011, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  12.5.2011,  14:28 Найти цитируемый пост)
А если встречаются не строковые? Вот например у меня там есть интегровый тип


Integer и вовсе не динамический тип. Он уйдёт вместе с объектом. 

Объекты грубо можно считать расширенными записями. Вы же не удаляете в записи каждое Integer поле индивидуально?

Вот ежели вы GetMem-ом выделите память и сохраните в указателе-поле объекта - вот это другое дело. 

Цитата(PsiMagistr @  12.5.2011,  14:28 Найти цитируемый пост)
Не совсем так. Я слышал, что ежели мы собираемся серилизовывать объект, то свойства необходимы. Причем  в секции published 


В одну кучу не нужно смешивать: "наличие/отсутствие свойства" и "если свойство есть, то с чем работать: с полем или свойством". Оригинальный вопрос звучал так: 
Цитата(PsiMagistr @  12.5.2011,  10:16 Найти цитируемый пост)
Возможно ли в конструкторе обращение не к полям а к свойствам


Здесь нет ни слова про "необходимость" или "обходимость" свойств. Вопрос про то, можно ли обращаться к свойствам из конструктора. На этот вопрос я и отвечал.

Цитата(PsiMagistr @  12.5.2011,  14:47 Найти цитируемый пост)
А что же его освобождает окромя деструктора?


Магия компилятора. Если вы посмотрите на деструктор TObject (базовый объект, который является предком любого класса в Delphi), то увидите, что его деструктор пуст, ничего не делает вовсе. 

В Delphi выделение и освобождение памяти под объект занимается магия компилятора. Конструктор и деструктор являются инициализаторами и чистильщиками. При этом под объект память всегда выделяется обнулённая, а при её освобождении учитываются все автоматические типы (вроде строк, интерфейсов, вариантов и т.п.).

Тут надо понимать, что за исключением полей, имеющих тип автоматических типов данных, при этом не происходит индивидуальной работы с полями. Выделение и освобождение памяти происходит одним махом, на все поля сразу.

Технически, на уровне ассемблера - таки да, эту работу выполняет конструктор и деструктор. Но на уровне языка ВУ это так не выглядит.

Это сообщение отредактировал(а) CodeMonkey - 12.5.2011, 19:29


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
northener
Дата 13.5.2011, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(CodeMonkey @  12.5.2011,  19:29 Найти цитируемый пост)
В Delphi выделение и освобождение памяти под объект занимается магия компилятора

Это стоило бы выделить жирным шрифтом. Имхо.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
PsiMagistr
Дата 13.5.2011, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 13.5.2011, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Такой вопрос еще. Создал я класс - потомок от некоего класса. У того некоторый метод. Мне от него ни холодно, ни жарко и я пишу свой с тем же именем но с др набором параметрофф.

Теперь у моего класса два метода от предка и собственный. 

Я так понял надо overload своему методу писать, если хочу в проге оба метода использовать?  

А если только один хочу, свой собственный, то не надо...

Так я понимаю.




--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 13.5.2011, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Очень любопытно. Выходит конструктор TObject  НЕвиртуален.

Код

implementation

{$R *.dfm}

Constructor MyClass.Create;
begin
inherited Create;
ShowMessage('Вызываю конструктор');
end;

Destructor MyClass.Destroy;
begin
ShowMessage('Вызываю деструктор');
inherited Destroy;
end;



procedure TForm1.Button3Click(Sender: TObject);
var M:MyClass;
begin
 M:=MyClass.Create; //Несмотря на то, что конструктор не виртуален-оверрайден, вызывается именно МОЙ вариант конструктора.
 M.Free; // С деструктором такие фокусы не проходят, надо оверрайдить. Почему? Потому, что деструктор вызывается через метод предка Free, что ли?
end;


Это сообщение отредактировал(а) PsiMagistr - 13.5.2011, 10:38


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 13.5.2011, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Рекомендую к прочтениею: http://www.delphikingdom.ru/lyceum/seminar.asp?ID=6

Цитата(PsiMagistr @  13.5.2011,  09:44 Найти цитируемый пост)
1) Верно ли 

что для перекрытия родительского метода в классе-потомке используется директива override тогда и только тогда, когда

Метод потомка не только имеет одинаковое имя, но и одинаковый набор параметров, передаваемых в метод? Т.е. процедура является полным близнецом. Если набор параметров различен, ничего делать не нужно?


Нет. Директива override используется для введения новой версии виртуального метода. И, таки да, если это происходит, прототип должен полностью совпадать.

А для простого перекрытия override не нужен - просто пишем новый метод.

Цитата(PsiMagistr @  13.5.2011,  09:44 Найти цитируемый пост)
2) overload пишется тогда, когда мы хотим использовать два разных метода с одинаковыми именами, разным набором параметров и расположенных на одном иерархическом уровне


Да. И это применимо не только к методам, но и обычным процедурам, например:
Код
function FloatToStr(Value: Extended): string; overload; 
function FloatToStr(Value: Extended;  const AFormatSettings: TFormatSettings): string; overload;


Цитата(PsiMagistr @  13.5.2011,  09:44 Найти цитируемый пост)
Если на разных, то это связь предок-потомок и нужен override для перекрытия родительского (сам родительский при этом объявим виртуальным).


Он может, но вовсе не обязан быть виртуальным. Соответственно, override будет указываться или нет, смотря по тому, что мы в итоге решим.

Цитата(PsiMagistr @  13.5.2011,  09:44 Найти цитируемый пост)
3) В чем разница между  [b]overload и reitroduce. Не могу уловить, хоть ты разбейся. )))


overload с reitroduce не связан никак, а вот override и reitroduce - понятия близкие. override "продолжает" цепочку наследования, вводя новый вариант виртуального метода. reitroduce "прерывает" цепочку наследования, "замещает" метод, вводя новый, который никак не связан с унаследованным виртуальным. reitroduce используется очень редко и только в одном случае: у тебя в предке есть виртуальный метод, но в твоём классе и любых его наследниках этот метод не нужен. Но зато у тебя есть потребность создать новый метод, который было бы очень удобно назвать так же, как и тот унаследованный виртуальный. Вот и вводишь ты метод и пишешь reintroduce.

Иногда использование reitroduce говорит о допущенных ошибках при проектировании иерархии.

Цитата(PsiMagistr @  13.5.2011,  09:44 Найти цитируемый пост)
4) Верно ли утверждение, что деструкторы пишутся если в работе класса каким либо образом участвуют др. объекты? Т.е. в основном, чтобы их (эти другие) гасить. Например какое-либо поле определенно объектом. Или внутри метода объявлена переменная-указатель-на-объект? Много ли вообще существует НЕ-автофинализируемых типов? Я знаю что даже динам-массивы магия компилятора освобождает.


Деструктор нужен когда ему есть что делать. Удалить поле объекта. Раз-регистрировать элемент из его контейнера при удалении. Закрыть открытый объектом файл. И т.п. В остальных случаях деструктор не нужен.

К автофинализируемым типам в Delphi очевидным образом относятся все статические (просто потому, что они не нуждаются в финализации): Integer, записи и т.п., а кроме них: строки (String, AnsiString, UnicodeString, WideString), интерфейсы (IInterface, IDispatch, да и вообще любые), динамические массивы, варианты (Variant и OleVariant). Вроде, никого не забыл.

Все прочие типы к таковым не относятся. К примеру, объекты, динамически выделенная память (GetMem, AllocMem, New).

Но даже если память освобождается - автоматом это не значит, что делать нечего. К примеру, твой Integer может быть описателем открытого через CreateFile файла - и тогда в деструкторе файл надо закрыть.

Цитата(PsiMagistr @  13.5.2011,  09:44 Найти цитируемый пост)
Давеча попалась на глаза книга "Искусство создания компонентов Дельфи". Некто Валерий Фаронов. Утверждение там такое (цитата):

"Методы класса не должны обращаться к полям, так как в общем случае они вызываются без (!) создания объекта, а следовательно в момент вызова полей просто не существует"...

Постойте, как это методы не должны обращаться к полям? Они же только и делают,  что обращаются. Иначе зачем они вообще нужны, если не для работы над полями?


Вы путаете методы объекта и методы класса. Методы объекта - это:

Код
type
  TMyObj = class
  private
    FField: Integer;
  public
    procedure DoSomething;
  end;

procedure TMyObj.DoSomething;
begin
  FField := 0;
end;

...

var
  O: TMyObj;
begin
  O := TMyObj.Create;
  O.DoSomething;
  ...

end;


Методы класса - это:
Код
type
  TMyObj = class
  private
    FField: Integer;
  public
    class procedure DoSomething;
  end;

class procedure TMyObj.DoSomething;
begin
  FField := 0; // <- не скомпилируется
end;

...

begin
  TMyObj.DoSomething; // вызов метода без создания объекта
end;


Цитата(PsiMagistr @  13.5.2011,  10:22 Найти цитируемый пост)
Теперь у моего класса два метода от предка и собственный. 

Я так понял надо overload своему методу писать, если хочу в проге оба метода использовать?  


Не обязательно. Если ты хочешь сделать два метода доступными - то надо оба их объявить с overload. Если унаследованный объявлен без overload - надо в своём классе его продублировать с overload и вызвать унаследованный. Ну а в своём варианте делать что хочешь.

Цитата(PsiMagistr @  13.5.2011,  10:22 Найти цитируемый пост)
А если только один хочу, свой собственный, то не надо...


Да.

Цитата(PsiMagistr @  13.5.2011,  11:35 Найти цитируемый пост)
Несмотря на то, что конструктор не виртуален-оверрайден, вызывается именно МОЙ вариант конструктора.


По той простой причине, что вызываешь ты его через свой класс: [B]MyClass.Create.

Цитата(PsiMagistr @  13.5.2011,  11:35 Найти цитируемый пост)
С деструктором такие фокусы не проходят, надо оверрайдить. Почему? Потому, что деструктор вызывается через метод предка Free, что ли?


Если ты вызываешь деструктор напрямую - то он может быть не виртуальным. И иногда (очень редко) так делают для хитрых целей.

Но ты вызываешь деструктор через метод-обёртку Free, которая реализована у TObject. Т.е. если деструктор не виртуальный, то единственный деструктор, который сможет вызвать Free при любом раскладе будет деструктор TObject. В этом и смысл виртуальности: что при вызове из базового класса, используется метод потомка.

Это сообщение отредактировал(а) CodeMonkey - 13.5.2011, 13:37


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 16.5.2011, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



CodeMonkey,  Верно ли  я понимаю, что деструктор оверрайдится практически всегда. Ведь Free, как правило принадлежит предку, а он должен вызывать новую версию деструктора.


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 16.5.2011, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Да, всегда.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 16.5.2011, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Странное дело. Просто пытаюсь разобраться. Не лупите сильно, ладно? smile

Создаю объект А. Владелец этого объекта (Owner) - форма. Объект класса TComponent

Создаю объект Б. класс  TComponent.  Внимание - Владелец - объект А.

Заполняю свойства объекта А.

Заполняю свойства объекта Б.

Открываю файл, записываю данные объекта А (WriteComponent)

При записи объект А должен потянуть за собой и детище - объект Б. Тянет же за собою форма все остальные компоненты.

Т.е. файл должен содержать и данные А, и данные Б.

Не тут то было...

При записи в файл вижу данные только объекта А.








Это сообщение отредактировал(а) PsiMagistr - 16.5.2011, 12:34


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 17.5.2011, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Как я уже говорил: навскидку с TComponent я не отвечу. Надо время, чтобы смотреть и разбираться. А его у меня нет.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 17.5.2011, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Понятно. Ничего страшного. Спасибо. Я пока сижу, с TPresistent


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 18.5.2011, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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’е.

Сериализацию наладил, содрав код в котором смыслю мало что...

Дело за десериализацией.


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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