![]() |
Menü Einträge aus einem TMainMenu löschen
Hallo, ich habe ein MainMenu, bei dem ich zur Laufzeit einige MenuEinträge hinzufüge.
Der name dieses MenuItems ist dann immer ent +der nummer des eintrages z.B ent0, ent1 usw. und jetzt möchte ich das Menu ent0 z.b erst leeren (also clear) und dann ganz aus dem HauptMenu Entfernen, aber irgendwie klappt das nicht. So ich habe schon eine Schleife gemacht, die leider gar nicht funktioniert. in entnr steht die anzahl der Zur laufzeit erstellten MenuItems z.B 1 damit er in der schleife ent0 und ent1 nimmt.
Delphi-Quellcode:
var
i:integer; TheName:String; Item:TMenuItem; comp: TComponent; begin for i:=0 to entnr do begin TheName:='ent'+inttostr(i); Comp := FindComponent(TheName); Item:= Comp as TMenuItem; Item.Clear; Item.Free; end; end; |
Re: Menü Einträge aus einem TMainMenu löschen
Hallo.
In meinen Programmen findet sich oft ein Untermenü RecentFilesMenu, dem ich Einträge nach Bedarf hinzufüge. Will ich alle Untereinträge aus diesem Untermenü entfernen, dann genügt eine Zeile Code:
Delphi-Quellcode:
Die Einträge sind verschwunden und deren Speicher ist freigegeben worden.
RecentFilesMenu.Clear
Grüße vom marabu |
Re: Menü Einträge aus einem TMainMenu löschen
Das ist ja auch richtig, deshalb ist in Meinem Code auch Items.clear;
Aber ich erzeuge nicht nur UnterMenüs, sondern auch direkte MenüEinträge wie z.B Datei, Bearbeiten usw... Und da diese zur Laufzeit erstellt wurden, kann ich Sie nicht mit dem dirketen Namen ansprechen wie z.B ent0.clear usw... Deshalb muss ich die Komponente über den namen finden, dann clear, und anschließend soll der eigentliche eintrag auch entfernt werden. Aber bei meinem Code funktioniert nicht einmal das clear, er macht einfach gar nichts. Obwohl die Namen in der schleife stimmen. Und wenn ich versuche ein atribut von Item anzusprechen z.B die Caption oder, dann bekomme ich einen Zugriffsfehler. |
Re: Menü Einträge aus einem TMainMenu löschen
Hallo commandah!
Zitat:
Du castest Dein Ergebnis von FindComponent () as TMenuItem. Dadurch kannst Du auf das Ergebnis auch dann, wenn es nil ist, die Methoden Clear unf Free anwenden, während das Abfragen der Caption unweigerlich zu einem Fehler führt. Bei Clear tritt kein Fehler auf, weil der nur löscht, was er vorfindet, also hier nicts. Free überprüft, ob da überhaupt was ist. Creierst Du Deine MenuItems auch auf dem Owner, auf dem Du das FindComponent anwendest? Gruß onlinekater |
Re: Menü Einträge aus einem TMainMenu löschen
das erstellen mache ich an einer ganz anderen Stelle, und der Owner ist MainMenu1.
Wie kann ich denn sonst ohne findcomponent die Komponente bzw MenuItem mit dem namen ent0 löschen? |
Re: Menü Einträge aus einem TMainMenu löschen
Versuchs mal so:
Delphi-Quellcode:
var i : integer; TheName : String; Item : TMenuItem; comp : TComponent; begin for i := 0 to entnr do begin TheName := 'ent' + inttostr(i); Comp := MainMenu1.FindComponent (TheName); if Comp <> nil then // nachgucken, ob Du auch wirklich was gefunden hast begin if Comp is TMenuItem then // ist das auch wirklich ein Menuitem? begin Item:= Comp as TMenuItem; Item.Clear; Item.Free; end; end; end; end; Hope it helps Thomas PS: Habe Deinen Code ohne Test geändert |
Re: Menü Einträge aus einem TMainMenu löschen
Jupp danke der geht.
Lag an MainMenu1.findcomponent danke |
Re: Menü Einträge aus einem TMainMenu löschen
Zusätzlich zu den korrekten Hinweisen von Thomas noch das hier:
Die Suche von Einträgen wird normalerweise über die Methode FindItem() des MainMenu durchgeführt und zielt auch nicht auf die Caption, sondern auf den command identifier oder den shortcut. Bei Einträgen, die als Teil einer Liste aufzufassen sind, werden eigene Methoden zur Identifikation verwendet, die sich dann auch auf die Caption beziehen können, es aber besser nicht tun. Zitat:
marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz