Страница 1 из 1

SelChangedHandler

Добавлено: 15 мар 2012, 20:10
Juls
Помогите пожалуйста в следующем вопросе:

В программе прописана последовательность действий для SelChangedHandler. И запускаться SelChangedHandler должен только после выбора пользователем объектов на карте мышью. Сейчас естественно он запускается и после использования меню Query. Как деактивировать выполнение обработчика событий в данный момент?
Пробовала так

sub ToolHandler
if CommandInfo(CMD_INFO_TOOLBTN)=M_TOOLS_SELECTOR then
set Handler SelChangedHandler Off
end if
end sub

Никакого эффекта не достигла

Спасибо

Re: SelChangedHandler

Добавлено: 16 мар 2012, 06:05
SergS
можно включать свой SelChangedHandler при активизации окна карты (правда любого, в том числе и не содержащего необходимого) и отключать при активизации любого другого окна. Для этого включаем в программу процедуру:

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

Declare Sub WinFocusChangedHandler
Sub WinFocusChangedHandler
	 if windowinfo( CommandInfo(CMD_INFO_WIN), WIN_INFO_TYPE) = WIN_MAPPER then
                       set Handler SelChangedHandler On
               else
                       set Handler SelChangedHandler Off
               end if
 End Sub
а toolhandler трогать здесь не надо, он для другого предназначен

ну и не думаю, что возможно будет отследить каким образом формирутся выборка - мышью, командой меню или в результате работы какой-то сторонней прогаммы - все что удастся - это отследить факт изменения выборки

разве что запретить в том же WinFocusChangedHandler все пункты меню Запрос :) , ну и воостановив их при смене фокуса окна и при завершении работы прогаммы,
а как при этом отслеживать работу другух программ - хз, я заметил народ не утруждается применением предложения "Noselect"

Re: SelChangedHandler

Добавлено: 19 мар 2012, 18:03
Juls
Большое спасибо за ответ,

а для чего предназначен toolhandler?

и как спросить у пользователя хочет ли он продолжить выполнение приложения с SelChangedHandler или нет? Допустим если сделать следующим образом, то каждый раз в конце появляется диалоговое окно, но реакцией на Cancel является полное закрытие мапинфо, хотя нигде в программе нет ни End program ни End Mapinfo
sub SelChangedHandler
if (CommandInfo(CMD_INFO_SELTYPE)=1 or CommandInfo(CMD_INFO_SELTYPE)=3) then
note("tadah! :)")
end if

if Ask("Terminate?", "OK", "Cancel") then
set handler SelChangedHandler off
end if

end sub

Спасибо :)

Re: SelChangedHandler

Добавлено: 20 мар 2012, 05:13
SergS
Juls писал(а):а для чего предназначен toolhandler?
а фиг его знает :)
на мой взгляд, самый бесполезный handler из всех мапинфошных. позволяет получить только координаты курсора мыши при его использовании, ну и решать, что с этими координатами делать - только вам самим. Самостоятельно не вызывается, только выбором кнопки.

С приведенным кодом SelChangedHandler - тут, помоему, у вас встретилась ситуация, на которую слегка намекает help по MB:
Замечание: Процедура SelChangedHandler не может активизировать другие окна. Другими словами, в процедуре SelChangedHandler не могут быть выполнены такие операторы, как Note, Print или Dialog.
это все, конечно, не так. Точнее не всегда так, но в вашем случае сработало. Кстати, приведенный вами код у меня срабатывает без нареканий - без падений мапинфо - и честно не отключает SelChangedHandler при выборе Cancel. Соответственно - отключает в противоположном случае. :)