2017-02-07 14 views
0

Как удалить элемент меню, который я динамически добавил в меню?Delphi firemonkey Как удалить программный код программным путем?

добавить динамически пункты меню с, например:

m:=TMenuItem.Create(nil); 
m.Text:='bla bla bla'; 
mnuMain.AddObject(m); 

Я не мог найти любую функцию, чтобы удалить запись снова. Я попробовал удалить, бесплатно, removeobject и т. Д., И элемент все еще не удаляется и все еще отображается. Что это за трюк?

+0

'm.Free;' работает для меня, а также 'm.Release;' –

+0

@TomBrunberg: Работает и на меня, по крайней мере, с Win32 в качестве цели. – MartynA

+0

На какой платформе вы это пытаетесь? – DNR

ответ

0

Если вы добавляете элемент следующим образом:

var 
    M : TMenuItem; 
begin 
    M := TMenuItem.Create(nil); 
    M.Text := 'Bla Bla Bla'; 
    MenuBar1.AddObject(M); 

Тогда вы просто придав ему родитель, просто установить родитель из пунктов меню в nil ARC затем пикировать и делать все остальное, видя, как больше нет ссылок на объект

Просто напишите цикл, чтобы пройти, и установите для всех родителей значение nil/Или, если вы также нацеливаете Windows (или только Windows) в свой код, используйте DisposeOf или использовать директивы компилятора

var 
    I: Integer; 
begin 
    for I := MenuBar1.ItemsCount-1 downto 0 do 
    begin 
     {$IFNDEF AUTOREFCOUNT} 
     MenuBar1.Items[I].disposeOf; 
     {$ELSE} 
     MenuBar1.Items[I].parent := nil; 
     {$ENDIF} 
    end; 
end; 
+0

Не работает для меня, элемент подменю все еще присутствует и видимый. – Softtouch

+0

Теперь, когда я знаю, что вы не предназначаетесь для мобильных устройств, вы должны использовать 'disposeOf', который освободит объект, поскольку Windows не использует ARC, а управление памятью выполняется вручную. DisposeOf все равно будет работать на Mobile, но это менее предпочтительный метод, см. Ответ Дэвида здесь: http://stackoverflow.com/questions/27818697/how-to-free-a-component-in-android-ios/27819789# 27819789 –

+0

Ни один из методов, которые я пробовал, не удаляет элемент подменю, также не disposeOf. После disposeOf я нажимаю на меню, и его подменю все еще существует. Он удаляется только тогда, когда я устанавливаю видимое свойство элементов подменю на false и обратно на true. Нет проблемы с TMenuBar, элементы, добавленные к этому, будут удалены без каких-либо проблем, просто TMainMenu вызовет проблему для меня. – Softtouch

0

Я столкнулся с той же проблемой: TMenuItem.RemoveObject не работает, а частный член FContent TMenuView недоступен без трюков над RTTI. Вот почему я построю свой обходной путь, используя StringList, который хранит оставшееся меню дочерних элементов, прежде чем я называю TMenuItem.Clear:

function RemoveFromMenu(mnuMain: TMenuItem; const MenuText: string); 
var 
    list: TStringList; 
    c: integer; 
    Menu: TMenuItem; 
begin 
    list := TStringList.Create; 
    try 
    for c := 0 to mnuMain.ItemsCount - 1 do 
    if mnuMain.Items[c].Text <> MenuText then 
     list.Add(mnuMain.Items[c].Text); 
    mnuMain.Clear; 
    for c := 0 to list.Count - 1 do 
    begin 
     Menu := TMenuItem.Create(self); 
     Menu.Text := list[c]; 
     Menu.OnClick := mnuMainSubMenuClick; // The menu event handler 
     mnuMain.InsertObject(0, Menu); 
    end; 
    finally 
    list.Free; 
    end; 
end; 

В случае, если ваше вложенное меню есть для каждого пункта меню собственного обработчика меню, чем вы также сохраняют этот обработчик событий. В таких ситуациях общий список TMenuItem (TList < TMenuItem>) был бы лучшим подходом, чем использование строкового списка.

+0

Я написал отчет об ошибке на портале качества embarcaderos: RSP-19452. Все ожидали бы такой функции: TMenuItem.RemoveSubItem (Item: TMenuItem) –

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

  • Нет связанных вопросов^_^