3

言語:Progress 10.1C

私はWindowsフォームを持っており、その上にいくつかのウィジェット(この場合はトグルボックス)を動的に作成します。現在のコレクションにユーザーが持っているdo-hickiesの数に応じて、0から64のウィジェットを作成できます。ユーザーがあるコレクションから別のコレクションに変更すると、ウィジェットは必要に応じて削除または作成されます。表示されるウィジェットの数に応じて、フォームのサイズが変更されます。

ユーザーは、メニューバー、ツールバー、またはキーボードショートカットからアクションを選択することにより、それらをいくつでもチェックし、チェックした項目に対して特定のプロセスを実行できます。ただし、ユーザーが1つのウィジェットを右クリックできるようにする必要もあります。これにより、チェックされているかどうかに関係なく、ワンクリックされたアイテムに対して実行できるアクションを含むポップアップメニューが表示されます。

それ自体、これは非常に簡単です。以前は、ユーザーが動的コントロールのいずれかをクリックするとポップアップする単一のポップアップメニューを使用して、この種のことを(他の言語で)行っていました。しかし、私は進行中のこの単純なことをするのに苦労しています:

すべてのウィジェットの右クリックに応答するポップアップメニューを1つ持つことができません。単一のポップアップメニューを作成してみました。次に、各動的ウィジェットを作成するときに、そのポップアップメニュー属性をこのメニューに設定しました。問題は、メニューが1つのウィジェットにしか適用できないことです。Widget1に割り当てたら、Widget2に割り当てることはできません。これにより、ウィジェットごとに別々であるが同一のメニューを作成することを考えるようになります。また、ウィジェットが破棄されて再作成されると、これらのメニューも破棄されます。1回のセッションで、これらの同一のメニューを数百または数千も作成および破棄しますが、ユーザーはそのうちの1つを1回または2回使用する場合があります。またはまったくありません。したがって、これは私には良い選択肢のようには思えません。

次の解決策は、プログラムでポップアップできる単一のメニューを作成することですが、プログラムでメニューをポップアップする試みはすべて失敗しました。APPLY "MENU-DROP" TO MENU MyMenuなどを試しましたが、一生、その方法がわかりません。また、これに関する情報を検索するのは非常に難しいと思います。まるで誰もこれを試したことがないかのようで、まれに誰かがそれについて尋ねた場合、満足のいく答えはありませんでした。これはできないのではないかと思います。

これらすべてを試している間、MOUSE-MENU-DOWN、MOUSE-MENU-UP、MOUSE-MENU-CLICKというイベントで無限の問題が発生しました。マウス-メニュー-クリックは、とにかく私の動的ウィジェットではなく、決して起こらないようです。理由がわかりません。MOUSE-MENU-UPが発生することもありますが、MOUSE-MENU-DOWNやウィジェットの他のイベント、およびウィジェットの親で何が発生するかによって異なります。いつ発砲するか、発砲しないかを正確に把握することはできませんでした。非常に直感的ではありません。MOUSE-MENU-DOWNは私が発砲を頼りにできる唯一のものです。

つまり、プログラムでメニューを表示することはできません。メニューの親を右クリックすることによってのみ表示できます。何百もの同じメニューが表示されないようにする唯一の方法は、ウィジェットの親にポップアップメニュー(デフォルトのフレームなど)を表示することです。

デフォルトのフレームに静的ポップアップメニューがある場合、ウィジェットを右クリックするとメニューが表示されますが、フレーム内の任意の場所をクリックすると表示されます。メニューを無効にしてから、ウィジェットの右クリックイベントで有効にします。これは最初は非常にうまく機能します。フレーム内のどこかをクリックしても何も起こりません(メニューが無効になります)が、ウィジェットをクリックすると、メニューが有効になり、ポップアップします。わーい!しかし、今ではメニューが有効になり、ボタン、空きスペース、プログレスバーなどの任意の場所を右クリックするとポップアップします。いつ再び無効にしますか?メニューがポップアップした後、ユーザーはどこでもクリックでき、メニューは消えます。メニューを閉じたときに発生するイベントがないので、行き詰まります。

長いとりとめのない話について申し訳ありませんが、質問を簡単に言い換えます。ユーザーが動的に作成された多数のウィジェットの1つを右クリックしたときにポップアップするポップアップメニューを1つ作成したいと思います。


トムの答えを使用して、これは私がそれを実装した方法です:

/* 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.
4

1 に答える 1

3

私の友人である Mike Fechner (彼は現在 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.

3 つすべてのフィルインの右マウス ダウンで、「RUN getMenu (SELF)」を実行します。誰からでもポップアップメニューを盗むために。

于 2012-02-14T15:48:26.917 に答える