OpenEdge ABL / Progress 4GL を使用しています。行が取り込まれたブラウザー ウィジェットがあります。行を左クリックすると、その行が強調表示され、その行がフォーカスされます。別の行を右クリックして「左クリック」(右クリックした行にフォーカスを移動する) を実行してから、右クリックします。
6948 次
4 に答える
1
マウス イベントについては、ABL リファレンスを確認してください (10.2B ABL リファレンス ガイドの 1834 ページ)。
通常の方法は、「ON event-name OF widget-name」で問題のイベントをキャプチャし、別のイベントをウィジェットに適用し (「mouse-select-click」を b-name に適用)、AVM に無視するように指示することです。 「RETURN NO-APPLY」によるオリジナルイベント。
次のようになります。
ON MOUSE-MENU-CLICK OF b-name
DO:
APPLY "mouse-select-click" TO SELF.
RETURN NO-APPLY.
END.
警告: 右クリックがトリガーするイベントがわからないため、このコードを適合させる必要があります。
于 2012-01-20T15:31:08.550 に答える
0
主な回答を拡張するために、いくつかの追加のメモとサンプル コードを次に示します。
1. ヘッダーとタイトルの高さに注意する必要があります。
2. 標準のブラウズ機能があれば、動的にメニューを追加できます。
3. 複数選択ブラウザの動作は少し異なります。
ON 'right-mouse-down':U ANYWHERE DO:
RUN set_focus (SELF).
IF SELF:TYPE = 'BROWSE' THEN DO:
RETURN NO-APPLY.
END.
ELSE DO:
APPLY 'menu-drop' TO SELF.
END.
END.
PROCEDURE set_focus.
DEF INPUT PARAM i_object AS HANDLE NO-UNDO.
DEF VAR l_was_row_one_selected AS LOG NO-UNDO.
DEF VAR l_header_y AS DEC NO-UNDO.
DEF VAR w_browse_title_bar_height AS DEC NO-UNDO INITIAL 19. /* determine this for your UI */
DEF VAR o_labels AS CHAR NO-UNDO.
DEF VAR o_procedures AS CHAR NO-UNDO.
DEF VAR h_menu AS HANDLE NO-UNDO.
DEF VAR h_menu_item AS HANDLE NO-UNDO.
DEF VAR l_count AS INT NO-UNDO.
/* given an object ... */
IF i_object:TYPE = 'browse' THEN DO:
IF i_object:NUM-SELECTED-ROWS = 0
THEN ASSIGN l_was_row_one_selected = FALSE.
ELSE ASSIGN l_was_row_one_selected = i_object:IS-ROW-SELECTED(1) NO-ERROR.
i_object:SELECT-ROW(1) NO-ERROR.
IF ERROR-STATUS:ERROR THEN RETURN.
l_header_y = MAX(1,i_object:FIRST-COLUMN:Y). /* in case there are no column headers */
IF i_object:TITLE <> ? THEN l_header_y = l_header_y - w_browse_title_bar_height.
IF l_was_row_one_selected = FALSE THEN i_object:DESELECT-SELECTED-ROW(1) NO-ERROR.
/* this section selects the correct row, based on where it was clicked, minus the height of the headers divided by row height */
i_object:SELECT-ROW(
INT(
1 +
TRUNC(
(LAST-EVENT:Y - l_header_y) / i_object:FIRST-COLUMN:HEIGHT-PIXELS
,0)
)
)
NO-ERROR.
APPLY 'ENTRY':u TO i_object. /* to get focus properly */
APPLY 'VALUE-CHANGED':u TO i_object.
/* use some rule to find associated dynamic menu items, e.g. maintenance options, finding related data*/
RUN find_menu_stuff (i_object:NAME, OUTPUT o_labels, OUTPUT o_procedures).
IF o_labels = '' THEN RETURN.
/* this finds a popup menu, if any */
h_menu = i_object:POPUP-MENU NO-ERROR.
IF VALID-HANDLE(h_menu) THEN RETURN. /* already created previously */
/* create a popup menu */
CREATE MENU h_menu.
ASSIGN
h_menu:POPUP-ONLY = TRUE
i_object:POPUP-MENU = h_menu
.
/* add the standard maintenance options (they still may not be supported though) */
DO l_count = 1 TO NUM-ENTRIES (o_labels):
IF ENTRY(l_count,o_labels) = 'Rule' THEN DO:
CREATE MENU-ITEM h_menu_item
ASSIGN
SUBTYPE = 'RULE'
PARENT = h_menu
.
END.
ELSE DO:
CREATE MENU-ITEM h_menu_item
ASSIGN
PARENT = h_menu
LABEL = ENTRY(l_count,o_labels)
SENSITIVE = TRUE
TRIGGERS:
ON CHOOSE PERSISTENT RUN pp_apply_maint_action IN THIS-PROCEDURE (SELF, ENTRY(l_count,o_procedures)).
END TRIGGERS.
END.
END.
END.
IF VALID-HANDLE(h_menu)
THEN APPLY 'menu-drop' TO h_menu.
/* MENU-DROP - Supported only when the POPUP-ONLY attribute is set to TRUE and the
menu is set as a popup for some other widget */
END PROCEDURE.
PROCEDURE find_menu_stuff.
/* do lookups or other general or specific things here */
END.
于 2012-06-12T08:57:37.920 に答える
0
基本的に、次のようにトリガーを定義する必要があります。
ON RIGHT-MOUSE-CLICK OF myBrowseRow DO:
APPLY "ENTRY" TO myBrowse IN FRAME myFrame.
/* Code to focus a particular row in the browse. */
APPLY "ENTRY" TO SELF IN BROWSE myBrowse.
END.
問題は、そのトリガーをブラウズ内のすべての行に追加する必要があることです。これは、ブラウズ自体にのみトリガーを設定した場合、どの行が右クリックされたかを知ることができないためです...
于 2012-01-20T15:35:16.107 に答える