Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#16: 2007-08-20 10:36:22 ЛС | профиль | цитата
Dilma, между прочим, в KOL есть такая фигня, как залочивание контрола при вызове динамических хэндлеров. И разлочивание (с безопасным возможным Free) после этого.

Видимо не устоял когда-то и Кладов против любителей не мыть руки перед едой

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

Но мы устоим
карма: 9

0
Ответов: 964
Рейтинг: 12
#17: 2007-08-27 07:03:24 ЛС | профиль | цитата
"... Мы сдали план по чегуну и стали !
- так и стоим, соять уже устали..."

Так что с первым элементом ? И как очисть список целиком
карма: 0

0
Ответов: 9906
Рейтинг: 351
#18: 2007-08-27 10:57:57 ЛС | профиль | цитата
AlexKir писал(а):
Так что с первым элементом ? И как очисть список целиком

Вопрос непонятен: первый элемент чего какой список очистить
карма: 9

0
Ответов: 964
Рейтинг: 12
#19: 2007-08-27 13:21:00 ЛС | профиль | цитата
Сори , ложная тревога при вызове из вне все вполне очищает и удаляет !
Значит просто нужно пересмотреть логику работы так чтобы все управление было снаружи .

Add(DoData,6351045,182,245)
{
link(onEventData,4794281:doWork1,[(271,251)(271,209)])
}
Add(ChildScrollBox,4794281,329,203)
{
}
BEGIN_SDK
Add(EditMulti,10736212,3,3)
{
WorkCount=3
Width=524
Height=375
link(doWork1,9705101:doEvent1,[(54,9)(54,132)])
link(doWork2,5267091:##clear,[(113,16)(113,139)])
link(doWork3,5267091:##delete,[(113,23)(113,146)])
}
Add(ScrollBox,13089319,469,336)
{
Width=78
Height=474
Align=1
Point(doVisible)
}
Add(ChildPanelEx,5267091,224,126)
{
Mode=1
link(index,5267091:##index,[(230,116)(214,116)(214,168)(230,168)])
}
BEGIN_SDK
Add(EditMultiEx,13748618,3,3)
{
WorkCount=#5:##add|7:##clear|8:##delete|
VarCount=#7:##index|
DataCount=#5:index|
Height=263
Point(##add)
Point(##index)
Point(##clear)
Point(##delete)
link(##add,16583166:doEvent1,[(43,9)(43,104)])
}
Add(Panel,6227834,259,14)
{
Left=2
Top=2
Width=51
Height=43
Align=2
Color=16777215
Point(doColor)
}
Add(Image,7285057,140,175)
{
Left=2
Top=2
Width=47
Height=39
Align=5
ViewStyle=1
}
Add(Hub,16583166,84,98)
{
OutCount=4
link(onEvent1,5787247:doData,[(135,104)(135,62)])
link(onEvent2,7285057:doLoad,[(128,111)(128,181)])
link(onEvent4,12191879:doText,[(145,125)(145,132)])
}
Add(Memory,9904725,259,56)
{
}
Add(DoData,5787247,154,56)
{
link(onEventData,9502022:doConvert,[(198,62)(198,62)])
}
Add(Img_Text,15914246,42,189)
{
Font=[MS Sans Serif,10,5,255,1]
DrawSource=1
link(Bitmap,7285057:ImageBitmap,[(48,179)(96,179)(96,224)(146,224)])
}
Add(Convertor,9502022,203,56)
{
link(onResult,9904725:doValue,[])
link(Data,13748618:index,[(209,30)(9,30)])
}
Add(Label,12191879,175,126)
{
Width=20
Color=15793151
link(Text,9904725:Value,[(181,107)(265,107)])
}
END_SDK
Add(Hub,9705101,105,126)
{
link(onEvent1,5267091:##add,[])
}
Add(ChildPanelEx,14820338,217,28)
{
}
BEGIN_SDK
Add(EditMultiEx,10791289,3,3)
{
}
Add(Panel,9403190,35,105)
{
Width=74
Height=23
Align=2
Color=8421504
Font=[MS Sans Serif,12,1,16777215,1]
Caption="Tools"
Alignment=2
Point(doColor)
}
END_SDK
END_SDK
Add(Button,3842272,84,231)
{
Left=100
Top=30
Caption="Test"
link(onClick,6351045:doData,[(142,237)(142,251)])
}
Add(Button,14667302,182,301)
{
Left=100
Top=105
Caption="Очистить "
link(onClick,4794281:doWork2,[(272,307)(272,216)])
}
Add(Button,1492978,182,364)
{
Left=100
Top=75
Caption="Удалить"
Data=Integer(0)
link(onClick,4794281:doWork3,[(272,370)(272,223)])
}
А если уж приспичит то можно делать, например через GlobalVar

карма: 0

0
Ответов: 9906
Рейтинг: 351
#20: 2007-08-27 14:03:16 ЛС | профиль | цитата
AlexKir, а топик прочитать в лом было

[size=-2]------ Добавлено в 14:03
Честное слово, здорово утомляет говорить одно и то же для каждого
карма: 9

0
Ответов: 964
Рейтинг: 12
#21: 2007-08-27 15:49:10 ЛС | профиль | цитата
Значит нужно завести толковый "официальный" ЧаВо расположенный так чтобы сразу бросался в глаза .
Зы
Все-же ХайАсм предлагает действительно совершенно особый способ программирования
и требует несколько другого образа мышления чем при написании классического кода .
А это значит что привычные приемы и связки могут сильно подвести .Следовательно
не плохо бы заняться методологией программирования на ХайАсме .
Показать типовые решения типовых задач или возможно стоит "сжульничать"
создавая обходные пути для наиболее часто и упорно повторяемых
логических ошибок-ловушек.
(в данном конкретном случае проблему может решить точка hiPanel doFree
или EditMultiEx ##onFree )

.
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#22: 2007-08-27 15:54:56 ЛС | профиль | цитата
несбыточное предложение
карма: 27
0
Ответов: 9906
Рейтинг: 351
#23: 2007-08-27 16:25:57 ЛС | профиль | цитата
AlexKir писал(а):
и требует несколько другого образа мышления чем при написании классического кода

Не согласен
Мне кажется, что он просто требует ПРАВИЛЬНОГО образа мышления, значительно более приближенного к ООП.

Грубо говоря, если ДРУГОГО, то и на классическом программировании ты мало что напишешь
И попробуйте мне проаргументировать обратное

[size=-2]------ Добавлено в 16:25
AlexKir писал(а):
в данном конкретном случае проблему может решить точка hiPanel doFree

Если проблема в понимании, что самого себя уничтожать нельзя, то такая точка врядли поможет
Даже берусь утверждать, что это вовсе не особенность HiAsm.
Так устроена жизнь в Программировании вообще.

Ну это так, ремарка для знатоков классического программирования
карма: 9

0
Администрация
Ответов: 15295
Рейтинг: 1519
#24: 2007-08-27 16:49:23 ЛС | профиль | цитата
ну на самом деле решить-то проблему точкой doFree конечно можно В кодах делается отложенное уничтожение, реально вызываемое только при выходе из контейнера и всего делов-то. Будет безусловно удобно
карма: 27
0
Ответов: 9906
Рейтинг: 351
#25: 2007-08-27 17:42:59 ЛС | профиль | цитата
По правильному, надо прилепить обработчик для CM_EXECPROC в цикл приема из очереди сообщений.
Который при hwnd=0 будет делать что-то типа такого
  if (Msg.hwnd=0)and(Msg.message=CM_EXECPROC) then 
    TObjectMethod(TMethod(wParam,lParam))
else
...
Тогда через PostMessage(0,CM_EXECPROC,...) можно сделать отложенное событие, или квази-синхронизацию потока...
А мультик превратить в элемент или IC со значительно более простыми действиями.

Отложенное событие может не только для самоудаления сгодиться.
карма: 9

0
Администрация
Ответов: 15295
Рейтинг: 1519
#26: 2007-08-27 17:53:41 ЛС | профиль | цитата
лучше отложить путем подсчета вложенности. Т.е. вошли в динамический мультик выполнили:
F.refs ++;[/code]

далее где-то внутри удаляем сами себя:
F.isDelete := true;[/code]

и наконец опять в мультике:
F.refs--;
if(F.refs = 0)and F.isDelete then
HDelete(MakeData(F), 0);
карма: 27
0
Ответов: 9906
Рейтинг: 351
#27: 2007-08-27 17:58:25 ЛС | профиль | цитата
AlexKir писал(а):
Значит нужно завести толковый "официальный" ЧаВо расположенный так чтобы сразу бросался в глаза

Для Писателей - не поможет.
Пример реализации был во втором посте топика, а чтение, Вами лично, произошло только после нелицеприятного напоминания.

А Читатели видели это уже несколько раз на форуме.
карма: 9

0
Ответов: 9906
Рейтинг: 351
#28: 2007-08-27 22:16:04 ЛС | профиль | цитата
Dilma писал(а):
Т.е. вошли в динамический мультик выполнили:
F.refs ++;[/code]
[/quote]
Возможно...
Только скорее наоборот: вызвали событие в THIEditMultiEx.onEvent/_Data
Подумать надо...

[size=-2]------ Добавлено в 22:16 [/size]
Подумал - не выходит ничего в этой технике.
Скажем, в таком примере: code_1863.txt - мне не очень понятно, кого и в какой момент надо лочить... :wink:
карма: 9

0
файлы: 1code_1863.txt [1.3KB] [353]
Администрация
Ответов: 15295
Рейтинг: 1519
#29: 2007-08-28 00:44:10 ЛС | профиль | цитата
а вот в такой действительно только по событию в очереди сообщений Видимо нужно разделять два метода:
1) с возможностью внутреннего вызова(всегда возможна синхронизация через очередь)
2) без возможности внутреннего вызова(не факт, что есть обработчик очереди)

и соответственно две точки doFree.
причем такую ситуацию:
code_1864.txt
видимо оставляем как нештатную
карма: 27
0
файлы: 1code_1864.txt [501B] [476]
Ответов: 9906
Рейтинг: 351
#30: 2007-08-28 09:32:32 ЛС | профиль | цитата
Dilma писал(а):
и соответственно две точки doFree

Расскажите, зачем нужны точки doFree

Если у пользователя отсутствует понимание того, что Уничтожить - несовместимо с продолжением Действий, так он будет делать delete, и создавать такие топики.
Писать в них про необходимость FAQ-а, и т.п..

А если понимает, то создать таймерную развязку - не есть проблема.

В первом случае, эффективной помощью является разъяснение ситуации (типа: если выстрелить себе в висок, то позвонить соседу уже ну никак не получится)
Если пользователь НЕ ХОЧЕТ вникать, то нет у меня желания помогать ему какими-то, работающими через раз, методами.

Во втором - можно подумать над созданием элемента, делающего то же самое (что и таймерная развязка) более эффективно. И более абстрактного - его применение не ограничивается именно уничтожением, и именно экземпляра мультика.
Ну, скажем, организовать событие после открытия модальной формы...
карма: 9

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