2012-02-14 2 views
3
에 복수의 동적 위젯에 팝업 메뉴를 조작하는 방법

언어 : 진행 10.1C는 프로그래밍 방식으로 진행

나는 윈도우 형태를 가지고 있고, 그것을 동적으로 (이 경우 전환 박스) 위젯의 숫자를 만들 수 있습니다. 사용자가 현재 콜렉션에서 가지고있는 hickies 수에 따라 0에서 64 개의 위젯을 만들 수 있습니다. 사용자가 컬렉션간에 변경되면 필요에 따라 위젯이 삭제되거나 생성됩니다. 양식은 표시되는 위젯 수에 따라 크기가 조정됩니다.

사용자는 메뉴 모음, 도구 모음 또는 키보드 바로 가기에서 작업을 선택하여 체크 된 항목에 대해 특정 수의 프로세스를 수행 할 수 있습니다. 그러나 사용자가 하나의 위젯을 마우스 오른쪽 버튼으로 클릭 할 수 있기를 원합니다.이 위젯은 체크 여부와 상관없이 클릭 한 항목 하나에서만 수행 할 수있는 팝업 메뉴를 가져와야합니다.

그 자체로 이것은 매우 간단합니다. 이전에는 사용자가 동적 컨트롤 중 하나를 클릭 할 때 팝업되는 단일 팝업 메뉴를 사용하여 이러한 종류의 작업을 수행했습니다 (다른 언어로). 진행 상황에서이 간단한 작업을하는 데 어려움을 겪고 있습니다.

모든 위젯의 오른쪽 클릭에 응답하는 팝업 메뉴를 가질 수 없습니다. 하나의 팝업 메뉴를 만들려고했는데 각각의 동적 위젯을 만들 때 팝업 메뉴 속성을이 메뉴에 설정했습니다. 문제는 하나의 위젯에만 메뉴를 적용 할 수 있다는 것입니다. 위젯 1에 할당하면 위젯 2에 할당 할 수 없습니다. 이것은 각 위젯을위한 별도의 메뉴를 만드는 것을 생각하게 만듭니다. 그리고 위젯들이 파괴되고 재창조 될 때,이 메뉴도 마찬가지입니다. 단일 세션에서 나는 수백 또는 수천 개의 동일한 메뉴를 만들고 파괴 할 것이며 사용자는 그 중 하나 또는 두 가지를 사용할 수 있습니다. 아니면 전혀. 그래서 이것은 나에게 좋은 선택처럼 보이지 않습니다.

내 다음 솔루션은 프로그래밍 방식으로 팝업 할 수있는 단일 메뉴를 만드는 것이지만 프로그래밍 방식으로 메뉴를 팝업하려는 모든 시도는 실패했습니다. 나는 시도했다 "메뉴 - 드롭"메뉴에 MyMenu 및 기타 유사한 것들을 적용 할 수 없으며 나는 그것을 할 수있는 방법을 알아낼 수 없다. 나는 또한 이것에 대한 정보를 찾는 것은 매우 어렵다. 마치 다른 사람이 해본 적이없는 것처럼 보입니다. 드물지만 누군가가 그것에 대해 물어 본 드문 경우는 만족스러운 답변이 없습니다. 나는 이것이 할 수 없다고 의심하고있다.

이러한 모든 것을 시도하면서도 마우스 - 메뉴 - 다운, 마우스 - 메뉴 - 업 및 마우스 - 메뉴 - 클릭 이벤트에 끊임없는 문제가있었습니다. MOUSE-MENU-CLICK은 절대 일어나지 않을 것 같습니다. 어쨌든 동적 위젯이 아닙니다. 나는 이유를 알 수 없다. MOUSE-MENU-UP은 때로는 발생하지만 MOUSE-MENU-DOWN과 위젯의 다른 이벤트는 물론 위젯의 부모에 따라 달라집니다. 그것이 언제 발사 될지 또는 발사되지 않을지를 정확히 파악할 수는 없었습니다. 그것은 매우 반 직관적입니다. 마우스 - 메뉴 다운 만 발사 할 수 있습니다.

그래서 : 프로그래밍 방식으로 메뉴를 표시 할 수 없으며 메뉴의 상위 항목을 마우스 오른쪽 버튼으로 클릭하면 표시됩니다. 수백 개의 동일한 메뉴를 사용하지 않으려면 위젯의 부모 (예 : 기본 프레임)에 팝업 메뉴가 있어야합니다.

기본 프레임의 정적 팝업 메뉴를 사용하면 위젯을 마우스 오른쪽 버튼으로 클릭하면 메뉴가 표시되지만 프레임의 아무 곳이나 클릭하면 나타납니다. 메뉴를 비활성화 한 다음 위젯의 오른쪽 클릭 이벤트에서 활성화 할 수 있습니다. 이것은 처음에는 아주 잘 작동합니다. 프레임의 아무 곳이나 클릭해도 아무 일도 일어나지 않습니다 (메뉴가 비활성화 됨). 그러나 위젯을 클릭하면 메뉴가 활성화되고 팝업됩니다. 예! 하지만 이제는 메뉴가 활성화되어 있고 버튼, 빈 공간, 진행률 막대 등을 마우스 오른쪽 버튼으로 클릭하면 팝업됩니다. 언제 다시 비활성화 할 수 있습니까? 메뉴가 팝업되면 사용자가 아무 곳이나 클릭 할 수 있고 메뉴가 사라집니다. 메뉴가 닫힐 때 발생하는 이벤트가 없으므로 막혔습니다.

오랫동안 불편을 끼쳐 드려 죄송합니다. 사용자가 몇 가지 동적으로 생성 된 위젯 중 하나를 마우스 오른쪽 버튼으로 클릭 할 때 나타나는 팝업 메뉴 하나가 필요합니다. 톰의 답변을 사용


이 내가 그것을 구현하는 방법입니다

/* 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. 
+0

언어는 무엇입니까? 기음#? – Perlnika

+0

죄송합니다, 진행 상황 4GL입니다. 나는 그 질문의 본문으로 넘어갈 것이다. – RobertT

+0

문제를 밝힐 수있는 샘플 코드가 있습니까? –

답변

3

내 친구 마이크 페 흐너 알려줍니다 (현재 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. 

을 세 필인의 당신의 마우스 오른쪽-DOWN ON "RUN getMenu (SELF)." 누구든지 팝업 메뉴를 훔칠 수 있습니다.

+0

그래, 틀렸어. ** 나는 팝업 메뉴를 재 지정 할 수있다. 그러나 나는 먼저 그것을 POPUP-MENU =?와 함께 기존 소유자로부터 할당 해제해야한다. 이것은 매우 편리합니다. 감사합니다! 내 컨트롤이 동적이며 임시 테이블에 저장되기 때문에 팝업 메뉴를 설정하기 위해 루프를 반복 할 수 있습니다. 따라서이 컨트롤이 아름답게 작동해야합니다. – RobertT

+0

안녕하세요, Tom, 내가 찾은 것을보세요! 위젯을 반복 할 필요가 없습니다. 메뉴 소유자 인 MENU m_Popup : OWNER : POPUP-MENU =?를 사용할 수 있습니다. 자막 : POPUP-MENU = MENU m_Popup : HANDLE.' – RobertT

관련 문제