| Autor | Správa |
newby
 Užívateľ
 Založený: 03.02.2010 Príspevky: 9
 | Zaslal: Ut 27.07.10 15:28 |   |
Ako si mozem vytvorit jednoduche vyskakovacie okno nad listou? Ako aplikacie oznamuju nieco, napr. AV novy update databazy. Predpokladajme ze moja aplikacie je schovana v tray. |
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Ut 27.07.10 15:41 |   |
tak nam prezrad ako si schoval svoju aplikaciu do tray ? |
| |
  |
 |
newby
 Užívateľ
 Založený: 03.02.2010 Príspevky: 9
 | Zaslal: Ut 27.07.10 16:02 |   |
| kód: |
TrayIcon1.Visible:=true;
hide;
|
|
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 908
 | Zaslal: Ut 27.07.10 16:39 |   |
Trieda TTrayIcon by mala obsahovať vlastnosť PopUpMenu. Takže na formulár si daj komponent TPopupMenu z palety Standard. Na formulár to umiestní iba ikonu, na ktorú teraz klikni pravým tlačidlom a vyber prvú možnosť - Menu designer.... Tu si vytvor vlastné menu podľa potrieb. Potom už len niekde v kóde priraď toto menu vlastnosti PopUpMenu:
| kód: | | TrayIcon1.PopUpMenu := PopupMenu1; |
|
| |
   |
 |
newby
 Užívateľ
 Založený: 03.02.2010 Príspevky: 9
 | Zaslal: Ut 27.07.10 17:02 |   |
Nemyslel som popupmenu ale vyskakovacie okno. Ako napr. FF ked dokonci download tak sa vysunie info o dokonceni stahovania, alebo AV ked dokonci update tak vyhodi info nad listu.
nieco take co vyskoci samo pri istej udalosti
 |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 908
 | Zaslal: Ut 27.07.10 17:14 |   |
Aha, zle som pochopil. Ja to riešim vytvorením nového Formu, na ktorý naukladám, čo potrebujem - ten je samozrejme zbavený záhlavia, je zmenená farba a prípadne sa môže použiť transparentnosť. Ďalej získam súradnice obrazovky:
| kód: | Screen.WorkAreaWidth // sirka
Screen.WorkAreaHeight // vyska |
a potom form umiestním za celú výšku a šírku obrazovky. Nakoniec už len po vykonaní určitej udalosti pomocou timera mením Form.Top premennú daného formu. Počká sa určitý čas a opäť sa schová.
Ak potrebuješ konkrétny príklad, tak napíš.
// Poznámka: existuje aj Screen.Width a Screen.Height vlastnosť. Ale tie vyššie spomenuté vlastnosti (WorkArea...), vracajú šírku a výšku bez zarátania hlavného panelu. Tým sa zabráni, aby kus okna vykukovalo spod obrazovky, respektíve, aby nebolo príliš nízko. |
| |
   |
 |
newby
 Užívateľ
 Založený: 03.02.2010 Príspevky: 9
 | Zaslal: Ut 27.07.10 17:44 |   |
takto som to skusal, ale so Screen.width Screen.Height , neviem ako ten formular dat nad vsetky okna. (aby bolo vidiet ze sa vobec nieco vysunulo).Skusal som nastavit na ten druhy form fsStayOnTop ale nic.
Edit: ved mozes dat aj priklad ak ti to nerobi problem |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 908
 | Zaslal: Ut 27.07.10 19:19 |   |
1.) File | New | Form
Týmto vytvor nový formulár. Nahádž naň, čo potrebuješ. Nastav vlastnosť BorderStyle na bsNone. Pridaj tu aj jeden timer (budem sa naňho odvolávať cez názov tmShow), ktorého interval nech je 1 ms.
2.) do udalosti OnTimer timeru tmShow daj toto:
| kód: | // ak je tag 0, formular sa roluje dole, ak je 1, hore
if ( tmShow.Tag = 0 ) then begin
if ( Form2.Top >= ( Screen.WorkAreaHeight - Form2.Height ) ) then begin
Form2.Top := Form2.Top - 1;
exit;
end;
Form2.Top := Screen.WorkAreaHeight - Form2.Height;
tmShow.Tag := 1; // zmena dalsieho rolovania na smer hore
end
else begin
if ( Form2.Top <= Screen.WorkAreaHeight ) then begin
Form2.Top := Form2.Top + 1;
exit;
end;
Form2.Top := Screen.WorkAreaHeight;
tmShow.Tag := 0; // zmena dalsieho rolovania na smer dole
end;
tmShow.Enabled := false;
|
3.) a do OnCreate tohto formu toto:
| kód: | Self.Left := Screen.WorkAreaWidth - Form2.Width;
Self.Top := Screen.WorkAreaHeight + 2;
Show; |
Týmto sa popup form umiestni do pravého dolného rohu.
4.) v tvojom hlavnom unite pridaj do uses unit s novým formom - napr unit2.
5.) Teraz už iba stačí kdekoľvek v tvojom projekte zapnúť timer tmShow (vypne sa sám, o to sa netreba starať)
| kód: | | Form2.tmShow.Enabled := true; |
pre vyvolanie a pre zatvorenie popup formu - čiže pre každé zvlášť. |
| |
   |
 |
newby
 Užívateľ
 Založený: 03.02.2010 Príspevky: 9
 | Zaslal: Ut 27.07.10 19:49 |   |
Vdaka, presne takto som to chcel . Len problem je vtom, ze ak mam hlavny Form1 schovany (v tray) tak ani to vysuvacie okno nevidno. A prave toto je zaklad |
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Ut 27.07.10 21:03 |   |
skus tomu form2 nastavit parenta desktop |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 908
 | Zaslal: Ut 27.07.10 21:09 |   |
Alebo skús dať ako prvý riadok v OnTimer timera tmShow tento riadok:
// neviem, či to pomôže, lebo mne to funguje správne, aj ak je hlavný form skrytý, ale skús to |
| |
   |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Ut 27.07.10 21:18 |   |
netreba ziadny timmer, staci pri vytvarani popup okna nastavit parenta desktop
| kód: | frm := TForm2.CreateParented(getDesktopWindow());
frm.Show; |
|
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 908
 | Zaslal: Ut 27.07.10 21:29 |   |
Parent už je nastavený na desktop. Ak vytvoril form podľa hore uvedeného postupu, vlastník nie je pôvodný formulár, keďže sa od neho vytváral nezávisle (preto musel pridať do uses názov novovytvoerného unitu.
Skúška: Nasledujúca správa
| kód: | | ShowMessage( IntToStr( Form2.ParentWindow ) ); |
zobrazila nulu, čo je, pokiaľ viem, handle desktopu. |
| |
   |
 |
newby
 Užívateľ
 Založený: 03.02.2010 Príspevky: 9
 | Zaslal: Ut 27.07.10 21:50 |   |
Zle som sa vyjadril. Pri Hide je to v poriadku. Pri minimalizovani zmizne aj Form2.
A dalsia vec. Ak mam focus na neakom cudzom okne ci uz co je na tej pozicii alebo maximalizovane tak ten form2 nevidno. Co stym? |
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Ut 27.07.10 22:08 |   |
|
  |
 |
|