2014-12-30 5 views
2

먼저 넷 전체를 살펴본 결과 동적으로 생성 된 메뉴 항목을 삭제할 수 없습니다. Delphi XE 사용. 나는 (운동 SubMenuName의 목적을 위해 'Test1을'이다, 따라서 항목을 작성합니다.델파이에서 동적으로 생성 된 메뉴 항목을 삭제할 수 없습니다.

MenuItemCreated := TMenuItem.Create(PopupMenu1); 
MenuItemCreated.Caption:= SubMenuCaption 
MenuItemCreated.Hint := SubMenuHint; 
MenuItemCreated.Name := SubMenuName; 
MenuItemCreated.OnClick := SubMenuClick; 
MenuItemCreated.AutoHotkeys := maManual; 
MySubMenu.Add(MenuItemCreated); 

이 하위 메뉴 (들) 생성을 사용하여 아무런 문제가 없다가 정상적으로 작동하고, 나는 식별 SubMenuClick 절차 .

// Get rid of the menu items created 
    While MySubMenu.Count > 0 do 
    begin 
    Itemtodelete := MySubMenu.Items[0]; 
    FreeandNil(ItemtoDelete); 
    end; 

내가 넣어 가지고 : 거기에 너무 문제없이 올바른 하위 메뉴 항목은 내가 다음 일은 (나는 많은 변화를 시도하고 있지만)이 코드를 사용하여 동적으로 생성 된 하위 메뉴를 해제하도록되어 응용 프로그램 로그 아웃이다 showmessage()에서 디버그 라인은 freeandnil'd 인 메뉴 아이템의 컴포넌트 이름을 보여 주며 내가 기대했던 것, 즉 'Test1'과 내가 만든 다른 것들 디. 그런 다음 내 응용 프로그램에 다시 로그인합니다 (아직 실행 중이지만 로그 아웃 상태 인 경우). 그런 다음 소프트웨어는 이름이 같은 동일한 하위 메뉴를 다시 만들려고합니다 (응용 프로그램과 관련하여 변경된 사항이 없으며 이전에 (아마도 가정용으로) 처분 되었음). 나는 즉시 제기 된 예외를 얻을 :

오류 : Test1을 명명 된 구성 요소는 이미 내가 나중에 같은 이름을 다시 만들 수 있도록 하위 메뉴 항목을 처리하는 방법에 대한 완전한 딱하다

존재한다.

도움을 주시면 감사하겠습니다.

감사합니다,

답변

3

당신이 말하지 않았으므로 MySubMenu가 PopupMenu1의 MenuItem이라고 가정해야합니다. 그렇지 않으면 명확히하십시오. MySubMenu의 모든 메뉴 항목을 삭제하고 자신의 메모리를 해제

procedure TForm5.Button2Click(Sender: TObject); 
begin 
    MySubMenu.Clear; 
end; 

:

나중에 다시 재현하기 위해 MySubMenu에서 항목을 삭제하기 위해서는 Clear 메서드를 호출하는 easyest입니다.

나중에 항목을 다시 만들려면 항목 메모리를 확보하지 않아도 메모리를 해제하지 않은 상태에서 Delete() 또는 Remove()를 사용할 수 없습니다. 이는 도움말에 설명되어 있습니다 : 당신이 메모리를 직접 해제해야합니다 이러한 방법으로

http://docwiki.embarcadero.com/Libraries/XE7/en/Vcl.Menus.TMenuItem.Delete http://docwiki.embarcadero.com/Libraries/XE7/en/Vcl.Menus.TMenuItem.Remove

, 당신은 메뉴 항목을 다시하기 전에. 그러나, 당신은 단지 아이템을 확보 할 수 있습니다, 심지어 삭제 제거를 호출 할 필요는 없습니다 :

procedure TForm5.Button2Click(Sender: TObject); 
var 
    mi: TMenuItem; 
begin 
    while MySubMenu.Count > 0 do 
    begin 
    mi := MySubMenu.Items[0]; 
    mi.Free; 
    end; 
end; 

FreeAndNil를 호출 할 필요가 없습니다. 이 마지막 옵션은 메뉴 항목을 다시 만들 때 문제가있는 것처럼 보입니다. 해제하지 않고 삭제() 또는 제거()를 사용할 때를 제외하고는 오류를 재현 할 수 없습니다.

0

팝업 메뉴 항목을 소유하고 있기 때문에 KB, 당신은 그것을 해제하지 않습니다. FreeAndNil 대신에 전체 While 루틴 대신 MySubMenu.Delete (0) 또는 더 적절하게 MySubMenu.Items.Clear를 사용하십시오.

응용 프로그램 종료시 팝업 메뉴를 통해 메뉴가 지워지므로 메뉴를 다시 작성하지 않는 한 수동으로 수행 할 필요가 없습니다.

+0

톰, 감사합니다. MySubMenu는 PopupMenu1의 메뉴 항목입니다. MySubMenu.Clear; 여전히 같은 오류가 발생합니다. 오류 : 하위 메뉴 항목을 다시 만들려고하면 구성 요소 Test1이 이미 존재합니다. mi : = MySubMenu.Items [0]; mi.Free; 나는 이전에 이것을 시도했지만 하위 메뉴 항목을 다시 만들려고 할 때 여전히 오류가 발생합니다. Mike, MySubMenu.Clear가 컴파일되지만 하위 메뉴 항목을 다시 만들 때 동일한 오류가 반환됩니다. 이전에 MySubMenu.Delete (0)을 시도했지만 하위 메뉴 항목을 다시 만들 때 동일한 오류가 발생합니다. – user3698371

+0

처음에 항목의 이름을 지정하는 이유는 무엇입니까? 혹시 FindComponent ('Test1')를 부르는가? 그렇지 않다면 이름은 중요하지 않습니다. 이름을 비워 두는 것이 가장 좋습니다. 이름으로 메뉴 항목을 살펴 본다면, 충돌하는 이름으로 다른 구성 요소를 찾아서 그것에 대해 뭔가 할 필요가 있습니다. 예를 들어 모든 것을 더 의미있는 이름으로 지정하십시오. - Rob Kennedy 43 분 전 – user3698371

+0

Rob, 댓글에 'Answer'(틀 렸습니다)를 삭제했기 때문에 귀하의 코멘트를 다시 삽입했습니다. 삭제하기 전에 댓글을 달았습니다. 혼란에 사과드립니다. – user3698371

관련 문제