Как программно манипулировать всплывающим меню на нескольких динамических виджетах в Progress - PullRequest
3 голосов
/ 14 февраля 2012

Язык: Прогресс 10.1C

У меня есть форма Windows, и на ней я динамически создаю несколько виджетов (в этом случае переключатели). Я могу создать что угодно от 0 до 64 виджетов, в зависимости от того, сколько у пользователя есть в текущей коллекции. Когда пользователь переходит из одной коллекции в другую, виджеты удаляются или создаются по мере необходимости. Размер формы изменится в зависимости от количества отображаемых виджетов.

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

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

Мне не удается открыть одно всплывающее меню, которое реагирует на щелчок правой кнопкой мыши всех виджетов. Я попытался создать одно всплывающее меню, а затем, когда я создаю каждый динамический виджет, я установил его атрибут всплывающего меню в это меню. Проблема в том, что меню может быть применено только к одному виджету. После того, как я назначил его на Widget1, я не могу назначить его на Widget2. Это заставляет задуматься о создании отдельного, но идентичного меню для каждого виджета. И как виджеты будут уничтожены и воссозданы, так и эти меню будут. За один сеанс я создам и уничтожу сотни или даже тысячи этих идентичных меню, в то время как пользователь может использовать одно из них один или два раза. Или нет совсем. Так что это не кажется мне хорошим вариантом.

Моим следующим решением было бы создание единого меню, которое я мог бы вызывать программно, но все попытки программно открыть меню провалились. Я попытался ПРИМЕНИТЬ «MENU-DROP» К МЕНЮ MyMenu и другим подобным вещам, и я не могу на всю жизнь понять, как это сделать. Мне также очень трудно искать информацию по этому вопросу. Как будто никто еще не пробовал это, и в тех редких случаях, когда кто-то спрашивал об этом, не было удовлетворительных ответов. Я подозреваю, что это не может быть сделано.

Испытывая все эти вещи, у меня также были бесконечные проблемы с событиями MOUSE-MENU-DOWN, MOUSE-MENU-UP и MOUSE-MENU-CLICK. МЫШЬ-МЕНЮ-ЩЕЛЧОК, кажется, никогда не происходит, во всяком случае, для моих динамических виджетов Я не могу понять, почему. MOUSE-MENU-UP иногда происходит, но это зависит от того, что происходит в MOUSE-MENU-DOWN и других событиях виджетов, а также их родителей. Я не был в состоянии точно определить, когда он будет или не будет стрелять, это очень нелогично. MOUSE-MENU-DOWN - единственный, на кого я могу рассчитывать при стрельбе.

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

Имея статическое всплывающее меню в рамке по умолчанию, я могу щелкнуть правой кнопкой мыши виджеты, и меню появится, но оно появится, если я щелкну в любом месте рамки. Я могу отключить меню, а затем в событии виджета правой кнопкой мыши, я включаю его. Это работает очень хорошо с первого раза; если я щелкаю в любом месте кадра, ничего не происходит (меню отображается), но если я нажимаю на свой виджет, меню включается и всплывает. Ура! Но теперь меню включено, и теперь оно появляется, если я щелкну правой кнопкой мыши где-нибудь, на кнопках, пустом месте, индикаторах выполнения и т. Д. Когда я снова отключу это? После того, как меню появилось, пользователь может щелкнуть в любом месте, и меню исчезнет. При закрытии меню событие не срабатывает, поэтому я застрял.

Извините за длинные разговоры, я кратко повторю вопрос: я хочу иметь одно всплывающее меню, которое появляется, когда пользователь щелкает правой кнопкой мыши один из нескольких динамически создаваемых виджетов.

<Ч />

Используя ответ Тома, я так и реализовал:

/* Somewhere in Control Definitions... */
DEFINE MENU m_Popup 
       MENU-ITEM m_Test1     LABEL "Test 1"       
       MENU-ITEM m_Test2     LABEL "Test 2".     

/* Somewhere, where I need to dynamically create the widgets. */
/* Loop through the items in the temp table and create a widget for each. */
FOR EACH ttItem BY ttItem.ItemName:
  CREATE TOGGLE-BOX hWidget
    ASSIGN 
           FRAME        = FRAME DEFAULT-FRAME:HANDLE
           LABEL        = STRING(ttItem.ttItemName)
    TRIGGERS:
      ON MOUSE-MENU-DOWN PERSISTENT RUN GetMenu IN THIS-PROCEDURE.
    END TRIGGERS.
END.

/* If the user right-clicks on any one of the widgets, this procedure */
/* is run with SELF being the widget that was clicked on. */
PROCEDURE GetMenu:
  /* Remove the menu from its current owner and assign it to SELF. */
  MENU m_Popup:OWNER:POPUP-MENU = ?.
  SELF:POPUP-MENU = MENU m_Popup:HANDLE.
END PROCEDURE.

/* The user clicks on one of the menu items  */
/* Here SELF is the menu item that was clicked. I can */
/* get m_Popup from SELF:PARENT and the widget it was */
/* was assigned to from SELF:PARENT:OWNER.            */
ON CHOOSE OF MENU-ITEM m_Test1 
DO:
  MESSAGE "You selected " SELF:LABEL " for " SELF:PARENT:OWNER:LABEL.
END.

1 Ответ

3 голосов
/ 14 февраля 2012

Мой приятель Майк Фехнер (который в настоящее время не работает на SO, но занимается этим гораздо больше, чем я) говорит мне, что, хотя этот пример статичен, что-то очень похожее должно работать:

Procedure getMenu:

  DEFINE INPUT PARAMETER phWidget AS HANDLE NO-UNDO.
  DO WITH FRAME {&FRAME-NAME}:
      FILL-IN-1:POPUP-MENU = ? .
      FILL-IN-2:POPUP-MENU = ? .
      FILL-IN-3:POPUP-MENU = ? .
  END.

  phWidget:POPUP-MENU = MENU POPUP-MENU-FILL-IN-1:HANDLE  .

END procedure.

НА ПРАВО-МЫШЬ-ВНИЗ из всех трех введенных вами слов: «ВЫБЕРИТЕ getMenu (SELF)».украсть всплывающее меню у кого бы то ни было.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...