Autor Téma: MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt  (Přečteno 464 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
V určitých prípadoch potrebujem potlačiť pre MainMenu získanie focus-u pri stlačení klávesu "Alt".
Je to v prípade editácie (Edit a Insert) záznamu DB. Viem, ako mi to aj bolo napísané, že to nie je šťastné riešenie. Problém je v tom, že mi EditComponent stratí focus, čo je nepríjemné.

Vtedy mám všetky položky menu na 1. úrovni neprístupné. To nezabraňuje MainMenu získať focus.
Nenašiel som žiadnu vlastnosť, ktorá by to umožňovala. MainMenu sa nedá skryť ani ničím prekryť.


Jednu možnosť vidím v nahradení MainMenu niečím iným. Ale neviem čím.
Hm, teraz mi napadlo, žeby to mohol riešiť subfrom. Ten by obsahoval iba MainMenu. Je to vhodné/schodné riešenie?
Ďakujem.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 279
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #1 kdy: 29-04-2019, 13:42:32 »
Proč by nešlo menu skrýt?
Kód: Delphi [Vybrat]
  1. MainForm.Menu := nil; // skryt menu
  2. MainForm.Menu := MainMenu1; // vratit zpet
  3.  
nil

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #2 kdy: 29-04-2019, 14:23:46 »
Citace
A co menu okna (systemove menu)?
V takýchto prípadoch ho nemám.
Riešenie od Morrisona má jednu chybu. Menu nie je vykreslené. Refresh nepomáha. Pri prebehnutí myšou sa vykresľuje. Hľadám riešenie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #3 kdy: 29-04-2019, 14:32:18 »
Poor
Rated 1 time
Urobil som to takto
Kód: Delphi [Vybrat]
  1.   for I := 0 to frmFormMain.Menu.Items.Count - 1 do
  2.   begin
  3.     frmFormMain.Menu.Items[I].Visible := False;
  4.     frmFormMain.Menu.Items[I].Visible := True;
  5.   end;
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #4 kdy: 29-04-2019, 14:35:50 »
Ten istý efekt ako s nil dosiahnem aj s
Kód: Delphi [Vybrat]
  1.     for I := 0 to frmFormMain.Menu.Items.Count - 1 do
  2.       frmFormMain.Menu.Items[I].Visible := False;
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 847
  • Karma: 45
    • Verze Delphi: 10.3
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #5 kdy: 01-05-2019, 21:36:01 »
Systémové menu už mě párkrát zachránilo, když si nějaká aplikace usmyslela, že se zobrazí mimo monitor. Pomohlo pak Alt+mezerník, p, šipka a pak zkusit pohybem myši okno odněkud vylovit. To píšu proto, že bych se přimlouval za funkční systémové menu :-)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #6 kdy: 01-05-2019, 22:20:01 »
Ja to mám ako ochranu pred uzavretím okna a pod. pri Edit/Insert. Viem, že sa to dá obslúžiť vo Form.CloseQuery. Už si nepamätám prečo som si vybral túto možnosť.
Čo by ste mi poradili, aby
  • DB vždy ostala v konzistentnom stave
  • Užívateľ nechcene neurobil niečo čo nechce
  • Mal som to ošetrené na jedinom mieste programu
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2625
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #7 kdy: 01-05-2019, 22:37:24 »
  • Mal som to ošetrené na jedinom mieste programu
Ja uz si to nepamatuju, ale nekdy pred 10++ kety jsme meli nejake in-place editovani ve VTV a tam jsem nekde musel prirazovat nil misto menu. Ale to bylo za ery jeste pred velkou zk*rveninou Windows Vista a jejich nasledniku. Kde to bylo se nepodivam, protoze jsem jeste nenainstaloval D2007. A to ti tady tusim radili.

Jinak systemove menu rozhodhodne ano, jak pise Vandrovnik.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #8 kdy: 02-05-2019, 08:39:56 »
Citace
3. tomuto pozadavku nerozumim, ale vydal bych se smerem dedenych, modalne zobrazovanych editacnich fomularu (obsahujicich spolecnou funkcionalitu)
To je snáď najzákladnejšie pravidlo OOP. Kód sa má objaviť iba raz. Neformuloval som to celkom presne. Chcem to mať tak, aby som na to pri programovaní ani nemusel myslieť. Teraz to mám:
Kód: Delphi [Vybrat]
  1.  
  2. procedure TNavFullDB.EditingChanged;
  3. ...
  4.  
  5.   if CanModify and FEditing then
  6.     oGlobalVar.ActualForm.BorderIcons := oGlobalVar.ActualForm.BorderIcons - [biSystemMenu]
  7.   else
  8.     oGlobalVar.ActualForm.BorderIcons := oGlobalVar.ActualForm.BorderIcons + [biSystemMenu];
  9.  
Mám jedného predka formulárov a zároveň aj pod formulárov. Tak sa na to pozriem. Samostatné editačné formuláre akosi nemám. Modálne zobrazovanie používam vždy keď sa to dá. Základná činnosť sa deje na hlavnom formulári (PageControl).
Už som si spomenul, prečo som išiel cestou SystemMenu. Nechcel som, aby počas editovania užívateľ minimalizoval okno. Na to stačí skryť len patričné tlačidlo :)  Robil som to snáď pre 10 rokmi.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 847
  • Karma: 45
    • Verze Delphi: 10.3
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #9 kdy: 02-05-2019, 08:41:35 »
Už som si spomenul, prečo som išiel cestou SystemMenu. Nechcel som, aby počas editovania užívateľ minimalizoval okno. Na to stačí skryť len patričné tlačidlo :)  Robil som to snáď pre 10 rokmi.

A co se stane, když uživatel stiskne Win+D?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #10 kdy: 02-05-2019, 09:18:33 »
Ja tie hotkey ani nepoznám :)
Všetko mi zmizlo a po opätovnom stlačení sa zobrazilo v pôvodnom stave. To by snáď nemalo vadiť.
Samozrejme, že to prepracujem podľa vašich rád a odporúčaní.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 847
  • Karma: 45
    • Verze Delphi: 10.3
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #11 kdy: 02-05-2019, 09:32:22 »
No jestli má cenu se zabývat tím, jak zabránit uživateli v použití tlačítka Minimalizovat, když tím Win+D minimalizuje všechno najednou.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #12 kdy: 02-05-2019, 12:51:59 »
Už som si spomenul na hlavný dôvod ;D  Nechcel som aby užívateľ nechal visieť uzamknutý záznam. Teraz mi to už nehrozí. Pokročil som a príkazy Edit a Insert len nastavujú príznak.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #13 kdy: 02-05-2019, 14:18:10 »
Spis nez abych uzivatele omezoval bych jej upozornil. V pripade minimalizace modalniho editacniho okna bych mu alespon zobrazil varovani s tim ze muze blokovat zamkem zaznamu jine uzivatele. Btw. tech situaci muze byt vice, co takove uspani pocitace (uzivatel si skoci trebas do krcmy na halusky a par borovicek a mezitim uspi pocitac)?
Už sa tak stalo ;)  Ako som hore písal, ja žiaden záznam nezamykám. Takže mi je úplne jedno čo užívateľ vystrája. To v minulosti nebolo.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.