2017-02-07 26 views
0

メニューに動的に追加したメニューを削除するにはどうすればよいですか?Delphiのfiremonkey menuitemをプログラムで削除する方法は?

私は動的例えばとメニュー項目を追加します。

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

私は再びエントリを削除するために、任意の機能を見つけることができませんでした。 私はdelete、free、removeobjectなどを試みましたが、アイテムはまだ削除されずに表示されています。トリックは何ですか?

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

次に、あなたはそれにちょうどnil ARCへのメニュー項目の親が、その後急降下として見て、残りを行います設定した親を、与えている:あなたがそうのような項目を追加する場合は

+0

'm.Free;'は私のためだけでなく 'm.Release;' –

+0

@TomBrunbergでも動作します。少なくともWin32をターゲットにしても動作します。 – MartynA

+0

どのプラットフォームでこれを試していますか? – DNR

答えて

0

オブジェクトへの参照はもうありません

ループを作成してすべての親を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

あなたがモバイルをターゲットにしていないことを知ったので、WindowsがARCを利用していないので、オブジェクトを解放する 'disposeOf'を使用しなければなりません。 DisposeOfはまだモバイルで動作しますが、これはあまり推奨されない方法です。Davidの答えはこちら:http://stackoverflow.com/questions/27818697/how-to-free-a-component-in-android-ios/27819789# 27819789 –

+0

私が試したメソッドのどれも、disposeOfではなく、サブメニュー項目を削除しました。 disposeOfの後、私はメニューをクリックし、そのサブメニューはまだそこにあります。私は、サブメニュー項目のvisibleプロパティをfalseに設定してtrueに戻すときにのみ削除されます。 TMenuBarに問題はありません。追加された項目は問題なく削除されます。TMainMenuだけで問題が発生します。 – Softtouch

0

私は同じ問題に直面しました:TMenuItem.RemoveObjectが動作していないし、TMenuViewのプライベートメンバーFContentは、RTTIの上で騙されずにアクセス可能ではありません。あなたのサブメニューは、各メニュー項目のためのあなたよりも独自のメニューハンドラを持っている場合は

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.Clearを呼び出す前に、残りのメニュー子項目を格納STRINGLISTを使って自分の回避策を構築する理由です このイベントハンドラも格納します。このような状況では、TMenuItem(TList < TMenuItem>)の総称リストは、文字列リストを使用するよりも優れた方法です。

+0

私はembarcaderosの品質ポータル(RSP-19452)にバグレポートを書いています。誰もがこのような関数を期待しています:TMenuItem.RemoveSubItem(Item:TMenuItem) –

関連する問題