0

OpenEdge ABL / Progress 4GL を使用しています。行が取り込まれたブラウザー ウィジェットがあります。行を左クリックすると、その行が強調表示され、その行がフォーカスされます。別の行を右クリックして「左クリック」(右クリックした行にフォーカスを移動する) を実行してから、右クリックします。

4

4 に答える 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 に答える