Запрет повторного запуска процедуры из фрейма.

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Запрет повторного запуска процедуры из фрейма.

Сообщение kreator »

Нужно запретить повторный запуск некоторых процедур из меню фрейма (на тулбаре их нет, но вдруг), ключевое здесь слово - фрейм. Естественно, окно MDI, запуск start'ом. Есть в Кларионе такая возможность? Может шаблон? Не проблема руками контролировать глобальную переменную, в которую помещается значение треда. Но если есть уже правильный путь...
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8031
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Запрет повторного запуска процедуры из фрейма.

Сообщение Игорь Столяров »

Так вот же ископаемые терки на эту тему: http://forum.clarionlife.net/phpbb/view ... %B0#p11254

Здесь возможны вариации на тему, что делать если MDI окно открыто:
1. Можно задизайблить Items для его повторного открытия (самое простое);
2. Можно при повторном вызове послать в ранее открытое окно событие, развернуть и сделать его активным (мой случай).
Make Clarion Great Again ! 😎
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Запрет повторного запуска процедуры из фрейма.

Сообщение RaFaeL »

У нас используется что-то на основе ISemaphore
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Запрет повторного запуска процедуры из фрейма.

Сообщение Дед Пахом »

Мы как отцы учили - глобальные переменные :-)
С уважением, ДП
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Запрет повторного запуска процедуры из фрейма.

Сообщение Yufil »

В комплекте FreeABC есть подходящий шаблон (ThreadLimit, файл vsa_thrx.tpw), рекомендуется

Если не подходит - внутри вызываемой процедуры (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 
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Запрет повторного запуска процедуры из фрейма.

Сообщение kreator »

Игорь Столяров писал(а):Так вот же ископаемые терки на эту тему: 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().
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Запрет повторного запуска процедуры из фрейма.

Сообщение Admin »

Вы еще учитывайте что к примеру:
Можно запускать только одну копию BrowseGoods но давать возможность запустить ее же с GlobalRequest = SelectRecord
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Запрет повторного запуска процедуры из фрейма.

Сообщение kreator »

Admin писал(а):Можно запускать только одну копию BrowseGoods но давать возможность запустить ее же с GlobalRequest = SelectRecord
Сделано всё по уму в этом шаблоне. GlobalRequest = SelectRecord учитывается. Мне понравилось, что шаблон только для одной процедуры (данный шаблон), и свой текст лепит в процедуру, не затрагивая фрейм, глобальные переменные, dll... И потом. Поскольку такой запрет нужен для специфических процедур, то, в общем-то логично, что запрет полный, и это решает процедура. У меня так - процедуры не должны вызываться два раза ниоткуда. Проверка на GlobalRespect, в принципе, лишняя даже.
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5238
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Запрет повторного запуска процедуры из фрейма.

Сообщение finsoftrz »

Игорь Столяров писал(а): 2. Можно при повторном вызове послать в ранее открытое окно событие, развернуть и сделать его активным (мой случай).
Плюсану, делаю аналогично. Для справочников и журналов документов. Отчеты (окна с расчетом каких-либо сводных итогов) не ограничиваются. Отслеживается по глобальной очереди открытых окон/потоков. Есть еще близкая по смысловой нагрузке тема - переключение в поток открытого документа при попытке его повторного открытия.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
Артур
Ветеран
Сообщения: 329
Зарегистрирован: 01 Июнь 2006, 12:33
Откуда: Новороссийск

Запрет повторного запуска процедуры из фрейма.

Сообщение Артур »

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
Попробовал, работает, но окно не вытаскивается наверх
Любить и обещать ничего не стоит
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Запрет повторного запуска процедуры из фрейма.

Сообщение Yufil »

Если не вытаскивается, надо Event:GainFocus отрабатывать.
А лучше всего посмотреть файл Vsa_thrx.tpw с шаблоном из FreeABC, там всё чётко прописано.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Запрет повторного запуска процедуры из фрейма.

Сообщение Yufil »

Кому не хочется искать и грузить шаблон, выложил на
https://mega.nz/#!ckZEQLKL!EgbAAOB_OXuG ... 9pAI9a37UM
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Запрет повторного запуска процедуры из фрейма.

Сообщение kreator »

Артур писал(а):Попробовал, работает, но окно не вытаскивается наверх
Вытаскивается. В шаблоне вытаскивается. Вы неправильно что-то делаете.
Вот код, который делает этот шаблон:

Код: Выделить всё

  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. :)
Аватара пользователя
Артур
Ветеран
Сообщения: 329
Зарегистрирован: 01 Июнь 2006, 12:33
Откуда: Новороссийск

Запрет повторного запуска процедуры из фрейма.

Сообщение Артур »

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