TMainMenu : disable ?
-
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 ?
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 ?
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 ?
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);-
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 ?
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
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 ?
@nixsager: ich meine für alle.
Re: TMainMenu : disable ?
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 ?
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 ?
Wie löst Ihr denn dieses Problem ? Oder disabled Ihr immer alle Menuitems ?
Re: TMainMenu : disable ?
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.
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 ?
Also ich habe mich jetzt für den Vorschlag von wp_xyz entschieden.
Das funktioniert gut.
Dankeschön.
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 ?
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
Mit Java und C/C++ sehe ich rot
Re: TMainMenu : disable ?
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
)
-
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 ?
Stimmt, unter Windows verschwindet es nicht, aber auf Eingabe reagiert es aber nicht mehr.Da tut sich bei mir nichts: Wenn ein Formular einmal ein MainMenu hatte, kriege ich es nicht mehr weg, nur ersetzt.
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
Mit Java und C/C++ sehe ich rot
Re: TMainMenu : disable ?
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 ?
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 ?
Ist gut, wen ich e mache brauche ich wieder ein Schaltjahr, bis ich mich im Bug-Report eingeloggt habe.Ich schreib mal einen Bug-Report.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: TMainMenu : disable ?
http://bugs.freepascal.org/view.php?id=30806wp_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.
Michl hat den Fehler gefunden - danke!