Запрет повторного запуска процедуры из фрейма.
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- ✯ Ветеран ✯
- Сообщения: 5159
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Запрет повторного запуска процедуры из фрейма.
Нужно запретить повторный запуск некоторых процедур из меню фрейма (на тулбаре их нет, но вдруг), ключевое здесь слово - фрейм. Естественно, окно MDI, запуск start'ом. Есть в Кларионе такая возможность? Может шаблон? Не проблема руками контролировать глобальную переменную, в которую помещается значение треда. Но если есть уже правильный путь...
We are hard at work… for you. 

- Игорь Столяров
- Ветеран движения
- Сообщения: 8028
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
Запрет повторного запуска процедуры из фрейма.
Так вот же ископаемые терки на эту тему: http://forum.clarionlife.net/phpbb/view ... %B0#p11254
Здесь возможны вариации на тему, что делать если MDI окно открыто:
1. Можно задизайблить Items для его повторного открытия (самое простое);
2. Можно при повторном вызове послать в ранее открытое окно событие, развернуть и сделать его активным (мой случай).
Здесь возможны вариации на тему, что делать если MDI окно открыто:
1. Можно задизайблить Items для его повторного открытия (самое простое);
2. Можно при повторном вызове послать в ранее открытое окно событие, развернуть и сделать его активным (мой случай).
Make Clarion Great Again ! 
- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Запрет повторного запуска процедуры из фрейма.
Мы как отцы учили - глобальные переменные 

С уважением, ДП
Запрет повторного запуска процедуры из фрейма.
В комплекте FreeABC есть подходящий шаблон (ThreadLimit, файл vsa_thrx.tpw), рекомендуется
Если не подходит - внутри вызываемой процедуры (mdi-окна) заводится переменная
Procname_thread Long(0), Static
Сразу после запуска проверяется
А перед выходом
Если не подходит - внутри вызываемой процедуры (mdi-окна) заводится переменная
Procname_thread Long(0), Static
Сразу после запуска проверяется
Код: Выделить всё
If Procname_thread <> 0 ! Если есть уже запущенная
! Можно вытащить окно уже запущенной задачи вперёд
SetTarget(, Procname_thread)
0{Prop:Active} = True
SetTarget
Post(Event:GainFocus,,Procname_Thread)
! И завершимся
Return Level:fatal ! Это в ABC
else
Procname_thread = Thread()
end
Код: Выделить всё
If ProcName_Thread = Thread()
ProcName_Thread = 0
End
-
- ✯ Ветеран ✯
- Сообщения: 5159
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Запрет повторного запуска процедуры из фрейма.
Искал же. Наверно, не по тем словам.Игорь Столяров писал(а):Так вот же ископаемые терки на эту тему: viewtopic.php?f=1&t=2340&p=11254&hilit=%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82+%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B0#p11254
Как отцы учили не пойду. Потому что естьДед Пахом писал(а):Мы как отцы учили - глобальные переменные
Спасибо, Юрий. Красиво реализовано.Yufil писал(а):В комплекте FreeABC есть подходящий шаблон (ThreadLimit, файл vsa_thrx.tpw), рекомендуется
We are hard at work… for you. 

- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Запрет повторного запуска процедуры из фрейма.
Ну, это те же яйца на самом деле.
PS.
Вопрос, на самом деле, в другом - кто должен решать, можно ли запускать вторую копию? Если решает фрейм, то что-то вроде "if something_good then start(proc) end" где-то в коде фрейма, если же решает сама процедура, то "if something_bad then return level:notify" в коде WindowManager.Init().
PS.
Вопрос, на самом деле, в другом - кто должен решать, можно ли запускать вторую копию? Если решает фрейм, то что-то вроде "if something_good then start(proc) end" где-то в коде фрейма, если же решает сама процедура, то "if something_bad then return level:notify" в коде WindowManager.Init().
С уважением, ДП
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Запрет повторного запуска процедуры из фрейма.
Вы еще учитывайте что к примеру:
Можно запускать только одну копию BrowseGoods но давать возможность запустить ее же с GlobalRequest = SelectRecord
Можно запускать только одну копию BrowseGoods но давать возможность запустить ее же с GlobalRequest = SelectRecord
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- ✯ Ветеран ✯
- Сообщения: 5159
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Запрет повторного запуска процедуры из фрейма.
Сделано всё по уму в этом шаблоне. GlobalRequest = SelectRecord учитывается. Мне понравилось, что шаблон только для одной процедуры (данный шаблон), и свой текст лепит в процедуру, не затрагивая фрейм, глобальные переменные, dll... И потом. Поскольку такой запрет нужен для специфических процедур, то, в общем-то логично, что запрет полный, и это решает процедура. У меня так - процедуры не должны вызываться два раза ниоткуда. Проверка на GlobalRespect, в принципе, лишняя даже.Admin писал(а):Можно запускать только одну копию BrowseGoods но давать возможность запустить ее же с GlobalRequest = SelectRecord
We are hard at work… for you. 

- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5236
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 12 раз
- Поблагодарили: 65 раз
Запрет повторного запуска процедуры из фрейма.
Плюсану, делаю аналогично. Для справочников и журналов документов. Отчеты (окна с расчетом каких-либо сводных итогов) не ограничиваются. Отслеживается по глобальной очереди открытых окон/потоков. Есть еще близкая по смысловой нагрузке тема - переключение в поток открытого документа при попытке его повторного открытия.Игорь Столяров писал(а): 2. Можно при повторном вызове послать в ранее открытое окно событие, развернуть и сделать его активным (мой случай).
C6/C12, ШВС, tps/btrieve.
Запрет повторного запуска процедуры из фрейма.
Попробовал, работает, но окно не вытаскивается наверхYufil писал(а): Если не подходит - внутри вызываемой процедуры (mdi-окна) заводится переменная Procname_thread Long(0), Static Сразу после запуска проверяется Код: Выделить всёIf Procname_thread <> 0 ! Если есть уже запущенная ! Можно вытащить окно уже запущенной задачи вперёд SetTarget(, Procname_thread) 0{Prop:Active} = True SetTarget Post(Event:GainFocus,,Procname_Thread) ! И завершимся Return Level:fatal ! Это в ABCelse Procname_thread = Thread() end
Любить и обещать ничего не стоит
Запрет повторного запуска процедуры из фрейма.
Если не вытаскивается, надо Event:GainFocus отрабатывать.
А лучше всего посмотреть файл Vsa_thrx.tpw с шаблоном из FreeABC, там всё чётко прописано.
А лучше всего посмотреть файл Vsa_thrx.tpw с шаблоном из FreeABC, там всё чётко прописано.
Запрет повторного запуска процедуры из фрейма.
Кому не хочется искать и грузить шаблон, выложил на
https://mega.nz/#!ckZEQLKL!EgbAAOB_OXuG ... 9pAI9a37UM
https://mega.nz/#!ckZEQLKL!EgbAAOB_OXuG ... 9pAI9a37UM
-
- ✯ Ветеран ✯
- Сообщения: 5159
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Запрет повторного запуска процедуры из фрейма.
Вытаскивается. В шаблоне вытаскивается. Вы неправильно что-то делаете.Артур писал(а):Попробовал, работает, но окно не вытаскивается наверх
Вот код, который делает этот шаблон:
Код: Выделить всё
IF GlobalRequest <> SelectRecord ! ThreadLimit (ABC Free)
IF NOT ActiveThread:Preferences ! ThreadLimit (ABC Free)
ActiveThread:Preferences = THREAD() ! ThreadLimit (ABC Free)
vs::ThisThreadActive = THREAD() ! ThreadLimit (ABC Free)
ELSE ! ThreadLimit (ABC Free)
POST(EVENT:GainFocus,,ActiveThread:Preferences) ! ThreadLimit (ABC Free)
RETURN Level:Fatal ! ThreadLimit (ABC Free)
END ! ThreadLimit (ABC Free)
END ! ThreadLimit (ABC Free)
We are hard at work… for you. 

Запрет повторного запуска процедуры из фрейма.
Я работаю в 10 версии, шаблона у меня нет, а предложенный Yufil не регистрируется видимо из-за несоответствия версий, поэтому хотелось бы без шаблона обойтись..
Любить и обещать ничего не стоит