2014-09-04 3 views
0

In Progress 11.3.2 (Developer Studio 3.7 - Eclipse 3.8.2), не используя точечную сеть:Как изменить активное приложение?

Как переключить фокус на другое окно/приложение/файл w?

В окнах 7/8 порядок того, какое ориентированное окно действует немного иначе, чем раньше, и не всегда показывает окно, которое вы хотите использовать во всех других приложениях.

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

Вы установили его в нормальное состояние с помощью WINDOW-STATE = WINDOW-NORMAL. Но как сфокусироваться на этом тоже?

ответ

1

Если запустить вторичные окна настойчивых вы можете сделать что-то вроде этого:

В вызывающем окне:

/* In definitions */ 
DEFINE VARIABLE ghSecondWindow AS HANDLE  NO-UNDO. 

/* In a trigger */ 
RUN secondWindow.w PERSISTENT SET ghSecondWindow. 

/* Whenever you want to shift focus */ 
RUN setFocus IN ghSecondWindow. 

В "SecondWindow":

PROCEDURE setFocus: 
    /* Replace FILL-IN-1 with any widget that can gain focus */ 
    APPLY "ENTRY" TO FILL-IN-1 IN FRAME {&FRAME-NAME}. 
END PROCEDURE. 

Однако, если вы не работая с постоянными окнами, вы все равно можете достичь этого, пройдя деревья виджета, сначала текущего окна, а затем второго окна (после того, как вы его локализировали).

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

DEFINE VARIABLE hWin AS HANDLE  NO-UNDO. 
DEFINE VARIABLE hWidget AS HANDLE  NO-UNDO. 

/* Get the first child (widget) of the session */ 
ASSIGN 
    hWin = SESSION:FIRST-CHILD. 

/* Loop through all widgets in the session */ 
loop: 
DO WHILE VALID-HANDLE(hWin): 

    /* We've identified the correct Window! */ 
    IF hWin:TYPE = "WINDOW" AND hWin:TITLE = "Secondary Window" THEN DO: 

     /* ** Very Ugly** this could use better error checking etc! */ 
     /* Get the second field-group of the window */ 
     /* This will depend on your layout with different frames etc */ 
     /* What we really have is WINDOW:DEFAULT-FRAME:FIELD-GROUP:FIELD-GROUP */ 
     /* Field groups are really only present in the widget tree - they lack visual */ 
     /* representation */ 
     /* Read about field-groups in the online help! */ 
     ASSIGN 
      hWidget = hWin:FIRST-CHILD:FIRST-CHILD:FIRST-CHILD. 

     /* Loop through all widgets of the field-group */ 
     DO WHILE VALID-HANDLE(hWidget). 

      /* We've found the correct fill-in, give it focus */ 
      IF hWidget:TYPE = "FILL-IN" AND hWidget:LABEL = "Fill 1" THEN DO: 
       APPLY "ENTRY" TO hWidget. 
       LEAVE loop. 
      END. 

      /* Next window of the correct window */ 
      hWidget = hWidget:NEXT-SIBLING. 

     END. 
    END. 
    /* Next widget of the session */ 
    hWin = hWin:NEXT-SIBLING. 
END. 

Вы могли бы также сделать «виджет дерево гуляет» рекурсивно, если вы чувствуете, как он!

Смежные вопросы