Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Delphi - modálne okno bez prerušenia behu aplikácie

Prosím vás, poraďte mi ako otvoriť okno nemodálne, ale vždy navrchu aplikácie. Očo ide? Mám formulár frmPleaseWait, ktorý je určený na zobrazovanie priebehu vykonávania výpočtu, mazania a podobne v aplikácii. Formulár otváram metódou Show a ďalej spracovávam výpočet v aplikácii. Nakoľko je výpočet náročný na čas, tak počas výpočtu po každom kroku volám metódu Application.ProcessMessages. Vďaka tomu sa dá výpočet prerušiť aj v polovici, pretože sa dá stlačiť tlačítko Prerušiť na tomto formulári. Problém ale nastáva, ak kliknem do okna aplikácie, ale mimo tohto formulára. Vtedy sa už naspäť k formuláru frmPleaseWait nedostanem a program ďalej pokračuje vo výpočte. Dalo by sa to riešiť dvoma spôsobmi:

1. "Modálne" okno - aplikácia bude mať okno vždy navrchu, je to myslím parameter SystemModal, alebo niečo také. Tiež by som chcel umožniť pomocou formulára minimalizovať celú aplikáciu. Niečo podobné ako je to v Synchronizácia adresárov v Total Commanderi. Ak počas operácie dám minimalizovať, minimalizuje sa celý Total Commander.

2. Nové okno, aby som sa vedel dostaťk nemu späť pomocou hlavnej lišty. Niečo také je v aplikácii Virtual Dub, kde je počas činnosti programu vytvorené samostatné okno s procesom spracovania. Tu sa to zrejme roibí nastavením iného rodiča pri konštruktori Create. Ja používam Create(Self), čiže rodičom je hlavný formulár aplikácie.

Viete mi poradiť, ako to urobiť jedným alebo druhým spôsobom? Vhodnejší je prvý, ale môže byť aj druhý.

Předmět Autor Datum
funkce SetWindowPos by měla být to pravé. http://msdn2.microsoft.com/en-us/library/ms633545.a spx
mia 21.04.2007 09:28
mia
Na toto som ešte slabý programátor, aby som volal API funkcie Windows. Vieš poradiť ako to zavolať?
msx. 21.04.2007 10:07
msx.
Neumím Delphi, bohužel. Programuju ve Visual Basicu a tam se to volá takto: v modulu: Global Const…
mia 21.04.2007 10:59
mia
Dobre, možno si s tým nejako poradím, ale ako získam HWND okna?
msx. 21.04.2007 11:27
msx.
hWnd se mi nabídne samo, když píšu program. Ve VB je to jedna z vlastností formu, handle=form1.hwnd…
mia 21.04.2007 12:22
mia
To je v poriadku. VB pracuje priamo s funkciami vo Windows. Borland je trochu iný, ale myslím, že je…
msx. 21.04.2007 12:46
msx.
Na toto by sa dala pouzit funkcia FindWindow: var hwnd: THandle; ... hwnd:= FindWindow(nil, PChar(w…
Intex 21.04.2007 17:21
Intex
Já ho chápu, jde mu o to, aby se mu vyhodilo "info" o probíhajícím výpočtu na popředí před stávající…
mia 21.04.2007 17:53
mia
Tak potom riesenim je "AlwaysOnTop"... ak to dobre chapem... a tuto vlastnost moze dat hocijakemu fo…
Intex 21.04.2007 18:28
Intex
Skus ked vytvaras to okno daj mu flag always_on_top. Zavisi ako to okno vytvaras, vid manual k danej…
MM.. 21.04.2007 18:36
MM..
V okně, co má být v aplikaci "furt nahoře" udělej toto: type TForm1 = class (TForm) --- private pro…
Rce 21.04.2007 23:48
Rce
Zajtra to skúsim. Zatiaľ ďakujem a potom označím za vyriešené, ak to pôjde.
msx. 23.04.2007 00:39
msx.
ak to pôjde Kdyby ne, vymyslíme něco jiného :-D. poslední
Rce 23.04.2007 00:56
Rce

Neumím Delphi, bohužel. Programuju ve Visual Basicu a tam se to volá takto:

v modulu:
Global Const SWP_NOMOVE = 2
Global Const SWP_NOSIZE = 1
Global Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
Global Const HWND_TOPMOST = -1
Global Const HWND_NOTOPMOST = -2

Declare Function SetWindowPos Lib "user32" (ByVal h As Long, ByVal hb As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal f As Integer) As Integer

v programu:
retval=SetWindowPos(okno.hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)

způsobí to, že okno se jménem "okno" bude vždy nad ostatními okny, i když nebude mít focus.

To je v poriadku. VB pracuje priamo s funkciami vo Windows. Borland je trochu iný, ale myslím, že je tam aj jednoduchšie riešenie. Zatiaľ mi to neponáhľa a v najhoršom prípade to znásilním vytvorením panela na hlavnom formulári aplikácie a budem s ním pracovať tak, že v prípade potreby ho zobrazím.

Na toto by sa dala pouzit funkcia FindWindow:

var hwnd: THandle;
...
hwnd:= FindWindow(nil, PChar(windowTitle))
if(hwnd <> 0)
begin
  Windows.SetWindowPos(hwnd, udaje ktore potrebujes);
end;

Inak, presne nechapem o co ti ide... ak chces mat okno stale navrchu tak skus zapnut AlwaysOnTop...

edit: windowTitle si dotiahni z okna formulara, pri jeho otvarani...

Skus ked vytvaras to okno daj mu flag always_on_top. Zavisi ako to okno vytvaras, vid manual k danej komponente delphi ktorou vytvaras dialog, prip. ak pouzivas WinAPI tak msdn.microsoft.com
Ak vytvaras dialog zo sablony (a sablonu si si nakreslil pred prekladom programu) tak to nastav rovno v sablone (.res) prip. naklikaj ak tvoj editor dialogov umoznuje nastavovat vlastnosti okna.

V okně, co má být v aplikaci "furt nahoře" udělej toto:

type TForm1 = class (TForm)
   ---
   private
   procedure CreateParams (var AParams: TCreateParams); override;
   ---
end;
---
---
TForm1.CreateParams (var AParams: TCreateParams);
begin
   inherited CreateParams (AParams);
   AParams.WndParent := Application.MainForm.Handle;
end;
(

Zpět do poradny Odpovědět na původní otázku Nahoru