2014-02-12 5 views
0

Delphi 메뉴의 일반적인 경우는 다음과 같습니다. TPopupMenu.Popup을 호출하여 OnClick 핸들러를 이전에 할당하면 이제 OnClick 핸들러는 "메뉴 결과"를 반환합니다. 다른 방법으로 popupmenu를 표시해야합니다. 메뉴에 N 개의 항목을 표시하고 OnClick을 만들지 않고 클릭 한 색인 (0에서 N-1)을 가져 오려고합니다. 그것을하는 방법?Delphi : PopupMenu 결과를 반환하는 함수를 작성하십시오.

내가 클릭 한 메뉴 항목의 색인을 반환하는 function DoMenu(List: TStringList): Integer으로 만들고 싶습니다 (항목은 List입니다).

+0

이것은 이상하게 보입니다. Delphi 메뉴 객체는 이벤트 중심 모델을 제공합니다. 동기 모델이 필요합니다. 이를 위해 원시 Windows API를 사용하십시오. –

답변

3

TPopupMenu.Popup() 정보를 제공하지 않습니다. TPM_RETURNCMD 플래그를 지정하여 Win32 TrackPopupMenu() 함수를 직접 호출해야합니다. 이렇게하면 색인이 아닌 ID의 항목이 클릭되지만 필요한 경우 ID를 사용하여 색인을 수동으로 결정할 수 있습니다.

또는 당신은 단순히 각 메뉴 항목에 개인 OnClick 이벤트 핸들러를 할당하고, OnClick 처리기에 대한 인덱스를 할당하고 할 수 있다는 Integer에 대한 포인터 주위에 전달하는 TPopupMenu.Tag 특성 (또는 다른 방법)을 사용할 수 있습니다 Popup() 종료 후 Integer 값을 반환하십시오. 실제로 구현하는 것이 어렵지 않습니다.

0

그런 기능을했습니다.

function DoShowPopupMenu(List: TTntStringList; Pnt: TPoint; hWnd: THandle): Integer; 
var 
    hMenu: THandle; 
    n: integer; 
begin 
    hMenu:= CreatePopupMenu; 
    for n:= 0 to List.Count-1 do 
AppendMenuW(hMenu, MF_ENABLED or MF_STRING or MF_UNCHECKED, 100+n, PWChar(List[n])); 

    n:= Integer(TrackPopupMenu(hMenu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RETURNCMD, 
Pnt.X, Pnt.Y, 0, hWnd, nil)); 
    SendMessage(hWnd, WM_NULL, 0, 0); 

    if n>0 then 
Result:= n-100 
    else 
Result:= -1; 

    for n:= List.Count-1 downto 0 do 
DeleteMenu(hMenu, n, MF_BYCOMMAND); 
    DestroyMenu(hMenu); 
end; 
+0

'TTntStringList'는 Delphi7의 유니 코드 문자열 목록입니다. 새로운 IDE에'TStringList' 사용 – Prog1020

관련 문제