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

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • 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ů: 256
  • 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 Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #2 kdy: 29-04-2019, 13:46:42 »
A co menu okna (systemove menu)?
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #3 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ů: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #4 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ů: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #5 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.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #6 kdy: 01-05-2019, 17:37:27 »
Stisk klavesy ALT pripadne F10 v komponente jenz ma focus vyvola zpravu WM_SYSKEYDOWN. Po jejim uvolneni (WM_SYSKEYUP) a dispatchi pres DefWindowProc posle oknu (formulari) WM_SYSCOMMAND (v tu chvili se vsak jiz v menu baru zobrazi podrzeni pristupovych klaves). Jedna moznost jak zabranit i tomu podtrzeni pristupovych klaves menu je zpracovat vsem komponentam zpravu WM_SYSKEYDOWN pro stisk zminenych klaves. Tim se ovsem zamezi i zamereni systemoveho menu okna.

Co se tyce zamereni mysi, tam staci v okne zpracovat zpravu WM_NCHITTEST a prepsat vysledek v pripade kdy okno prijme HTMENU.

V kodu napr.:

Kód: Delphi [Vybrat]
  1. type
  2.   TForm1 = class(TForm)
  3.     procedure FormCreate(Sender: TObject);
  4.   private
  5.     procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
  6.     procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;
  7.   public
  8.     FMenuEnabled: Boolean;
  9.   end;
  10.  
  11. implementation
  12.  
  13. procedure TForm1.FormCreate(Sender: TObject);
  14. begin
  15.   FMenuEnabled := False; // timto priznakem se kontroluje odstaveni zamereni menu
  16.   Application.OnMessage := AppMessage;
  17. end;
  18.  
  19. procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
  20. begin
  21.   // pokud ma byt odstaveno zamereni menu (i systemoveho) a byla dorucena zprava klavesy menu vyvolavajici, zpravu dale nepredavejme
  22.   if (not FMenuEnabled) and (Msg.message = WM_SYSKEYDOWN) and ((Msg.wParam = VK_MENU) or (Msg.wParam = VK_F10)) then
  23.     Handled := True;
  24. end;
  25.  
  26. procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
  27. begin
  28.   inherited;
  29.   // pokud ma byt odstaveno zamereni menu a uzivatel prave nad menu cestuje mysi, predstirejme ze je mysi nad beznou klientskou oblasti
  30.   if (not FMenuEnabled) and (Msg.Result = HTMENU) then
  31.     Msg.Result := HTCLIENT;
  32. end;
« Poslední změna: 01-05-2019, 17:39:15 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 713
  • Karma: 42
    • Verze Delphi: 10.3
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #7 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 Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #8 kdy: 01-05-2019, 21:38:09 »
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 :-)

Ja urcite taky. Celkove je ten navrh UX spatne. Melo by jit o modalni okno spis nez nejake vnorene neco co disabluje uzivatele.
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #9 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ů: 2569
  • Karma: 132
    • Verze Delphi: D2007, XE3, DX10
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #10 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 Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #11 kdy: 01-05-2019, 23:27:23 »
Jinak systemove menu rozhodhodne ano, jak pise Vandrovnik.

Jsem taky pro jeho existenci, stejne jako proti ruseni klavesove zkratky k jeho vyvolani. Je to vsak predmetem tohoto dotazu. To ze jde o XY problem je mi vicemene jasne (i OP o tom z prvniho prispevku evidentne vi).
« Poslední změna: 01-05-2019, 23:29:22 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #12 kdy: 02-05-2019, 04:09:55 »
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 :-)

P.S. S tim kodem co jsem poslal (neni pekny, vim; hlavne z UX pohledu) komba s drzenim klavesy ALT zustanou funkcni (tedy napr. ALT+F4, ALT+Space plus psani napr. do edit boxu pomoci ALT a kodu klaves).

Č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

1. vzdy muze neco v retezci DBMS, systemu ci hardware selhat
2. pokud je uzivatel dostatecne varovan a ma inteligenci alespon skakaciho micku, neni duvod delat "zalohu puvodnich dat", pokud ano, zarid aby se zaznam (s vyresenim pripadneho konfliktu s jinym uzivatelem) vratil do puvodniho stavu jeho ulozenim nekde stranou (idealne zmenovym logem v DBMS pro pripad padu klientske aplikace; inteligentne resene DBMS jako SQL Server disponuji napr. tzv. Change Data Capture)
3. tomuto pozadavku nerozumim, ale vydal bych se smerem dedenych, modalne zobrazovanych editacnich fomularu (obsahujicich spolecnou funkcionalitu)

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.

Mozna vam jen chybelo zpracovani nektere ze WM_SYS* zprav. On s tim btw. VTV sam nic nezmuze, protoze pokud Ti ten inplace editor vygeneruje WM_SYSKEYDOWN a nasledne WM_SYSKEYUP s tim ze se preda DefWindowProc, pak Ti system vygeneruje WM_SYSCOMMAND a ten uz vyvola menu.
« Poslední změna: 02-05-2019, 04:27:38 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #13 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.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 713
  • Karma: 42
    • Verze Delphi: 10.3
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #14 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ů: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #15 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.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 713
  • Karma: 42
    • Verze Delphi: 10.3
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #16 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ů: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #17 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 Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #18 kdy: 02-05-2019, 13:48:58 »
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)?
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4338
  • Karma: 38
    • Verze Delphi: XE7 professional
Re:MainMenu - ako sa vyhnúť získaniu focusu pri stlačení Alt
« Odpověď #19 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.