Autor Téma: Aby se nemodální okno neztratilo pod mainform  (Přečteno 5225 krát)

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 284
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4
Aby se nemodální okno neztratilo pod mainform
« kdy: 12-11-2019, 10:44:50 »
Jak to udělat, aby se nemodální okno nemohlo "ztratit" pod hlavní okno aplikace? Nevíte někdo?
nil

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2611
  • Karma: 103
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #1 kdy: 12-11-2019, 13:15:05 »
Neco podobneho resim takto, jesli ti to pomuze nevim


Kód: Delphi [Vybrat]
  1. procedure TSuggestControl.CreateParams(var Params: TCreateParams);
  2. begin
  3.   inherited CreateParams(Params);
  4.   Params.WindowClass.style := Params.WindowClass.style or (CS_VREDRAW + CS_HREDRAW);
  5.   with Params do
  6.   begin
  7. //    Style := WS_THICKFRAME OR WS_POPUP or Style;
  8.     ExStyle := {WS_EX_TOOLWINDOW or} WS_EX_TOPMOST;
  9.   end;
  10. end;
  11.  
Embarcadero MVP - Czech republic

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 284
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #2 kdy: 12-11-2019, 13:45:39 »
Díky, WS_EX_TOPMOST funguje. Omlouvám se za zbytečný dotaz. Nevím totiž jak jsem na to přišel, ale měl jsem za to, že když se fomu nastaví FormStyle := fsStayOnTop, že to pak je i nad všemi ostatními okny jiných aplikací. Přitom fsStayOnTop je, jak se zdá, jen v rámci mojí aplikace.
nil

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2611
  • Karma: 103
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #3 kdy: 12-11-2019, 13:54:52 »
Díky, WS_EX_TOPMOST funguje. Omlouvám se za zbytečný dotaz. Nevím totiž jak jsem na to přišel, ale měl jsem za to, že když se fomu nastaví FormStyle := fsStayOnTop, že to pak je i nad všemi ostatními okny jiných aplikací. Přitom fsStayOnTop je, jak se zdá, jen v rámci mojí aplikace.

Taky si myslim, ze fsStayOnTop  coz je podle zdrojaku transformovan na HWND_TOPMOST je nad vsemi okny (nebo byval), proto WS_EX_TOPMOST, ale nijak moc jsem se v tom nevrtal.
Embarcadero MVP - Czech republic

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 284
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #4 kdy: 12-11-2019, 15:23:25 »
Třeba je to ve Windows 10 změněný. Taky bych právě řekl, že dříve fsStayOnTop bylo nade všemi ostatními okny. Bohužel teď momentálně nemám starší Windows, abych to vyzkoušel.
nil

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 223
  • Karma: 16
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #5 kdy: 12-11-2019, 21:20:44 »
Excellent
Rated 1 time
Pánové, proč to místo toho přepisování CreateParams nenastavíte pomocí property popupmode?

Viz. http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Forms_TForm_PopupMode.html

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2611
  • Karma: 103
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #6 kdy: 13-11-2019, 00:45:43 »
Pánové, proč to místo toho přepisování CreateParams nenastavíte pomocí property popupmode?

Viz. http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Forms_TForm_PopupMode.html

Protože jsem si doteď myslel, že se to týká jen modálních oken, ale podle popisu by to mohlo fungovat i na nemodální...
Embarcadero MVP - Czech republic

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 995
  • Karma: 28
    • Verze Delphi: XE8, Seattle
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #7 kdy: 13-11-2019, 08:23:19 »
Ono řešení od EMBT vypadá elegantně, ale já mám ponejvíce problém s okny např. QuickReport nebo jinými, třetích stran, které se schovávají pod hlavní okno. Problém je i s dialogs okny :(

Offline jbd

  • Nováček
  • *
  • Příspěvků: 2
  • Karma: 0
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #8 kdy: 27-02-2020, 13:05:12 »
Poslední dobou se mi stává stále častěji, že se modální dialog schová za hlavní formulář, je pak "modálně schovaný" a hlavní je neaktivní...
Dokonce se někdy schová přihlašovací okno za split logo. Nejčastěji se to stává na Win Server 2008 v terminálu, ale už sem to řešil na Win10.
Při hledání na webu jsem narazil jen na nějaké fórum, kde řešení nebylo - chyba windows. Neměl by někdo nápad, jak třeba obnovit zobrazení modálního okna?

Díky...

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 284
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #9 kdy: 27-02-2020, 15:30:01 »
Vyzkoušej Form.BringToFront;
nil

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 211
  • Karma: 9
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #10 kdy: 28-02-2020, 08:51:16 »
Toto máme už roky v programech a od té doby si nikdo na modální okno v pozadí nestěžoval (ale i předtím to bylo zřídkavé):
Kód: Delphi [Vybrat]
  1. procedure DisableProcessWindowsGhosting;
  2. var
  3.   DisableProcessWindowsGhostingProc: procedure;
  4. begin
  5.   DisableProcessWindowsGhostingProc := GetProcAddress(
  6.     GetModuleHandle('user32.dll'),
  7.     'DisableProcessWindowsGhosting');
  8.   if Assigned(DisableProcessWindowsGhostingProc) then begin
  9.     DisableProcessWindowsGhostingProc;
  10.   end;
  11. end;
  12.  
Volá se to z Create hlavního okna aplikace.
K.

Offline anec

  • Mladík
  • **
  • Příspěvků: 99
  • Karma: 3
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #11 kdy: 04-03-2020, 08:47:08 »
To co píše KarelHorky taky používám a abych řekl pravdu moc to u mě nefunguje:

kompilováno na delphi 7

mám nemodální form, na něm kliknu na tlačítko a  zobrazí se velký modální form1, na něm je tlačítko START. po kliknutí START se spoustí dlouhá úloha na jejímž konci se zobrazí menší modální form2. pokud počkám na dokončení a aplikace je stále aktivní tak je pořadí oken OK, takže ten menší form je vidět a dá se zavřít.
pokud ale v průběhu té dlouhé akce zaktivním jinou aplikaci a jsem v ní a až po nějaké době se vratím ke své aplikaci (takže po doběhnutí dlouhé akce se modální form2 zobrazil "na pozadí"¨) tak je na vrchu pořád ten modální form1, aplikace nepříjmá žádné vstupy musím stisknout alt+tab pryč a alt+tab zpět do mé aplikace a pak se modální form2 ukáže takže ho můžu kliknout.

- dělá to nepravidelně
- dělá to při stejném postupu i při jíných komponentách, např fast-report a modální náhled na sestavu



Offline JaroB

  • Guru
  • *****
  • Příspěvků: 995
  • Karma: 28
    • Verze Delphi: XE8, Seattle
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #12 kdy: 04-03-2020, 12:59:54 »
Tohle musím potvrdit, dělá mi to obdobné věci. Aplikace mám kompilovány v Delphi Seattle nebo XE8. V dobách Delphi 2005 mi to dělalo taky, kdy nedrželo pořadí [form][modalform][dialog], kdy se dialog dostal pod modalform, a já kvůli tomu používal konstrukci extra dialogu, který před zobrazením modalform schoval (v některých případech pomohla minimalizace, např. v Quickreportu)

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 211
  • Karma: 9
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #13 kdy: 04-03-2020, 14:26:57 »
Máme hodně zákazníků, kteří používají náš program v celoobrazovkovém režimu na dotykovém displeji. Klávesnice ani myš k PC není připojená. Protože se občas stávalo, že se modální okno schovalo pod jiné, v této konfiguraci to opravdu byl problém. Alt-Tab-pryč a Alt-Tab-zpět nebylo na čem udělat. Hledal jsem nějaké řešení a našel uvedený kód. Použil jsem ho v D7 a pak v XE6 a u nás pomohl.
Vyzkoušejte a uvidíte.
Asi záleží i na stavu/verzi Windows, u stejného zákazníka na jednom PC před použitím kódu hlásili problém několikrát měsíčně, na jiném PC stojícím vedle se neobjevil nikdy. Po použití kódu už problém nehlásili.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2793
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Aby se nemodální okno neztratilo pod mainform
« Odpověď #14 kdy: 04-03-2020, 16:16:53 »
pokud ale v průběhu té dlouhé akce zaktivním jinou aplikaci
Celkem pochopitelne: aplikace pri dlouhe akci nereaguje na zpravy. Resenim je vykopat dlouhou akci z kontextu hlavniho threadu, kde nema co delat a dat ji do samostatneho threadu.