Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26113
Рейтинг: 2126
#46: 2009-01-20 16:29:17 ЛС | профиль | цитата
Dilma, а как мне запустить в динамике такую схему, что бы по циклу можно было опрашивать внутренние схемы ?
------------ Дoбавленo:

Или как после добавления выбрать именно ту схему, какую мне нужно в данный момент ?
------------ Дoбавленo:

Dilma, ну ё мое, неужели его нельзя добавить ?


procedure THIPolymorphMulti.Select;
var i:integer;
begin
i := ToInteger(Data);
if (i < 0) or (i >= FChilds.Count) then exit;
_hi_onEvent(THiPoliEdit(FChilds.Items[i]).Works[Index], Data);
end;

Ну прекрасно он работает, только что проверил
------------ Дoбавленo:

Да, ну и где написано, что для запуска всех схем по циклу необходимо оформит точку ##doWork ?

------------ Дoбавленo:

Пробовал по имени выбирать -- фигня чистая, а ##Select работает согласно списка нормально
карма: 22

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#47: 2009-01-20 17:45:56 ЛС | профиль | цитата
Dilma, ты чего молчишь? Идея добавить Select, открывает колоссальные дополнительные возможности полиморфа. Можно наклепать кучу схем в один мультик и вызывать их оттуда, когда надо и какую надо, и не обязательно все сразу.
------------ Дoбавленo:

Да, и заменить бы не мешало PoliEdit на PolyEdit
карма: 22

0
Ответов: 2125
Рейтинг: 159
#48: 2009-01-20 17:48:56 ЛС | профиль | цитата
Не переживай, никто от select отказываться не собирается, более того, я даже предлагал сделать точку selectAll, чтобы можно было вызывать точки как для отдельной схемы, так и для всех сразу. Можно ещё предусмотреть для точки selectAll входной параметр - имя мультика, чтобы выбирать только схемы определённого класса.
карма: 1

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#49: 2009-01-20 17:55:44 ЛС | профиль | цитата
tsdima писал(а):
входной параметр - имя мультика, чтобы выбирать только схемы определённого класса

Пробовал, фигня получается с такой реализацией. Наблюдается рассинхронизация сохраненного имени класса с индексом схемы.
карма: 22

0
Ответов: 2125
Рейтинг: 159
#50: 2009-01-20 18:34:47 ЛС | профиль | цитата
А ещё, можно сравнивать частично, т.е. если у нас есть классы АБВ, АБГ, АД, ЕЖ то при параметре точки selectAll равном А выберутся схемы классов АБВ, АБГ, АД, а при параметре АБ - только АБВ, АБГ. Тогда для пустой строки выберутся все схемы. Кстати, установленный параметр selectAll, нужно при вызове точки сохранять в локальной переменной, чтобы обеспечить реентерабельность точек.
карма: 1

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#51: 2009-01-20 18:37:12 ЛС | профиль | цитата
Ну ты и загнул...
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#52: 2009-01-20 19:01:58 ЛС | профиль | цитата
мне не нравится, что системные точки сидят на самом элементе. #Add еще хоть как-то оправдано - типа метод для инициализации внутренностей, ну может быть ##select еще можно совместить с методом для дочерней схемы, но все остальное только мешает... Чуть позже напишу как бы это хотелось по другому организовать
карма: 27
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#53: 2009-01-20 19:04:34 ЛС | профиль | цитата
Dilma писал(а):
Чуть позже напишу как бы это хотелось по другому организовать

Да, да, очень бы хотелось послушать. Элемент очень интересный по своей сути
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#54: 2009-01-20 22:16:12 ЛС | профиль | цитата
Сегодня одно из больших неудобств при работе с динамическими контейнерами заключается в том, что необходимо при обращение к методу конкретного экземпляра схемы вызывать ##select перед его вызовом. Что в этом плохого?
1) ну очевидно мы делаем совершенно лишнее действие, а значит заведомо усложняем нашу схему на пустом месте
2) такой подход без специальной защиты может давать сбои при обращении к объектам в паралельных потоках(сегодня эта проблема весьма призрачна, но тем не менее)

Каким образом от этого можно избавиться?
Видимо выход пока только один: разнести всю кухню по разным элементам. Например так:
- основной элемент контейнер, который на этапе конструирования содержит в себе шаблоны схем, а на этапе выполнения программы - массив конкретных экземпляров объектов
- элемент управления массивом - обычный элемент не контейнер с точками doAdd, doDelete, doClear, doFind(вместо doSelect), событиями onAdd, onDelete, onFind и т.д.
- элемент Объект. Это скорей всего новая сущность в среде, которая представляет из себя простой элемент, чьи точки определяются по связанному с ним шаблону из первого пункта. На этапе выполнения это ссылка на конкретный объект из массива экземпляров объектов по первому пункту.
Несколько поясню на аналогии с ЯВУ

#cpp
// пункт 1 это класс
class TMySuperClass{
public:
TMySuperClass();
~TMySuperClass();
void doDraw();
void doProcess();
};

// пункт 2 это операторы языка для манипуляции с экземплярами класса
m = new TMySuperClass();
delete m;

// пункт 3 это конкретный экземпляр класса
m->doDraw();
m->doProcess();

Это первый возможный набросок, который тем не менее не решает некоторые проблемы:
1) что должно происходить при обращение к точкам шаблона из первого пункта? (у нас все таки не ЯВУ и никаких классов как таковых нет)
2) как указатель из массива объектов будет попадать в конкретный элемент пункта 3? (т.е. кто и как реализует присваивание указателя переменной m)

Очевидно так же то, что с такой организацией надо делать внутри контейнера элемент, который будет обладать точками onCreate и onDestroy

PS: существующий полиморф доделать до классической схемы работы с динамическими контейнерами, чтобы у разработчика была возможность постепенного освоения этой техники.
карма: 27
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#55: 2009-01-20 22:26:29 ЛС | профиль | цитата
Dilma писал(а):
PS: существующий полиморф доделать до классической схемы работы с динамическими контейнерами, чтобы у разработчика была возможность постепенного освоения этой техники

Думаю, это действительно надо сделать (пока зреет что-то более значимое), и не стоит от него отказываться, для простых задач (и не только) полиморф вполне подойдет
карма: 22

0
Ответов: 2125
Рейтинг: 159
#56: 2009-01-20 22:51:26 ЛС | профиль | цитата
Dilma писал(а):
элемент Объект

По описанию очень похоже на то, что в своё время очень хотел AlexKir - указатель на объект.

Dilma писал(а):
что должно происходить при обращение к точкам шаблона из первого пункта

А не показывать их вообще. У шаблона должна быть лишь одна точка снизу: template - интерфейс, с которым работает тот самый "элемент управления массивом", имеющий аналогичную точку сверху. Т.е. по этой связи мы передаём фабрику класса (в терминах СОМ)

Dilma писал(а):
как указатель из массива объектов будет попадать в конкретный элемент пункта 3

А в потоке. Его выдаст onAdd или onFind, к примеру. А onFind, к примеру, будет возникать для каждого найденного.
Вопрос только, как сказать среде о том, с чем работает данный объект. Но тут может пригодиться технология менеджеров.
карма: 1

0
Администрация
Ответов: 15295
Рейтинг: 1519
#57: 2009-01-20 23:06:41 ЛС | профиль | цитата
tsdima писал(а):
По описанию очень похоже

не похоже, а именно оно и есть. Назовем его ClassObject, чтобы не путаться далее.

tsdima писал(а):
А не показывать их вообще. У шаблона должна быть лишь одна точка снизу: template - интерфейс

ну да, тоже вариант впринципе...

tsdima писал(а):
А в потоке. Его выдаст onAdd или onFind, к примеру. А onFind, к примеру, будет возникать для каждого найденного.
Вопрос только, как сказать среде о том, с чем работает данный объект. Но тут может пригодиться технология менеджеров.

такое можно сдлеать только с применением еще одного элемента посредника, который приняв из потока указатель(выданный через onAdd) ретранслирует его в ClassObject через менеджера. Получается что наш элемент обаъект(ClassObject) имеет уже две невизуальные связи - первая до шаблона класса(для конструирования точек), вторая до поставщика указателей. Не слишком сложно получается?...
карма: 27
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#58: 2009-01-21 14:21:27 ЛС | профиль | цитата
Dilma, я доделал PolyMorph, но возник вопрос -- оставлять doWork для отработки всех схем по любому входному методу, либо сделать как в MeultiElementEx, только текущей, но тогда твой пример перестает работать, что тоже не интересно ?
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#59: 2009-01-21 15:20:13 ЛС | профиль | цитата
делать все как в MultiElementEx, пример переделать.

Хотя можно наверно и опцию вставить, в которой пользователь сам укажет как именно вызывать метод - для всех объектов в контейнере или только для текущего.
карма: 27
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#60: 2009-01-21 15:23:11 ЛС | профиль | цитата
Dilma писал(а):
Хотя можно наверно и опцию вставить

Так и сделаю.
А по-умолчанию сделать одиночный или мультивызов схем
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)