Я уже ответил на этот вопрос здесь: Как в OpenEdge ABL / Progress 4GL найти идентификатор строки, по которой в браузере щелкнули правой кнопкой мыши.
Я не уверен, какова политика с этим дублирующим вопросом, но я повторяю свой ответ здесь, я надеюсь, что все в порядке.
У меня была похожая ситуация; Я хотел ответить на щелчок правой кнопкой мыши в обзоре. Щелчок правой кнопкой мыши не выбирает строку, по которой вы щелкаете, поэтому мне пришлось программно выяснить, какой это была строка. Приведенная ниже кодировка определяет, по какой строке вы щелкнули, и выберет ее. Боюсь, это действительно так сложно.
Это происходит в событии MOUSE-MENU-DOWN просмотра:
DEFINE VARIABLE iRowHeight AS INTEGER NO-UNDO.
DEFINE VARIABLE iLastY AS INTEGER NO-UNDO.
DEFINE VARIABLE iRow AS INTEGER NO-UNDO.
DEFINE VARIABLE hCell AS HANDLE NO-UNDO.
DEFINE VARIABLE iTopRowY AS INTEGER NO-UNDO.
/* See if there are ANY rows in view... */
IF SELF:NUM-ITERATIONS = 0 THEN
DO:
/* No rows, the user clicked on an empty browse widget */
RETURN NO-APPLY.
END.
/* We don't know which row was clicked on, we have to calculate it from the mouse coordinates and the row heights. No really. */
SELF:SELECT-ROW(1). /* Select the first row so we can get the first cell. */
hCell = SELF:FIRST-COLUMN. /* Get the first cell so we can get the Y coord of the first row, and the height of cells. */
iTopRowY = hCell:Y - 1. /* The Y coord of the top of the top row relative to the browse widget. Had to subtract 1 pixel to get it accurate. */
iRowHeight = hCell:HEIGHT-PIXELS. /* SELF:ROW-HEIGHT-PIXELS is not the same as hCell:HEIGHT-PIXELS for some reason */
iLastY = LAST-EVENT:Y. /* The Y position of the mouse event (relative to the browse widget) */
/* calculate which row was clicked. Truncate so that it doesn't round clicks past the middle of the row up to the next row. */
iRow = 1 + TRUNCATE((iLastY - iTopRowY) / iRowHeight, 0).
IF iRow > 0 AND iRow <= SELF:NUM-ITERATIONS THEN
DO:
/* The user clicked on a populated row */
Your coding here, for example:
SELF:SELECT-ROW(iRow).
END.
ELSE DO:
/* The click was on an empty row. */
SELF:DESELECT-ROWS().
RETURN NO-APPLY.
END.
Надеюсь, это поможет.