Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Menü Einträge aus einem TMainMenu löschen (https://www.delphipraxis.net/66308-menue-eintraege-aus-einem-tmainmenu-loeschen.html)

commandah 28. Mär 2006 09:34


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;

marabu 28. Mär 2006 09:59

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:
RecentFilesMenu.Clear
Die Einträge sind verschwunden und deren Speicher ist freigegeben worden.

Grüße vom marabu

commandah 28. Mär 2006 10:14

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.

TBx 28. Mär 2006 10:42

Re: Menü Einträge aus einem TMainMenu löschen
 
Hallo commandah!

Zitat:

... wenn ich versuche ein atribut von Item anzusprechen z.B die Caption oder, dann bekomme ich einen Zugriffsfehler...
Das läßt darauf schließen, daß Du die gewünschte Komponente gar nicht gefunden hast.
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

commandah 28. Mär 2006 10:52

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?

TBx 28. Mär 2006 11:12

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

commandah 28. Mär 2006 11:16

Re: Menü Einträge aus einem TMainMenu löschen
 
Jupp danke der geht.

Lag an MainMenu1.findcomponent danke

marabu 28. Mär 2006 11:26

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:

Zitat von commandah
Aber ich erzeuge nicht nur UnterMenüs, sondern auch direkte MenüEinträge wie z.B Datei, Bearbeiten usw...

Das solltest du nochmal überdenken. Standardmenü-Einträge können zwar dynamisch erzeugt werden, aber werden nicht einzeln gelöscht. Sie bleiben für die Lebensdauer der Form, mit der sie verbunden sind, erhalten und werden von der Form entsorgt, wenn diese zerstört wird. Während der Lebensdauer der Menüeinträge werden diese, wenn sie in einem Hauptmenu verwaltet werden, nur deaktiviert, in einem Kontextmenü auch unsichtbar gemacht. Untermenüs der obersten Ebene (Datei, Bearbeiten, Hilfe) werden in einem Hauptmenü nie deaktiviert, sondern unsichtbar gemacht.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz