Вверх ↑
Этот топик читают: Гость
Ответов: 95
Рейтинг: 2
#1: 2013-03-13 16:28:27 ЛС | профиль | цитата
Предположим, есть некий кусок схемы, который повторяется в разных местах программы. Т.к. в программе много контейнеров и прочих элементов, тянуть из разных мест связи к этому повторяющемуся куску неудобно. Дублировать схему в разных местах не хочется, дабы не раздувать размеры программы.
Можно ли поместить повторяющийся кусок схемы в некий контейнер и вызывать его аля dll?
упрощённый пример
code_30566.txt
карма: 0

0
файлы: 1code_30566.txt [1.6KB] [42]
Разработчик
Ответов: 26170
Рейтинг: 2127
#2: 2013-03-13 16:45:57 ЛС | профиль | цитата
Сторонний компонент похожий был, вроде как Function называется. Но я, к примеру, пользуюсь ссылкой на элемент контейнера, тогда изменения в основном контейнере отражаются во всех ссылочных (кроме комментариев, их можно менять)
------------ Дoбавленo в 16.45:
Вот, как-то так

Add(MainForm,3447254,273,210)
{
}
Add(MultiElement,1487451,350,210)
{
@Hint=#49:условно, это некая схема Х, которую надо вызывать|
@IsLib=True
AddHint(63,-28,162,26,@Hint)
}
BEGIN_SDK
Add(EditMulti,13332278,21,21)
{
EventCount=1
WorkCount=1
link(doWork1,12346311:doOperation,[(123,27)(123,118)])
}
Add(Math,12346311,133,112)
{
OpType=2
Op2=2
ResultType=0
link(onResult,13332278:onEvent1,[(172,118)(172,27)])
}
END_SDK
Add(Button,14455655,273,259)
{
Left=5
Top=10
Data=Integer(2)
link(onClick,16660990:doWork1,[])
}
Add(Edit,3419163,511,259)
{
Left=70
Top=10
Width=120
}
Add(Button,1035395,294,308)
{
Left=5
Top=40
Data=Integer(3)
link(onClick,3243885:doWork1,[])
}
Add(Edit,3913474,532,308)
{
Left=70
Top=40
Width=120
}
Add(Button,8127934,322,364)
{
Left=5
Top=70
link(onClick,12468160:doWork1,[])
}
Add(Edit,14697151,560,364)
{
Left=70
Top=70
Width=120
}
Add(MultiElement,16660990,385,259)
{
@Hint=#49:условно, это некая схема Х, которую надо вызывать|
elink(1487451)
link(onEvent1,3419163:doText,[])
AddHint(63,-28,162,26,@Hint)
}
Add(MultiElement,3243885,413,308)
{
@Hint=#49:условно, это некая схема Х, которую надо вызывать|
elink(1487451)
link(onEvent1,3913474:doText,[])
AddHint(63,-28,162,26,@Hint)
}
Add(MultiElement,12468160,448,364)
{
@Hint=#49:условно, это некая схема Х, которую надо вызывать|
elink(1487451)
link(onEvent1,14697151:doText,[])
AddHint(63,-28,162,26,@Hint)
}


карма: 22

1
Голосовали:tom-it
Ответов: 95
Рейтинг: 2
#3: 2013-03-13 16:54:23 ЛС | профиль | цитата
nesco писал(а):
пользуюсь ссылкой на элемент контейнера
даже не знал о таком.
а в конечном (скомпилированном) коде программы такие ссылки являются именно удаленным обращением к оригиналу контейнера? или при компилировании все ссылки заменяются копиями оригинального контейнера?
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#4: 2013-03-13 17:17:18 ЛС | профиль | цитата
Abracadabra писал(а):
или при компилировании все ссылки заменяются копиями оригинального контейнера?

Нет, просто создается необходимое количество экземпляров класса твоего контейнера после запуска приложения, но код контейнера один -- тот, что оригинальный. Это, как бы, размножение кода твоего контейнера в памяти после запуска.
------------ Дoбавленo в 17.17:
Вот насчет компонента Function, то его нельзя лепить внутрь контейнера, тк он построен по технологии менеджера, и цепляется к контейнеру извне. Те у компонентов Function и CallFunction иерархия снизу-вверх -- CallFunction должен быть на том же уровне или ниже, нежели компонент Function, но не наоборот
карма: 22

0
Ответов: 95
Рейтинг: 2
#5: 2013-03-13 17:50:58 ЛС | профиль | цитата
а какие ещё могут быть доводы в пользу ссылок или CallFunction?
скорость выполнения, размер конечной программы, объём занимаемой памяти при прочих равных,...?
пытаюсь решить для себя, чем лучше пользоваться.
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#6: 2013-03-13 19:30:29 ЛС | профиль | цитата
Abracadabra писал(а):
скорость выполнения, размер конечной программы, объём занимаемой памяти при прочих равных,...?

У ссылок будет выше скорость выполнения, но больший объем занимаемой память при меньшем размере конечной программы. Ссылки сделаны на уровне среды и кодогенератора и не являются отдельными компонентами как Function, те будут отсутствовать ненужные интерфейсные преобразования, и они не будут ограничены иерархией
карма: 22

1
Голосовали:Abracadabra
Ответов: 95
Рейтинг: 2
#7: 2013-03-13 20:51:31 ЛС | профиль | цитата
Имеет ли смысл делать ссылки на отдельные элементы?
Например, в нескольких местах схемы происходит считывание одного и того же ключа из ini. Стоит ли вместо отдельных компонентом Ini раскидать по схеме ссылки? вижу явное преимущество с точки зрения дальнейшей разработки программы: если решу изменить название ключа/секции/файла нет риска пропустить один из компонентов. Но как это отразиться на
скорость выполнения, размер конечной программы, объём занимаемой памяти при прочих равных,...?

карма: 0

0
Ответов: 16884
Рейтинг: 1239
#8: 2013-03-13 21:03:10 ЛС | профиль | цитата
Abracadabra писал(а):
Например, в нескольких местах схемы происходит считывание одного и того же ключа из ini.
Считываем при запуске и помещаем в GlobalVar.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 95
Рейтинг: 2
#9: 2013-03-13 23:11:27 ЛС | профиль | цитата
Tad писал(а):
Считываем при запуске и помещаем в GlobalVar.

Это был просто пример. Вопрос в том, на сколько ссылки на компонент лучше/хуже повторения компонента?
------------ Дoбавленo в 21.58:
речь конечно о простых компонентах, а не о контейнерах
------------ Дoбавленo в 23.11:
вот небольшой кусок реальной схемы
Add(CheckBox,4101202,406,385)
{
@Hint=#28:пустышка для перевода фокуса|
Left=5
Top=75
Width=15
Caption=""
AddHint(-36,40,177,13,@Hint)
}
Add(Switch,7744103,504,245)
{
@IsLib=True
Point(doOn)
link(onSwitch,14201324:doEvent1,[(548,251)(548,239)(366,239)(366,258)])
}
Add(Font,9302362,406,259)
{
Font=[Courier New,10,0,0,204]
@IsLib=True
link(onFont,2535374:doFont,[])
}
Add(Hub,14201324,378,252)
{
link(onEvent1,2535374:doText2,[])
link(onEvent2,9302362:doFont,[])
}
Add(Hub,7662489,378,322)
{
OutCount=3
link(onEvent1,1400628:doText2,[])
link(onEvent2,1400628:doPassword,[])
link(onEvent3,8875595:doFont,[])
}
Add(MainForm,2953706,315,238)
{
Width=240
Height=100
BorderStyle=1
Position=1
}
Add(Edit,2535374,455,245)
{
Left=5
Top=5
Width=220
Height=25
Font=[Courier New,10,0,12632256,204]
Text="Логин"
ClearAfterEnter=1
Point(doFont)
Point(onSetFocus)
link(onSetFocus,7744103:doOn,[])
}
Add(Edit,1400628,455,315)
{
Left=5
Top=40
Width=220
Height=25
Font=[Courier New,10,0,12632256,204]
Text="Пароль"
ClearAfterEnter=1
Point(onSetFocus)
Point(doPassword)
Point(doFont)
link(onSetFocus,7822471:doOn,[])
}
Add(Font,8875595,406,336)
{
elink(9302362)
link(onFont,1400628:doFont,[])
}
Add(Switch,7822471,504,315)
{
elink(7744103)
Point(doOn)
link(onSwitch,7662489:doEvent1,[(548,321)(548,310)(369,310)(369,328)])
}
два элемента заменены на ссылки. изменений в размере конечного файла это не дало (47 616 байт). Возможно, разница не ощутима из-за малости схемы. Будет ли какой-то положительный эффект от массового использования ссылок вместо повторения компонентов в больших схемах? Будет ли отрицательный эффект (скорость, память,...)?
Или всё же использование ссылок оправдано лишь с контейнерами?
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#10: 2013-03-13 23:22:01 ЛС | профиль | цитата
Abracadabra писал(а):
Но как это отразиться на

ЕМНИП, то никак, то же самое получится -- что создавать отдельный класс с новыми параметрами, что создавать очередной экземпляр какого-то оригинального класса
карма: 22

0
Ответов: 1058
Рейтинг: 76
#11: 2013-03-16 01:43:03 ЛС | профиль | цитата
nesco писал(а):
пользуюсь ссылкой на элемент контейнера

Никогда о таком не слышал.
Компонента с таким функционалом не встречал, или может просто не знал о его функционале. Поподробней можно? Где и как эту ссылку найтисделать.
------------ Дoбавленo в 01.43:
Аааа, нашел уже. Если бы здесь не услышал, никогда бы и не догадался для чего оно.
карма: 0

0
Ответов: 9906
Рейтинг: 351
#12: 2013-03-16 07:18:16 ЛС | профиль | цитата
Тогда приготовься к тому, что среда будет иногда и падать. В самые непредсказуемые моменты
------------ Дoбавленo в 07.18:
Хотя вряд ли "линк" -- это полноценный выход из положения.
Иногда очень хочется работать именно с тем же экземпляром класса из разных мест. Скажем, это COM-порт... Да мало ли чего еще может быть.
Не заморачиваясь не только "прокладкой кабелей", но и с возвратом результата(ов).

Нет такого средства, к сожалению
карма: 9

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#13: 2013-03-16 12:11:20 ЛС | профиль | цитата
Galkov писал(а):
Тогда приготовься к тому, что среда будет иногда и падать. В самые непредсказуемые моменты

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

0
Ответов: 9906
Рейтинг: 351
#14: 2013-03-16 14:04:52 ЛС | профиль | цитата
Нет.

В памяти сидит что-то, что это сильно связано с Z-ордером.
Типа, если среда пытается работать с линком, а элемент-оригинал она "еще не знает".

Ничего конкретного не знаю, в общем.
И почему это настолько неисправимо - тоже.
карма: 9

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#15: 2013-03-16 14:22:26 ЛС | профиль | цитата
Ясно, короче -- темный лес.
карма: 22

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