Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mainmenue: untermenues verschwinden lassen (https://www.delphipraxis.net/168680-mainmenue-untermenues-verschwinden-lassen.html)

Hartfrid Krause 4. Jun 2012 08:26

Mainmenue: untermenues verschwinden lassen
 
Ich habe ein mainmenu und in den 5 Gruppen jeweils 4 untermenus.
Ich möchte, dass unter gewissen Umständen jeweils eins (oder mehrere) der verschiedenen Untermenus nicht angezeigt werden, da es - inhaltlich - nicht ausgewählt werden kann.
Welche Möglichkeit gibt es hier, dies zu realisieren?

Eine Abfrage nach Auswählen des Untermenus ist möglich, aber eigentlich zu umständlich.

Popov 4. Jun 2012 08:32

AW: Mainmenue: untermenues verschwinden lassen
 
Also was du auf jeden Fall machen kannst ist ein Menü-Item Enabled = False zu schalten. Dann können auch die Untermenüs nicht aufgerufen werden.

himitsu 4. Jun 2012 08:48

AW: Mainmenue: untermenues verschwinden lassen
 
Du willst was "nicht sichtbar" machen?

Wie wäre es mit Visible der Menüpunkte (dort wo das Untermenü dran hängt) auf False setzen?

Hartfrid Krause 4. Jun 2012 10:04

AW: Mainmenue: untermenues verschwinden lassen
 
Das Mainmenu hat vier Teile.
In jedem dieser Teiel sind wieder 5 Untermenus.
Ich will unter gewissen Umständen in diesen Untermenus einen Teil verschwinden/nicht anzeigen lassen.
Ich will nicht das ganze Untermenu verschwinden lassen.

DeddyH 4. Jun 2012 10:08

AW: Mainmenue: untermenues verschwinden lassen
 
Dann setz doch einfach bei den entsprechenden MenuItems Visible auf false.

Perlsau 4. Jun 2012 10:37

AW: Mainmenue: untermenues verschwinden lassen
 
Zitat:

Zitat von Hartfrid Krause (Beitrag 1169390)
Eine Abfrage nach Auswählen des Untermenus ist möglich, aber eigentlich zu umständlich.

Es gibt meines Wissenstandes nach keine einfache Schnell-Lösung für diese Aufgabe. Wenn ich z.B. in einer Datenbank-Anwendung gewisse Menüpunkte unzugänglich machen möchte, nachdem (oder bevor) der Anwender eine Tabelle in den Edit-Modus versetzt, dann muß ich dafür eine Procedure erstellen, die ich gewöhnlich ...SchreibenErlaubt bzw. ...SchreibenVerboten nenne. Und weil ich meist mit einer TActionList arbeite, manipuliere ich nicht die Menü-Einträge direkt, sondern die der Aktionsliste:
Delphi-Quellcode:
PROCEDURE TFormMain.Projekt_SchreibenErlaubt;
BEGIN
     AL_Projekt_Neu.Enabled                 := FALSE;   //AktionsListen-Eintrag ProjektNeu   deaktivieren
     AL_Projekt_Delete.Enabled              := FALSE;   //AktionsListen-Eintrag ProjektDelete deaktivieren
     AL_Projekt_Edit.Enabled                := FALSE;   //AktionsListen-Eintrag ProjektEdit  deaktivieren

     AL_Projekt_Post.Enabled                := TRUE;    //AktionsListen-Eintrag ProjektPost  aktivieren
     AL_Projekt_Cancel.Enabled              := TRUE;    //AktionsListen-Eintrag ProjektCancel aktivieren

     DBEd_ProjektTitel.ReadOnly             := FALSE;   //DB-Edit Titel auf Read & Write setzen
END;

PROCEDURE TFormMain.Projekt_SchreibenVerboten;
BEGIN
     AL_Projekt_Neu.Enabled                 := TRUE;    //AktionsListen-Eintrag ProjektNeu   aktivieren
     AL_Projekt_Delete.Enabled              := TRUE;    //AktionsListen-Eintrag ProjektDelete aktivieren
     AL_Projekt_Edit.Enabled                := TRUE;    //AktionsListen-Eintrag ProjektEdit  aktivieren

     AL_Projekt_Post.Enabled                := FALSE;   //AktionsListen-Eintrag ProjektPost  deaktivieren
     AL_Projekt_Cancel.Enabled              := FALSE;   //AktionsListen-Eintrag ProjektCancel deaktivieren

     DBEd_ProjektTitel.ReadOnly             := TRUE;    //DB-Edit Titel auf ReadOnly setzen
END;
Aufgerufen wird das dann, wenn der Anwender z.B. einen Eintrag ändern will bzw. wenn er die Änderung abgeschlossen hat:
Delphi-Quellcode:
procedure TFormMain.AL_Projekt_EditExecute(Sender: TObject);
begin
     Projekt_SchreibenErlaubt;
     DatMod.Dset_Projekte.Edit;
end;

procedure TFormMain.AL_Projekt_PostExecute(Sender: TObject);
begin
     DatMod.Dset_Projekte.Post;
     Projekt_SchreibenVerboten;
end;

// oder

procedure TFormMain.AL_Projekt_CancelExecute(Sender: TObject);
begin
     DatMod.Dset_Projekte.Cancel;
     Projekt_SchreibenVerboten;
end;

Willst du jedoch einen kompletten Menüpunkt deaktivieren, genügt ein
Delphi-Quellcode:
Menüpunkt.Enabled := FALSE;
, was natürlich auch für Untermenüpunkte gilt. Am besten, wie bereits empfohlen, machst du das in speziellen Proceduren, so daß du für verschiedene Fälle genau die richtigen Einträge ein- und ausschaltest.

Popov 4. Jun 2012 11:07

AW: Mainmenue: untermenues verschwinden lassen
 
Zitat:

Zitat von Hartfrid Krause (Beitrag 1169417)
Ich will unter gewissen Umständen in diesen Untermenus einen Teil verschwinden/nicht anzeigen lassen.

Du bist der Programmierer, du weißt unter welchen Umständen die Menü-Items verschwinden sollen, das weiß das Programm nicht, d. h. du mußt dem Programm das schon sagen wann die verschwinden sollen.

Wie das mit dem Verschwinden geht hast du schon oben mitbekommen.

Wie man das angehen kann hat Perlsau in einem Beispiel gezeigt.

Vielleicht ein anderer Ansatz, wenn dir If Then nicht gefällt, statt True und False verwende ich gerne Bedingungen

Delphi-Quellcode:
procedure TForm1.Datei1Click(Sender: TObject);
begin
  Speichern1.Enabled := Memo1.Modified;
end;
Vielleicht eine Idee, ich packe die Abfragen gelegentlich das in die Haupt-Items (k. A. wie die heißen), so daß beim Klick drauf die Bedingungen durchlaufen werden.

Ich hab es zwar noch nie gemacht, aber wenn es etwas dirty sein darf, jedes MenüItem hat ein Tag Eintrag. Man könnte es missbrauchen und Items zusammenfassen für eine Anfrage, aber dafür ist es nicht gedacht.

Delphi-Quellcode:
procedure TForm1.Datei1Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to Datei1.Count - 1 do
    Datei1.Items[i].Enabled := Datei1.Items[i].Tag = 1;
end;
Aber wie gesagt, das habe ich nicht gepostet, nur habe ich das Gefühl, dass ...

p80286 4. Jun 2012 12:38

AW: Mainmenue: untermenues verschwinden lassen
 
Nehmen wir mal an, daß alle Menueeinträge, die sich mit Dateiverarbeitung beschäftigen so lange gesperrt oder unsichtbar sind, solange keine Datei gelesen wurde,
Dann wirst Du nicht darum herum kommen diese Einträge über Visible/Enabled zu markieren.

Übrigens wenn Du den Menuepunkten vernünftige Namen gegeben hast, dann ist das eigentlich kein Problem.

Gruß
K-H

Hartfrid Krause 4. Jun 2012 16:56

AW: Mainmenue: untermenues verschwinden lassen
 
Das mainmenu1 enthält drei kategorien.
eRGEBNIISE EINES bUNDESLANDES
Alle Bundesländer
Europawahlen.

In der ersten Kategorie (Ergebnissse eines Bundesalndes) sind folgende Untermenus verpackt:
- Überblick über die Ergebisse eines Landes
- Gewinne und Verluste
- Darstellung eines Bundeslandes
- Einzelne Ergebnisse von Parteien
- Anderes Bundesland auswählen

Ich will unter bestimmten Bedingungen, dass Einzelnen Ergebnisse von Parteien NICHT im Untermenue angezeigt werden, wenn ich davor in eineem vorausgehenden Datenblatt etwa Europaergebnisse angeklickt habe.
Also: if ...{falsche Regionalauswahl]... then
{untermenu Einzelnen Ergebnisse... nicht als Auswahl angezeigt.

Das klappt so noch nicht.

DeddyH 4. Jun 2012 17:01

AW: Mainmenue: untermenues verschwinden lassen
 
Sollte es nicht genügen, im OnClick des übergeordneten MenuItems einfach
Delphi-Quellcode:
EinzelneErgebnissevonParteien.Visible := richtige_Regionsauswahl;
auszuführen?

Sir Rufo 4. Jun 2012 17:19

AW: Mainmenue: untermenues verschwinden lassen
 
Menüeinträge baut man idR ja aus Actions und jede Action hat ein OnUpdate Event.
In diesem Event kann man die Action einfach den Status abfragen lassen, ob nun visibble oder enabled oder was auch immer.

Ein direktes Zuweisen ist da nicht erforderlich, sondern nur das Setzen der Statuswerte :)

p80286 4. Jun 2012 17:21

AW: Mainmenue: untermenues verschwinden lassen
 
Wenn ich ehrlich bin verstehe ich deinen Wunsch nicht, einzene Menuepunkte zu sperren.
dies wäre erst dann sinnvoll wenn für die Detailansicht eines Bundeslandes kein Bundesland ausgewählt sein sollte.

Und eine Eropawahl wird wahrscheinlich zunächst nach Staaten unterteilt und dann kommen die einzelnen Verwaltungsstrukturen dieser Staaten.

Ich vermute Daß Du vor dem Problem Wald und Bäume stehst. Nimm Dir doch einmal einen Stift und versuche Deine Programmlogik auf dem Paper zu entwerfen.
(übrigens meine ich mit den Namen der Menue-Punkte nicht die Caption sondern wirklich den Namen)

Gruß
K-H

Popov 4. Jun 2012 18:31

AW: Mainmenue: untermenues verschwinden lassen
 
Ich weiß nicht ob ich es richtig verstanden habe will es zu allem alle Daten als Menüs anbieten. Und je nachdem was zuerst ausgewählt wurde soll nur ein Teil passend dazu angezeigt werden.

Perlsau 4. Jun 2012 18:38

AW: Mainmenue: untermenues verschwinden lassen
 
Zitat:

Zitat von Hartfrid Krause (Beitrag 1169483)
Das klappt so noch nicht.

Das ist weder eine Fehlermeldung, mit der andere Programmierer etwas anfangen können, noch stellt es fehlerhaften Code dar, den wir vielleicht zu berichtigen vermögen! Wolltest du allerdings eine Vorhersage mittels Glaskugel, wärst du mit dem Hinweis, daß das so (wer weiß schon, was du unter "so" verstehst) nicht klappt, bei einem Hellseher besser aufgehoben.

Hartfrid Krause 5. Jun 2012 08:00

AW: Mainmenue: untermenues verschwinden lassen
 
Ich kriege es noch nicht hin.
Also:
Wenn die Auswahl ein Bundesland ist, dann soll das Untermenue Einzelne Ergebnisse von parteien angezeigt werden.

if satz[2]<120 then ....onclick....visible...enabled... aber wie??

Perlsau 5. Jun 2012 08:20

AW: Mainmenue: untermenues verschwinden lassen
 
Zitat:

Zitat von Hartfrid Krause (Beitrag 1169542)
Ich kriege es noch nicht hin.
Also:
Wenn die Auswahl ein Bundesland ist, dann soll das Untermenue Einzelne Ergebnisse von parteien angezeigt werden.

if satz[2]<120 then ....onclick....visible...enabled... aber wie??

Du mußt dir selbst ein System ausdenken. Z.B.:

1. Alle Menüpunkte, die beim Anklicken etwas ausblenden sollen, bekommen den Tag 1.
2. Alle Menüpunkte, die beim Anklick dasselbe wieder einblenden sollen, bekommen den Tag 2.
3. Alle Menüpunkte, die beim Anklicken etwas anderes ausblenden sollen, bekommen den Tag 3.
4. Alle Menüpunkte, die beim Anklick dasselbe andere wieder einblenden sollen, bekommen den Tag 4.

usw.

Dann schreibst du die Proceduren für die jeweiligen Ein- und Ausblendungen und weist in der jeweiligen On-Click-Behandlung der verschiedenen Menüpunkte die richtigen Proceduren zu:
Delphi-Quellcode:

PROCEDURE TForm1.MenueBehandlung1;
BEGIN
     Menu_EinzelneErgebnisse.Visible := FALSE;
     // oder: Menu_EinzelneErgebnisse.Enabled := FALSE; {je nachdem, wie du's haben möchtest}
END

PROCEDURE TForm1.MenueBehandlung2;
BEGIN
     Menu_EinzelneErgebnisse.Visible := TRUE;
     // oder: Menu_EinzelneErgebnisse.Enabled := TRUE; {je nachdem, wie du's haben möchtest}
END

PROCEDURE TForm1.Menu_BrandenburgClick(Sender: TObject);
BEGIN
     CASE Menu_Brandenburg.Tag OF
     1 : MenueBehandlung1;
     2 : MenueBehandlung2;
     3 : MenueBehandlung3;
     4 : MenueBehandlung4;
     END;

     TuWasDuNichtLassenKannst;
END;
Ist das nun soweit für dich nachvollziehbar oder wäre es dir doch lieber, wenn ich dir das ganze Programm schreibe (das wird dann aber nicht billig)?:stupid:

Jumpy 5. Jun 2012 08:34

AW: Mainmenue: untermenues verschwinden lassen
 
Vielleicht könntest du mal den Quelltext des Formulars (oder zumindest den Initialisation-Teil) hier posten. Dann könnte man sehen, was du für Menüeinträge hast, wie die heißen (nicht die Caption), ob du Action und ActionList benutzt usw.

Ich selber benutz gern die Variante die SirRufo erwähnt hat mit dem OnUpdate-Event der Actionlist, wo ich dann gewisse Action (und damit auch die Menüeinträge) dis- oder enabled setze.
Dieses Event wird nur sehr oft aufgerufen, d.h. die Bedingungen, ob etwas enabled ist oder nicht, sollten nicht zu aufwendig sein.

Popov 5. Jun 2012 09:21

AW: Mainmenue: untermenues verschwinden lassen
 
Zitat:

Zitat von Hartfrid Krause (Beitrag 1169542)
Ich kriege es noch nicht hin.
Also:
Wenn die Auswahl ein Bundesland ist, dann soll das Untermenue Einzelne Ergebnisse von parteien angezeigt werden.

if satz[2]<120 then ....onclick....visible...enabled... aber wie??

Schon mal auf die Idee gekommen statt ein Menü mit allem zu füllen, es jedes Mal zu leerer und individuell zu "befüllen"? Ich schätze bei dem was du vorhast wäre es die elegantere Lösung.

Ansonsten vielleicht ein kleiner Tipp, Beschwörungsformeln wie "ich weiß es immer noch nicht wie es gehen soll" werden das Problem wahrscheinlich nicht lösen. Du lieferst zu wenig Infos, so dass die Tipps ins Blaue geschossen werden. Mag das Problem für dich logisch erscheinen, aber so richtig kommt es hier nicht an, sonst hätte du vielleicht sogar schon fertige Lösungen. Vielleicht inverstierst du mehr Zeit als 30 Sekunden um dein Problem zu beschreiben. Könnte sich lohnen.

Perlsau 5. Jun 2012 09:28

AW: Mainmenue: untermenues verschwinden lassen
 
@Popov: Das sieht man recht häufig, daß sich Programmier-Anfänger zu komplexe Aufgaben stellen und dann damit erwartungsgemäß scheitern :shock:

@Hartfrid Krause: Vielleicht wäre es auch angebracht, sich erstmal die fehlenden Grundlagen mittels geeigneter Tutorials anzueignen. Offenbar verstehst du es noch nicht, die gestellten Aufgaben in kleinere Unteraufgaben zu zerlegen und erst dann umzusetzen ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:42 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