Autor Téma: ShowMessage  (Přečteno 3351 krát)

Kamil.M

  • Host
ShowMessage
« kdy: 11-07-2012, 07:45:59 »
Dobry den.
Měl bych dotaz na ty zkušenějši.
Da se vylolat ShowMessage bez toho tlačitka OK a po čase ukončit.
Třeba když chci vypsat '' 'čekej, počitam'
A po vypočtu aby program sam ShowMessage shodil.
Nebo to musim řešit přes Form

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1559
  • Karma: 37
    • Pepak.net
Re:ShowMessage
« Odpověď #1 kdy: 11-07-2012, 08:05:05 »
Musíš si na to napsat vlastní funkci, která samozřejmě použije Form (můžeš se inspirovat ve zdrojáku MessageDlg).

Pokud to ale chceš na zobrazení stavu ("čekej, počítám"), tak je mnohem lepší řešení:
1) Nastavit Form.Enabled na False.
2) Zobrazit (resp. vytvořit a zobrazit) Panel, na kterém vypíšeš svoji zprávu a případně i progressbar.
3) Počítat (a průběžně aktualizovat progressbar).
4) Skrýt (resp. zničit) Panel s průběhem.
5) Nastavit Form.Enabled na původní hodnotu.

Obecně:
- ShowMessage používej tehdy, když chceš uživateli něco jednoduše a rychle zobrazit a počkat, až to odklepne (typicky jenom ladící zprávy).
- MessageDlg používej, pokud a) chceš trochu složitější formátování (moci si vybrat ikonku, například), b) chceš od uživatele jednu z několika odpovědí.
- Jinak používej jiné přístupy.

Kamil.M

  • Host
Re:ShowMessage
« Odpověď #2 kdy: 12-07-2012, 06:46:43 »

Pokud to ale chceš na zobrazení stavu ("čekej, počítám"), tak je mnohem lepší řešení:
1) Nastavit Form.Enabled na False.
2) Zobrazit (resp. vytvořit a zobrazit) Panel, na kterém vypíšeš svoji zprávu a případně i progressbar.
3) Počítat (a průběžně aktualizovat progressbar).
4) Skrýt (resp. zničit) Panel s průběhem.
5) Nastavit Form.Enabled na původní hodnotu.

Dik, funguje a je to fakt rozumnějši.
Jen dotaz.
Když nastavim Form.enabled na False
Program bude provadět vypočet delši dobu.
V teto době uchopim form myšakem a chci přetahnout jinam.
Nefunguje to, protože je Form.enabled   False.
Ale po ukončeni vypočtu a nastavení Form.enabled  na true se Form sam přemisti na pozici, kam sem se ho snařil přemistit když byl ve stavu Form.enabled.false.
Proč


Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1559
  • Karma: 37
    • Pepak.net
Re:ShowMessage
« Odpověď #3 kdy: 12-07-2012, 07:23:10 »
V teto době uchopim form myšakem a chci přetahnout jinam.
Nefunguje to, protože je Form.enabled   False.
Ale po ukončeni vypočtu a nastavení Form.enabled  na true se Form sam přemisti na pozici, kam sem se ho snařil přemistit když byl ve stavu Form.enabled.false.
Proč
Podle mě ne proto, že má Enabled=False, ale proto, že v průběhu výpočtu nevoláš Application.ProcessMessages. Tudíž se formulář během výpočtu vůbec nedozví o tom, že ho uživatel chce někam přesunout - dozví se to až poté, co výpočet doběhne a začne se zase normálně zpracovávat fronta zpráv.

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 256
  • Karma: 3
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:ShowMessage
« Odpověď #4 kdy: 12-07-2012, 21:43:18 »
Pokud budes chtit volat Application.ProcessMessages, nedelej to prosim v kazde iteraci. 2x za sekundu to uplne staci. Vypocet by se zbytecne zpomalil.

Kamil.M

  • Host
Re:ShowMessage
« Odpověď #5 kdy: 13-07-2012, 07:24:26 »
To byl jen dotaz.
Application.ProcessMessages tam vubec nemam a stejnak se mi Form přesune.
Taky se mi to zda divne.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6162
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:ShowMessage
« Odpověď #6 kdy: 13-07-2012, 07:49:19 »
Veď si písal, že sa presunie. Ale až po skončení výpočtu. Application.ProcessMessages Ti má zaistiť okamžité presunutie. To len čítam čo Ti píšu.
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

Offline Duhacek

  • Nováček
  • *
  • Příspěvků: 15
  • Karma: 0
Re:ShowMessage
« Odpověď #7 kdy: 13-07-2012, 11:42:54 »
Našel jsem kdysi jednu nedokumentovanou funkci, sice se OK ukáže ale pak se okno uzavře...

 iRet, iFlg: integer;
 msg: wideString;

 iFlg:= MB_OK or MB_SETFOREGROUND or MB_SYSTEMMODAL or MB_ICONINFORMATION;
 msg:= 'čekej, počitam...';
 iRet:= MessageBoxTimeoutW(Application.Handle, PWideChar(msg), '', iFlg, 0, 3000); // = 3 sec, pak OK

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1174
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:ShowMessage
« Odpověď #8 kdy: 13-07-2012, 12:34:04 »
to sou patlaniny ...

proc nepouzije vlakno, pripadne jen "vlakno ve funkci"

viz.
http://semi.gurroa.cz/Clanky/Threads.html#ThreadProc

nezpomali to vypocet, bude to vsechno vykreslovat,
navic to zabere jen o 1 proceduru vic

Kód: Delphi [Vybrat]
  1. function VyokenjPraci: Boolean;
  2. var
  3.     thh: THandle;
  4.     thid: Cardinal;
  5. begin
  6.   // Spuštění threadu:
  7.   thh:=BeginThread(nil,0,@ExecFileThreadProc,nil,0,thid);
  8.   // Zavření handle threadu:
  9.   if (thh<>0) then begin
  10.     // Thread byl spuštěn...
  11.     CloseHandle(thh);
  12.     //
  13.     Result:=True;
  14.     //
  15.   end else begin
  16.  
  17.     Result:=False;
  18.   end;
  19. end;
  20.  

+/- par uprav

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1066
  • Karma: 29
    • Verze Delphi: XE8, Sydney
Re:ShowMessage
« Odpověď #9 kdy: 13-07-2012, 14:54:00 »
Taky je možné použít MessageBoxTimeOut(), ne?
:)

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1174
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:ShowMessage
« Odpověď #10 kdy: 13-07-2012, 16:20:50 »
uz to tu navrhl ...

OT: to je ale směšná funkce, by me zajimalo, kdo na takovou ptakovinu prisel  :P
ale muze se hodit, kdyz nekdo hodi dialog a potrebuje, aby nevisel treba hodinu :)
(jinak pro tadyten ucel nemyslim ze moc vhodne)