AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Menü Einträge aus einem TMainMenu löschen

Ein Thema von commandah · begonnen am 28. Mär 2006 · letzter Beitrag vom 28. Mär 2006
Antwort Antwort
commandah

Registriert seit: 9. Sep 2005
25 Beiträge
 
#1

Menü Einträge aus einem TMainMenu löschen

  Alt 28. Mär 2006, 10:34
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;
cu
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

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

  Alt 28. Mär 2006, 10:59
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:

RecentFilesMenu.Clear Die Einträge sind verschwunden und deren Speicher ist freigegeben worden.

Grüße vom marabu
  Mit Zitat antworten Zitat
commandah

Registriert seit: 9. Sep 2005
25 Beiträge
 
#3

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

  Alt 28. Mär 2006, 11:14
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.
cu
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 28. Mär 2006, 11:42
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
Thomas Breitkreuz
  Mit Zitat antworten Zitat
commandah

Registriert seit: 9. Sep 2005
25 Beiträge
 
#5

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

  Alt 28. Mär 2006, 11:52
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?
cu
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 28. Mär 2006, 12:12
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
Thomas Breitkreuz
  Mit Zitat antworten Zitat
commandah

Registriert seit: 9. Sep 2005
25 Beiträge
 
#7

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

  Alt 28. Mär 2006, 12:16
Jupp danke der geht.

Lag an MainMenu1.findcomponent danke
cu
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

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

  Alt 28. Mär 2006, 12:26
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 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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16: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