На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Работа с панелями задач в PanApi

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Работа с панелями задач в PanApi
 
1. Подскажите, какое событие должна обрабатывать задача (экземпляр TPanTask), чтобы своевременно заблокировать на панели кнопки, если пользователь снял флажок редактирования карты? Думал, что это ChangeData, но оказывается, что при снятии и установки флажков редактирования и выбора этот метод не вызывается.

2. Как заставить панель перерисоваться? При ChangeLanguage меняю заголовок панели, но добиться сразу же его перерисовки, что-то никак не удается. Название меняется только если свернуть/развернуть окно и т.п. действия. Вообщем возникает такая картинка:




Видно, что система уже перешла на русский, а моя панель "Work with multipoligon" (как впрочем и две собственные панели ГИС Карты) - по-прежнему продолжают отображаться на английском.

3. Что может приводить к блокировке кнопок панели?
Создаю кнопки функцией, например: InsertButton(PanelId, IDB_MPEXIT, MP_EXIT, 0, 0, 0, 1, TEXT("Exit"), TEXT("Close task")) или так InsertButton(PanelId, IDB_MPCHECK, MP_CHECK_TASK);
Вроде бы я по умолчанию кнопка активна, но затем панель вдруг делается серой.
Хотя в GetAction для кнопки MP_EXIT:

case MP_EXIT:
// Установить, что доступна всегда
comen.Enable(1);
return 1;

Что же может блокировать всю панель?
Изменено: Олег Касьянов - 05.02.2017 16:23:05
 
1.При снятии флажка редактирования карт, событие в Pantask не происходит.
2.Смена языка обрабатывается в EnableActionUn.
3.Тексты pantask(Delphi) для 12 версии были обновлены, просьба взять исходники от 02.02.2017.
Изменено: Татьяна Софинова - 06.02.2017 10:43:02
 
1.  Видно, что если запретить редактирование всех карт, то все кнопки редактора стразу становятся не доступны. Если событие при установке и снятии флажков "Редактирование карты" не происходит, то тогда как же задача "Редактор карты" оперативно реагирует на запрет редактирования карты?
 
Цитата
Татьяна Софинова написал:
1.При снятии флажка редактирования карт, событие в Pantask не происходит.
Это не совсем так Татьяна.
Отловить в ГИС Панораме можно абсолютно всё, в том числе движение мышки, запуск других задач и результат их выполнение
Так бы и написали, эта функция недокументирована  :D
Показываю на ролике эффект "отлова флажка" который хочет Олег

Отлов флажка read/only выполняется вот так (Олег, читай комментарии в коде, всё поймёшь)
Код
type
   TMyTask= class(TPanTask)
   private
     FWrite : boolean; // флажок редактирования карты (для примера основнной)
   public
     function    GetAction(comid : integer; run : integer) : HMAPACTION;
     procedure   ChangeData; override;
     destructor  Destroy; override;

     function PrepareMessage(amessage : integer; awparam : WPARAM;
       alparam : LPARAM; var retcode : integer) :integer;   override;  // переопределяем обработчик
  end;


function TMyTask.PrepareMessage(amessage: integer; awparam: WPARAM;
  alparam: LPARAM; var retcode: integer): integer;
var fflag : boolean;
begin
  if (amessage=$B040) and (awparam=0) then // отлавливаем событие активации кнопко на чужих задачах
  begin
    fflag := mapGetSiteEditFlag(FHMap, FHMap)<>0; // и всегда проверяем флаг
    if fflag<>FWrite then // если флаг сменился, зачит кто-то запустил задачу "Состав карты" и сменил флаг
    case byte(fflag) of    // обрабатывам (примитивно сообщением)
      1: ShowMessage('Основная карта в READ/WRITE');
      0: ShowMessage('Основная карта в READ ONLY');
    end;
    FWrite := fflag;  // запоминаем флаг
  end;

end;

procedure TMyTask.ChangeData;
begin
  inherited;
  FWrite := mapGetSiteEditFlag(FHMap, FHMap)<>0; // запоминаем начальное состояние статуса главной карты (можно Сита, можно всех ситов и.т.п)

end;


Цитата
Татьяна Софинова написал:
2.Смена языка обрабатывается в EnableActionUn.
Татьяна, немного не так.
Смена языка отлавливается вот этой экспортной функцией
Код
 // Извещение об изменени языка диалогов и меню
 procedure utsChangeLanguage(htask : HPANTASK; aparm : TTASKPARM);  stdcall;
где aparm.Language = новый язык. aparm

После неё, вызывается   EnableAction для того, чтобы программист "подсунул" название кнопок на нужном языке.
и вообще,  EnableAction вызывается по поводу и без повода при  любых изменениях панели, от движения мышки по кнопке (событие на Hint) и до сворачивания/разворачивания окна карты
Цитата
Олег Касьянов написал:
3. Что может приводить к блокировке кнопок панели?
Блокировка всех кнопок в цикле

========================
Я делаю очень просто .
1) создаю форму пустышку (которую потом погу вклчить в ЕХЕ файл для отладки без ГИС Панорамы)
2) на форме пустышке создаётся единственный TToolBar на котором я создаю кнопки и сеператоры
3) в каждую кнопку заполняю следующее
- в Hint русское название кнопки
- в Сaption английское название кнопки
- в Tag команду которая присваивается кнопке ( всмысле IDT_USER+ххх)
- в Enabled - активно/неактивность кнопки
- в Visible -  видимость/невидимость (использую для работы фоновых Action) вызываемых с форм уже при нажатой кнопке
4) в 2011 версии в кнопку загружал рисунок, который потом перерисовывал, теперь это делаю тупо для красоты
Рисунки в 12-й версии уже не рисуются специальными функциями, а просто загружаются в виде прозрачных картинок PNG с названием равным номеру команды.
В таком случае, ГИС панорама сама за картинками "следит"
Всё.

На подготовительном этапе делаю в цикле insertbuttonPNG (новая команда под 12ю версию)
На этапе EnabledAction нахожу по значению тега (который равен команде передаваемой мне через экспортную функцию) нужную кнопку и считываю с ней состояние Enabled
а также в зависимости от Fparam.Language возвращаю Панораме в структуре TTASKBUTTON  или значение caption (русский текст) или значение (Hint - английский текст)

Кстати, Caption и Hint самого TToolBar-а использую для русского/англ. названия самой задачи
Изменено: KFF - 17.02.2017 21:13:49
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Олег, бросай задачу мне на ящик (надеюсь не забыл на какой) я тебе все один раз сделаю по человечески
будешь использовать в качестве болванки в других задачах (в том числе для обучения подрастающего поколения программистов)
8)
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Здравствуйте. Возник похожий вопрос по работе с панелью задачи. При запуске задачи на панели по умолчанию доступны не все кнопки, и при выделении пользователем объектов, те кнопки которые были недоступны, становятся доступными, тут все хорошо. Но, когда объекты уже выделены, а пользователь закрыл панель задачи и открыл заново, то событие происходит правильное программа заходит в ветку с сообщением "True" , но кнопки так и остаются не активными?
Код
//-----------------------------------------------------------------------------
// Установить доступность инструментов панели задачи
//-----------------------------------------------------------------------------
int CMultiPoligonTask::EnableAction(int comid, TCommandEnabler & comen)
{
   // Проверка: это не наша команда?
   if (GetAction(comid, 0) == 0)
      return(0);

   switch (comid)    // Установить (при необходимости) доступность кнопок
   {                // По умолчанию - все доступны
      case MULTIPOLIGON_TASK:
         // Если панель Редактора активна
         if (MapWindow->GetPanelState(PanelId))
            // Поставить галочку в меню
            comen.SetCheck(1);
         else
            // Убрать галочку
            comen.SetCheck(0);
         return 1;

      case MP_CHECK_TASK:
      case MP_CREATE_TASK:
         // Доступно, если на карте есть выделенные объекты
         if (mapIsVectorMapEdit(HMap) != 0 && mapGetTotalSelectFlag(HMap) != 0)
         {
            comen.Enable(1);
            AfxMessageBox(L"True");
         }
         else {
            comen.Enable(0);
            
         }
         return 1;
      case MP_MAIN_TASK:
      case MP_FIND_TASK:
      case MP_INSERT_TASK:
      case MP_EXCLUDE_TASK:
      case MP_DELETE_TASK:
      case MP_DIVIDE_TASK:
      case MP_INFO_TASK:
         // Доступно, если есть карта, которую можно редактировать
         if (mapIsVectorMapEdit(HMap) != 0) comen.Enable(1);
         else comen.Enable(0);
         return 1;
      case MP_ERROT_LIST:
      case MP_EXIT:
         // Установить, что доступны всегда
         comen.Enable(1);
         return 1;
   }

   return 1;
}
 
Дарья, статус кнопкок в задаче PanTask программист должен запоминать самостоятельно куда то в свой код
В резиновый массив,  списки, теги кнопок на форме и.т.п (на ваш вкус).

Суть всей технологии - обмен событиями через экспортные функции между задачей и ГИС Панорамой.
То что разработчики обвлекли все эти экспортные функции в "шкурки" TPanTask TPanAction и.т.п, это исторически сложившаяся традиция.
По сути задачу можно написать используя исключительно свои экспортные функции для того чтобы Панорама могла вас о чём то оповещать и что-то вам передавать И экспортные функции самой Панорамы (mapassesXXX maptaskXXX) для обратной связи .


По Вашему вопросу
Цитата
Но, когда объекты уже выделены, а пользователь закрыл панель задачи и  открыл заново,  то событие происходит правильное программа заходит в  ветку с сообщением "True" ,
Вообще то при начальной инициализации кнопки нужно выставлять в статус который соответствует их предназначению в задаче.
Я имею ввиду следующее. Если кнопка "А" называется "работы с выделенными", то при запуске задачи Вы должны проверить функцией
mapTotalSeekObjectCount число уже выделенных объектов и выставлять не тупо FALSE а флаг по числу выделенных объектов.

 
Изменено: KFF - 25.10.2017 21:35:03
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
KFF - не вижу смысла запоминать статус кнопок. Приведенный код корректный. Должен работать.
Проверка числа объектов резко замедлит программу на больших объемах данных. ГИС сама должна сбросить выделение при отсутствии выделенных объектов.

Если сообщение приходит, то статус кнопки должен измениться. Но если, например, есть другая кнопка с тем же идентификатором и другим статусом, то она может изменить чужой статус.
Запрос статуса кнопки происходит при любых действиях с панелью и данными. Например, при нажатии\отжатии какой-то кнопки статус должен быть запрошен заново.
Если он опять запрашивается, но кнопка по-прежнему не "включилась", то может быть есть проблема, которая описана выше (дублирование идентификаторов?).
 
Спасибо, нашла в чем была проблема.
Изменено: Дарья Лунченко - 26.10.2017 09:27:44
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности