TMainMenu : disable ?

Für Fragen von Einsteigern und Programmieranfängern...
malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

TMainMenu : disable ?

Beitrag von malabarista »

Nachdem ein Menü-Item vom Anwender ausgewählt wurde, würde ich gerne das gesamte Mainmenu disablen. Solange, bis der Anwender die ausgewählte Funktion beendet hat.
Ich habe kein "disable" oder "visible" gefunden beim Mainmenu.
Muss ich wirklich jedes einzelne Menü-Item einzeln disablen oder die gesamte Menüzeile durch ein Tpanel abdecken ?

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: TMainMenu : disable ?

Beitrag von compmgmt »

Meines Wissens nach musst du jedes einzelne TMenuItem deaktvieren, da das MainMenu vom OS bereitgestellt wird. Kann aber sein, dass Funktionen in der Windows-API vorhanden sind (wenn du Windows nutzt).

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: TMainMenu : disable ?

Beitrag von Nixsager »

Hi malabarista

Meinst du das das ganze Menü nicht zu sehen ist, oder wie z.B. bei 'Datei Bearbeiten Fenster' nur 'Datei' deaktiviert also grau ist?
Beim zweiten Fall, kannst du das über 'MenuItem1.Enabled:=False;' machen. Und wenn alle deaktiviert werden sollen, wiederholst du es für die entsprechenden.

Gruß vom Nixsager
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TMainMenu : disable ?

Beitrag von malabarista »

@nixsager: ich meine für alle.

wp_xyz
Beiträge: 5487
Registriert: Fr 8. Apr 2011, 09:01

Re: TMainMenu : disable ?

Beitrag von wp_xyz »

Ich glaube, das Ganze macht nur dann Sinn, wenn ein MenuItem ein modales Fenster öffnet und dem Benutzer signalisieren soll, dass das Hauptfenster nicht zu bedienen ist. Hier reicht es, alle "top-level" MenuItems des Hauptmenüs zu durchlaufen und zu deaktivieren, weil man an die tieferen Menüeinträge ja ohnehin nicht rankommt. Auch sollte es hier in der Regel auch keine Konflikte geben, dass Items aus anderen Gründen bereits ausgeschaltet sind.

Code: Alles auswählen

procedure TForm1.EnableMainMenu(AEnabled: Boolean);
var
  i: Integer;
begin
  for i:=0 to MainMenu1.Items.Count-1 do
    MainMenu1.Items[i].Enabled := AEnabled;
end;   
 
procedure TForm1.MenuItem4Click(Sender: TObject);
begin
  EnableMainMenu(false);
  ShowMessage('Test');
  EnableMainMenu(true);
end; 

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TMainMenu : disable ?

Beitrag von malabarista »

Mein Problem ist, dass der Anwender erst eine Programmfunktion (z.B. Datenpflege) beenden muss, ehe er eine andere Programmfunktion aufruft.

Wie löst Ihr denn dieses Problem ? Oder disabled Ihr immer alle Menuitems ?

wp_xyz
Beiträge: 5487
Registriert: Fr 8. Apr 2011, 09:01

Re: TMainMenu : disable ?

Beitrag von wp_xyz »

Am einfachsten wäre es, den Programmteil, der beendet werden muss, bevor es irgendwo weitergehen kann, in ein modales Fenster zu packen. Vor allem, dann wenn das im Hauptthread abläuft. Dann KANN der User einfach nichts anderes tun als abzuwarten.

Falls die Datenpflege in einem eigenen Thread läuft, könntest du alternativ auch ein zweites MainMenu dem Formular hinzufügen, das nur die Befehle enthält, die der Benutzer während der Datenpflege ausführen kann. Vor dem Start der Datenpflege kannst du dieses Menü der Eigenschaft Menu des Formulars zuweisen, hinterher nimmst du wieder das alte.

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TMainMenu : disable ?

Beitrag von malabarista »

Also ich habe mich jetzt für den Vorschlag von wp_xyz entschieden.
Das funktioniert gut.
Dankeschön.

Mathias
Beiträge: 7345
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TMainMenu : disable ?

Beitrag von Mathias »

Wieso nicht einfach das MainMenu temporär entfernen ?

Code: Alles auswählen

procedure TForm1.ToggleBox1Change(Sender: TObject);
begin
  if ToggleBox1.Checked then begin
    Self.Menu := nil;
  end else begin
    Self.Menu := MainMenu1;
  end;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 5487
Registriert: Fr 8. Apr 2011, 09:01

Re: TMainMenu : disable ?

Beitrag von wp_xyz »

Da tut sich bei mir nichts: Wenn ein Formular einmal ein MainMenu hatte, kriege ich es nicht mehr weg, nur ersetzt. Vielleicht ein Bug... (wahrscheinlich wirst du antworten: ein Bug von Windows, bei Linux geht es einwandfrei :wink: )

Mathias
Beiträge: 7345
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TMainMenu : disable ?

Beitrag von Mathias »

Da tut sich bei mir nichts: Wenn ein Formular einmal ein MainMenu hatte, kriege ich es nicht mehr weg, nur ersetzt.
Stimmt, unter Windows verschwindet es nicht, aber auf Eingabe reagiert es aber nicht mehr.

Noch was interessantes, wen das Menu auf nil ist, und man das Form kurz über den Desktoprand zieht, dann wird es anschliessend nicht mehr gezeichnet.

Sieht mir auch nach einem Bug aus.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 5487
Registriert: Fr 8. Apr 2011, 09:01

Re: TMainMenu : disable ?

Beitrag von wp_xyz »

In Delphi ist es ok. In Lazarus reicht es auch, die Formulargröße zu verändern, nachdem Menu auf nil gesetzt wurde. Sieht wie ein fehlendes Invalidate aus, aber wenn man das in TCustomForm.SetMenu aufruft, passiert auch nichts. -- Ich schreib mal einen Bug-Report.

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: TMainMenu : disable ?

Beitrag von Nixsager »

Versucht doch doch mal nach dem entfernen das Repaint-Ereignis per Code auszuführen.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Mathias
Beiträge: 7345
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TMainMenu : disable ?

Beitrag von Mathias »

Ich schreib mal einen Bug-Report.
Ist gut, wen ich e mache brauche ich wieder ein Schaltjahr, bis ich mich im Bug-Report eingeloggt habe.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 5487
Registriert: Fr 8. Apr 2011, 09:01

Re: TMainMenu : disable ?

Beitrag von wp_xyz »

wp_xyz hat geschrieben:In Delphi ist es ok. In Lazarus reicht es auch, die Formulargröße zu verändern, nachdem Menu auf nil gesetzt wurde. Sieht wie ein fehlendes Invalidate aus, aber wenn man das in TCustomForm.SetMenu aufruft, passiert auch nichts. -- Ich schreib mal einen Bug-Report.
http://bugs.freepascal.org/view.php?id=30806
Michl hat den Fehler gefunden - danke!

Antworten