Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: 1 2 3 [все] |
Док Member Откуда: Казань Сообщений: 6966 |
Собственно, решил попробовать их на вкус. Сделал, как в этом примере
Ну и в случае {3}, если не комментить код после finally, то получаю
ЧЯДНТ? Я неправильно понимаю их область применения? зы. кстати, компилятор выдал кучу хинтов типа
================= Док. Win7 Ultim x64/Deb 8.7 i386: FB 3.0.2.32703, диалект 3, SS(win)/SC(Deb), Lazarus 1.9(r.55042); FPC 3.1.1 (r.36290), IBX by -Rik-; IBE 2017.4.19.2 |
|||||
18 июн 17, 17:53 [20573115] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Cоздаёшь единственный объект, а потом удивляешься результату :) |
||
18 июн 17, 18:01 [20573123] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
понятно. А что с разрушением? |
||||
18 июн 17, 18:06 [20573130] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
А чего ты ожидаешь убивая объект несколько раз? (я полагаю TFPGObjectList по дефолту является владельцем хранимых объектов). |
||
18 июн 17, 18:10 [20573133] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
Kazantsev Alexey, поправил код
теперь с ожидаемым результатом
Но даже теперь нет понятно, почему уничтожение и объекта, и листа все равно приводит к выше указанной ошибке. Но если их уничтожать по одному за один раз - все корректно? Я хочу уяснить на будущее, если я их не буду уничтожать, то память потечет? |
||
18 июн 17, 18:26 [20573149] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Я же тебе уже сказал, что твой лист, скорее всего, сам удаляет хранимые объекты. Параметры конструктора-то посмотри. |
||
18 июн 17, 18:35 [20573161] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
Если ты в этих классах хранишь всего лишь свойства, как информацию о чём либо - то. То лучше использовать структуры, так как их не надо ручками создавать и удалять |
18 июн 17, 18:40 [20573166] Ответить | Цитировать Сообщить модератору |
чччД
Guest |
Док, обычно у таких списков есть свойство "владелец объектов". Оно иногда по умолчанию включено, иногда - выключено, смотри исходники. Это значит, что все, что ты положил в список, будет удалено (вызовом деструктора вложенного объекта) при разрушении списка. Например, ты кнопки на форму кидаешь. Потом, при разрушении формы, кнопки тоже разрушаются. |
18 июн 17, 18:43 [20573169] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
Если у тебя list.FreeObjects = True, то, как уже сказали выше, он сам вызывает Free у хранимых объектов при уничтожении списка. |
||
18 июн 17, 18:53 [20573181] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
Ага, теперь понятно
Че-та я их не могу понять куда и и как в один из 4 классов (TFPGList, TFPGObjectList, TFPGInterfacedObjectList, TFPGMap), описанных в fgl, их прикрутить. Если создавать свой тип дженерика, как описано в мануале generic TList<T> = class Items: array of T; procedure Add(Value: T); end; TRecList = specialize TList<TMyRec>; то придется вручную описывать остальные свойства и процедуры. А хотелось бы готовых :) |
||||||
18 июн 17, 20:32 [20573297] Ответить | Цитировать Сообщить модератору |
чччД
Guest |
Док, вот с "созданием" записей:type RMyRec = record i : integer; s : string; end; var fL : TList<RMyRec>; fpR : ^RMyRec; i : Integer; const c_Iter = 10; begin fL := TList<RMyRec>.Create; try for i := 1 to c_Iter do begin New(fpR); fpR.i := i; fpR.s := '# ' + IntToStr(i); fl.Add(fpR^) end; finally ... Это я с Delphi Tokyo играюсь... какой крутецкий отладчик, все элементы списка видно: К сообщению приложен файл. Размер - 11Kb |
18 июн 17, 21:07 [20573333] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
чччД, Тебе не кажется что, создание указателя - это лишние ? |
18 июн 17, 21:48 [20573377] Ответить | Цитировать Сообщить модератору |
чччД
Guest |
Кстати, TList<> сам выделяет (и освобождает) память для данных типа <T>, и в данном случае fl.Add(fpR^) - всего лишь копирование значений из временной переменной. Стало быть, в цикле должен быть Dispose этой временной переменной: for i := 1 to c_Iter do begin New(fpR); fpR.i := i; fpR.s := '# ' + IntToStr(i); fl.Add(fpR^); Dispose(fpR); end; |
18 июн 17, 22:02 [20573392] Ответить | Цитировать Сообщить модератору |
чччД
Guest |
Так Док вроде как раз страдает по этому поводу - куда непонятное заранее количество деть, массив какой-то завёл. А так - да, не нужно. |
||
18 июн 17, 22:10 [20573405] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
Вот теперь то же самое, только на Лазаре. "Я посмотрел бы на него, когда б было минус 30..." © :)
Док не страдает, Док изучает, прежде чем сказать, что дженерики на Лазаре Есть сторонняя библиотека, но и там типа TList<TArray> тоже нет. Так что, для моих целей ближе всего все-таки использовать свой класс с полями нужного типа. |
||||
18 июн 17, 23:17 [20573458] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Всё ровно наоборот. Муа-ха-ха.
Ты же на транке вроде? В транк давно уже спарту интегрировали, подключай Generics.Collections... |
||||
18 июн 17, 23:46 [20573470] Ответить | Цитировать Сообщить модератору |
чччД
Guest |
Док, ну ты скажи, где лазарус взять, чтобы такой, как у тебя и без гемора при установке - я и попробую. |
19 июн 17, 00:01 [20573477] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
легко. Можешь попробовать собрать так.
и ты молчал? :) |
||||
19 июн 17, 00:13 [20573485] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Зачем такие сложности... Ходишь сюда, качаешь утиль под свою ОС, устанавливаешь нажатием одной кнопки.
А ты не те вопросы задаешь ![]() |
||||
19 июн 17, 00:20 [20573490] Ответить | Цитировать Сообщить модератору |
чччД
Guest |
Скачал лазарус отсюда: http://www.lazarus-ide.org/ - нет там файла Generics.Collection
Да ну, страшно. |
||||
19 июн 17, 00:44 [20573501] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
ССЗБ |
||
19 июн 17, 00:49 [20573505] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
Мог бы и подсказать, тем более, что нас, лазаристов, мало :) Вроде разобрался
Еще раз хотел уточнить, FreeAndNil нужно писать или об этом TList<T> позаботится? Будет ли криминалом, если я буду по привычке уничтожать то, что создал своими руками? |
||||
19 июн 17, 01:37 [20573528] Ответить | Цитировать Сообщить модератору |
чччД
Guest |
Вот оно мне так надо. |
||||
19 июн 17, 01:38 [20573529] Ответить | Цитировать Сообщить модератору |
чччД
Guest |
Если у тебя в список TList<> залиты экземпляры классов - нужно уничтожать руками. Если "простые типы" (целые, строки, записи из целых и строк...) - не нужно уничтожать. Если в записи есть поля "классового" типа ("объекты") - нужно пройтись по всем элементам и уничтожить такие объекты. |
||
19 июн 17, 01:42 [20573530] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Конкретно TList<T> сам ничего не уничтожает. TObjectList<T> в зависимости от опции владения объектами.
Это ортогонально дженерикам. Но вообще, либо уничтожаешь сам, либо поручаешь кому-то, как в том случае со списком-контейнером владеющим объектами. |
||||
19 июн 17, 01:52 [20573532] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
тебе 3 батника запустить поочередно гораздо сложнее, чем кликать 10 раз по кнопке "Next" в инсталляторе дельфей? Тогда понятно, почему ты так долго на D2007 сидел, а теперь пузыри пускаешь, увидев отладчик Tokyo :) кроме того, там Лазарь ставится как portable, хоть на флешку, не мусоря в реестре.
Я ж спросил на конкретном примере, мне нужно уничтожать конкретно созданный мной экземпляр-контейнер RL или это сделает TList<T>? :) |
||||
19 июн 17, 08:26 [20573643] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Разумеется, ты сам должен заботится об уничтожении списка. |
||
19 июн 17, 09:23 [20573708] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
Kazantsev Alexey, Спасибо. Собственно, теперь все. |
19 июн 17, 09:47 [20573763] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3788 |
Нашли generics.collection? Я его полтора года назад находил без проблем. Нормальные в лазаре дженерики, насколько я знаю. |
19 июн 17, 19:31 [20575905] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
про которые из трех ты говоришь? :) 1. если про sparta, то в версии 1.6.4, то в стандартной поставке там только папка dockedformeditor. В нынешнем виде она есть в транке (возможно была и в 1.7) 2. если про те, что описаны в fgl.pas, то мне их функционал показался очень и очень куцым 3. если про TemplateGenerics, то там тоже не айс, имхо, нет гибкости спарты зы. Про "в лазаре дженерики" будет иметь смысл говорить, когда они будут, как минимум, в сорцах fpc лежать, ПМСМ. |
||
20 июн 17, 00:04 [20576201] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Спартовские в транке лежат. Ну и есть ещё fcl-stl. |
||
20 июн 17, 00:40 [20576238] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3788 |
Док, Sparta. Вполне живые. Я как-то проблем с ними не замечал. |
20 июн 17, 00:48 [20576244] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
Наверное, единственные юзабельные, КМК. Пошел пользовать. Алексу персональный спасиб за наводку |
||||
20 июн 17, 12:03 [20576963] Ответить | Цитировать Сообщить модератору |
Cobalt747 Member Откуда: Сообщений: 2282 |
Док, Расскажи потом, в чём отличие от дельфовских. |
20 июн 17, 14:40 [20577628] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
с дельфей слез лет 5 как, Лазарь с каждым релизом устраивает более, чем. Помочь не смогу :) |
||
20 июн 17, 16:16 [20578018] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Спартовские калька с дельфийских. |
||
20 июн 17, 16:24 [20578037] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
Kazantsev Alexey, я так понимаю, это был сарказм :) |
20 июн 17, 17:03 [20578174] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Эм... Нет. Спартовские generics.collections есть калька с дельфийских generics.collections, и сделаны они были именно для совместимости с дельфями. |
||
20 июн 17, 17:12 [20578203] Ответить | Цитировать Сообщить модератору |
Док Member Откуда: Казань Сообщений: 6966 |
Kazantsev Alexey,![]() щас перечитал свой последний пост и понял, что ты не так поймешь. Это со стороны Cobalt747, вероятно, был сарказм. |
20 июн 17, 17:19 [20578215] Ответить | Цитировать Сообщить модератору |
Cobalt747 Member Откуда: Сообщений: 2282 |
|
||
23 июн 17, 13:14 [20585860] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
На уровне RTL ничем, на уровне языка фпц'шные дженерики это почти шаблоны, а дельфийские так, баловство. |
||
23 июн 17, 16:29 [20586580] Ответить | Цитировать Сообщить модератору |
Жышы Member [заблокирован] Откуда: Сообщений: 656 |
Пример кто-нибудь продемонстрирует? |
||||
23 июн 17, 16:35 [20586607] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Пример чего? |
||
23 июн 17, 16:40 [20586627] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6564 |
Kazantsev Alexey, Пример чем они круче. |
23 июн 17, 16:51 [20586650] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Ну попробуй на дельфях реализовать банальное сложение для типа <T>. |
||
23 июн 17, 16:57 [20586666] Ответить | Цитировать Сообщить модератору |
Жышы Member [заблокирован] Откуда: Сообщений: 656 |
Примера не будет? |
||||
23 июн 17, 17:01 [20586685] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6564 |
Понятно. |
23 июн 17, 17:03 [20586691] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Примера на дельфях не будет, ибо слишком много писанины, а на фпц это одна строчка: result := a + b;
Этим не ограничивается. Возьмём другой пример. У тебя коллекция имеющая метод ToString, который должен вернуть строковое представление всех хранимых данных. Писать такое на дельфийских дженериках - проще застрелиться, а на фпц'шных пишется элементарно:
И работать будет с любым типом имеющим метод ToString. А если нужный тип не имеет такого метода, то для него пишется тайпхелпер реализующий этот метод. Аналогично всё будет работать и с любыми операциями приведения типов, и даже с учётом перегрузки операторов. |
|||||
23 июн 17, 17:19 [20586761] Ответить | Цитировать Сообщить модератору |
Жышы Member [заблокирован] Откуда: Сообщений: 656 |
Реализацию примера на дельфях я и так представляю, на лазарусе кто бы показал. |
23 июн 17, 17:26 [20586797] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Специально для тебя:
|
||||
23 июн 17, 17:32 [20586835] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6564 |
|
||
23 июн 17, 17:33 [20586844] Ответить | Цитировать Сообщить модератору |
Жышы Member [заблокирован] Откуда: Сообщений: 656 |
Kazantsev Alexey, непонятно. Для типа pRMyRec = ^RMyRec; RMyRec = record o : TObject; i : Integer; pr : pRMyRec; end; - сложение покажи. |
23 июн 17, 17:36 [20586854] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Шта? В дельфях тебе так же будет нужен метод ToString, если захочешь корректного представления, а не как ты его себе видишь. Только для этого ты с ещё с RTTI попляшешь, что конечно очень молодёжно и вообще передово. |
||
23 июн 17, 17:45 [20586871] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Переопределяешь оператор сложения в своём типе, а код дженерика остаётся прежним. |
||
23 июн 17, 17:46 [20586879] Ответить | Цитировать Сообщить модератору |
Жышы Member [заблокирован] Откуда: Сообщений: 656 |
Не-по-нят-но. |
||||
23 июн 17, 17:58 [20586910] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6564 |
Жышы, Класс оператор сложения писать надо. |
23 июн 17, 18:04 [20586924] Ответить | Цитировать Сообщить модератору |
Жышы Member [заблокирован] Откуда: Сообщений: 656 |
В где? |
||
23 июн 17, 18:08 [20586929] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6564 |
Жышы,pRMyRec = ^RMyRec; RMyRec = record o : TObject; i : Integer; pr : pRMyRec; class operator Add(const A,B: RMyRec ): RMyRec; overload; end; |
23 июн 17, 18:13 [20586941] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Operator_Overloading_(Delphi) RMyRec = record ... Class Operator Add(Const ALeft, ARight : RMyRec) : RMyRec; end; ... Class Operator RMyRec.Add(Const ALeft, ARight : RMyRec) : RMyRec; Begin ... End; |
||
23 июн 17, 18:14 [20586947] Ответить | Цитировать Сообщить модератору |
Жышы Member [заблокирован] Откуда: Сообщений: 656 |
А в лазарусе - не надо, сам собой сложится? |
||
23 июн 17, 18:14 [20586948] Ответить | Цитировать Сообщить модератору |
Жышы Member [заблокирован] Откуда: Сообщений: 656 |
Это я знаю. Я не знаю, как в лазарусе. |
||||
23 июн 17, 18:15 [20586950] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6564 |
Жышы, В лазарусе как раз надо. Не надо в дельфях. Там проблема сложить 2 абстрактных типа лежит на писателе генерик класса. |
23 июн 17, 18:16 [20586952] Ответить | Цитировать Сообщить модератору |
Жышы Member [заблокирован] Откуда: Сообщений: 656 |
Вы меня путает. А ведь у меня уже есть собственный персональный путаник! ... Может, кто-то покажет код и в лазарусе и дельфи? |
||
23 июн 17, 18:25 [20586975] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
В фпц также. Кому, как не автору типа знать, каким образом правильно выполнять операции над своим типом. Код дженерика при этом остаётся простым и неизменным.
Не надо, агащазблин. В дельфях тоже надо, иначе наскладываешь там абстрактно такого... Просто в дельфях придётся лезть за методом оператора в RTTI. В общем, дженерики дельфийские это боль. Будь они нормальными, не нужны были бы пляски с этими вашими экьюалитикомпарерами с этой их косвенностью и динамичностью, которые ещё и болт кладут на кастомные операторы сравнения типов. |
||||
23 июн 17, 18:33 [20586985] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6564 |
Kazantsev Alexey, В дельфях надо будет анонимную функцию сложения делать. |
23 июн 17, 18:37 [20586993] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Уж лучше в RTTI... |
||
23 июн 17, 18:42 [20587002] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6564 |
|
||
23 июн 17, 18:53 [20587024] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Как раз наоборот. В конструкторе класса получаешь адрес метода, сохраняешь... |
||
23 июн 17, 19:06 [20587049] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6564 |
Kazantsev Alexey,![]() |
23 июн 17, 19:32 [20587124] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
rgreat, Какие дженерики, такое и решение. |
23 июн 17, 19:36 [20587130] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: 1 2 3 [все] |
Все форумы / Delphi | ![]() |