Tuesday, January 31, 2006

program Project1;

uses
Forms, Windows,
Unit1 in 'Unit1.pas' {Form1},
Logo in 'Logo.pas' {Logo};

{$R *.RES}

begin
Logo := TLogo.Create(nil);
Logo.Show;

if GetKeyState(vk_F8) < 1 then MessageBox(0,'Během startu bylo stisknuto F8','Pozor',mb_ok);

Application.Initialize;
Application.CreateForm(TForm1, Form1);

Logo.Hide;
Logo.Release;

Application.Run;

end.
V našem příkladu se při stisku klávesy F8 objeví jednoduché upozornění. Samozřejmě je to pouze pro názornost a nemusím snad připomínat, že můžete doplnit libovolný kód.

Sunday, January 29, 2006

Detekce

stisknuté klávesy během startu aplikace
Tato funkce trošku souvisí s předchozím tipem. Ukážeme si, jak otestovat, zda byla během startu aplikace stisknuta daná klávesa. Využití je různé, aplikace se může např. spustit ve speciálním módu apod.
Opět musíme upravit projektový soubor aplikace. Nejprve přidáme do Uses knihovnu Windows, jejíž funkci GetKeyState budeme potřebovat. Poté přidáme do kódu samotný test ještě před Application.Initialize, takže můžeme náš předchozí příklad se startovacím logem rozšířit asi takto:

Saturday, January 28, 2006

Logo

Mezi Logo.Show a Logo.Hide umístíme (kromě Application.Initialize a Application.CreateForm) tu část kódu programu, která se stará o např. již zmiňované načtení nastavení apod., zkrátka tu činnost, která se bude skrytě provádět během zobrazení loga. Poté logo schováme (příkazem Logo.Hide a Logo.Release) a až na úplný závěr příkazem Application.Run spustíme samotný program.

Thursday, January 26, 2006

Když

- máme takto náš formulář připraven k použití, přistoupíme k vlastní úpravě kódu. Otevřeme si projektový soubor naší aplikace (přípona .dpr) a upravíme jej nějak takto:
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Logo in 'Logo.pas' {Logo};

{$R *.RES}

begin
Logo := TLogo.Create(nil);
Logo.Show;

{sem přijde váš kód}

Application.Initialize;
Application.CreateForm(TForm1, Form1);

Logo.Hide;
Logo.Release;

Application.Run;

end.

Wednesday, January 25, 2006

Dále

- je nutné zajistit, aby tento formulář nebyl automaticky vytvořen po startu aplikace, ale abychom jeho zobrazení měli pod kontrolou my. Toho dosáhneme tak, že si otevřeme vlastnosti projektu (menu Project->Options). Zde na kartě Forms vidíme dva seznamy, Auto-create forms a Available forms. Zatím budou všechny vaše dosud vytvořené formuláře projektu pravděpodobně pod Auto-create včetně Loga. Příslušnou šipkou přesuneme formulář loga mezi Available forms.

Tuesday, January 24, 2006

Zde je tedy postup:

- Nejprve si do našeho projektu přidáme nový formulář (v našem příkladu se bude jmenovat Logo), na který můžete umístit, cokoliv vás napadne. Nejčastěji to bude komponenta Timage, která bude vyplňovat celý formulář a bude obsahovat vaše logo v podobě obrázku. Asi bude též vhodné nastavit vlastnosti formuláře tak, aby nebyl vidět pruh s titulkem okna (vlastnost BorderStyle nastavíme na bsNone).

Monday, January 23, 2006

startovací logo

Avšak pozor na to, aby startovací logo nezdržovalo samotný start aplikace. Mám tím na mysli to, že program, který má několik desítek kilobajtů, během startu nic nenačítá a je spuštěn během chvíle, vlastně žádné úvodní logo nepotřebuje. Dávat ho tam pouze pro efekt sice můžete, ale pamatujte, že by mělo zmizet co nejrychleji. Uživatel je zvědav na vaši aplikaci a ne na vaše logo. Zitra vam se m napisu jak postupovat, aby to vse fungovalo :))))

Sunday, January 22, 2006

Startovací logo - Splashscreen

Tento tip už je o poznání užitečnější než předchozí a využít ho ve svých aplikacích může téměř kdokoliv. Oč se vlastně přesně jedná? Myslím, že vysvětlovat není co, všichni to znáte a vidíte každý den. Aplikace během startu, při kterém kupříkladu načítá nastavení, zobrazí své logo (tzv. splashscreen), kde může být zobrazen kromě (někdy) hezkého obrázku i třeba průběh načítání či podobné užitečné informace. Je to rozhodně lepší než "prázdná" obrazovka, kdy si uživatel nemůže být jist, co se vlastně děje.

Saturday, January 21, 2006

Parametry

procedury jsou, myslím, jasné a netřeba dalšího vysvětlování. Jak to vlastně funguje ? Nejprve najdeme "okno", kde se ikony nalézají (funkce FindWindow a FindWindowEx). Je to potomek Program Manageru a obsahuje ListView, kde jsou uloženy všechny ikony plochy. Jejich parametry poté jen změníme podle našich požadavků.
Následující procedurou vrátíme vše zase zpět (tak, jak to mají Windows uloženo v nastavení):
procedure NastavPuvodniBarvy;
var
Druh: Integer;
Barva: TColor;
begin
Druh := COLOR_DESKTOP;
Barva := GetSysColor(COLOR_DESKTOP);
SetSysColors(1, Druh, Barva);
end;

Thursday, January 19, 2006

Napíšeme

si dvě procedury. Jedna bude mít za úkol měnit nastavení barev podle chuti, druhá vrátí vše do původního stavu. Připomínám, že nesmíte zapomenout přidat do Uses knihovnu CommCtrl.
.
.
.
uses CommCtrl;
.
.
.

procedure SetDesktopIconColor(BarvaTextu, BarvaPozadi: TColor; Trans: Boolean);

var Window: HWND;

begin
Window := FindWindow('Progman', 'Program Manager');
Window := FindWindowEx(Window, HWND(nil), 'SHELLDLL_DefView', '');
Window := FindWindowEx(Window, HWND(nil), 'SysListView32', '');
if Trans then ListView_SetTextBkColor(Window, $ffffffff)
else ListView_SetTextBkColor(Window, BarvaPozadi);
ListView_SetTextColor(Window, BarvaTextu);
ListView_RedrawItems(Window, 0, ListView_GetItemCount(Window) - 1);
UpdateWindow(Window);
end;

Wednesday, January 18, 2006

Pracovní plocha a ikony

Následující příklad nám ukáže, jak si drobně vylepšit pracovní plochu. Opět je to asi jeden z tipů, který mnoho z vás nepoužije (leda byste programovali nějakou šikovnou utilitu na úpravu Windows), ale přesto bude zajímavé si o něm říci.
O co se tedy bude konkrétně jednat? Naučíme se měnit barvu podkladu a textu ikon, a hlavně se naučíme, jak docílit toho, aby byl text ikon transparentní. V základní konfiguraci Windows, bez použití dalších pomocných programů, vypadá pracovní plocha docela nepěkně, protože i když si zvolíte hezkou tapetu, celý efekt nám kazí nevzhledné popisky ikon, u kterých nelze nastavit transparentnost (průhlednost). Naučíme se tedy, jak tyto parametry měnit.

Tuesday, January 17, 2006

procedure UkazTaskbar;

var hTaskBar : THandle;
begin
hTaskbar := FindWindow('Shell_TrayWnd', Nil);
ShowWindow(hTaskBar, SW_SHOWNORMAL);
end;
Další na řadě je tlačítko Start. Naučíme se, jak znemožnit jeho stisknutí, i když tento tip patří již opravdu spíše do kategorie kuriozit a vážně mě nenapadá způsob jeho seriózního využití. Nutno ještě poznamenat, že ono "znemožnění stisknutí" se týká pouze myši, protože pokud použijete příslušné tlačítko na klávesnici, Startmenu se objeví.

Sunday, January 15, 2006

Hrátky s Taskbarem a tlačítkem Start

Určitě jste již viděli, že během instalace různých aplikací dojde nejen k maximalizaci instalačního programu na celou obrazovku, ale pro větší efekt zmizí i Taskbar (Hlavní panel). Někdy se nám prostě může hodit, aby tento "rušivý" element" nekazil dojem z naší krásné aplikace. :)
Jak tedy na to? Pomůžou nám v tom dvě funkce z Windows API. První z nich, FindWindow, zjistí handle k Taskbaru a druhá funkce, ShowWindow, zase s patřičnými parametry zajistí jeho zmizení.
procedure SchovejTaskbar;
var hTaskBar : THandle;
begin
hTaskbar := FindWindow('Shell_TrayWnd', Nil);
ShowWindow(hTaskBar, SW_HIDE);
end;

Friday, January 13, 2006

Co příště?

V příštím díle nejdříve trošku potrápíme Windows tím, že se naučíme schovat Taskbar a deaktivovat tlačítko Start a dále si ukážeme pár dalších užitečných postupů, jak vylepšit vlastní aplikace.
Tipy a triky v Delphi, díl 4.
15. 8. 2001, Jan Šindelář formát pro tisk
V dnešním díle našeho malého seriálu si nejprve ukážeme pár triků s Taskbarem a ikonami na ploše, naučíme se do svých aplikací přidat startovací logo (tzv. splashscreen) a detekci stisknuté klávesy při startu. No a nakonec si zkusíme "deaktivovat" tlačítko na ukončení aplikace.

Thursday, January 12, 2006

defrag

Rovněž aplikace citlivé na zápisy na disk (např. defragmentace disku) může spořič vytrhnout z jejich činnosti (a třeba i přinutit začít od začátku), protože při jeho aktivaci se obvykle s diskem pracuje. Jistě by se našla i celá řada dalších příkladů, kdy je vhodné ho mít deaktivovaný, takže se teď naučíme, jak na to, a samozřejmě si ukážeme i způsob, jak vše uvést do původního stavu, protože ani na to byste v aplikacích neměli zapomínat.
procedure DeaktivujSetric;
begin
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,0,nil,0);
end;

procedure AktivujSetric;
begin
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,1,nil,0);
end;

Tuesday, January 10, 2006

Funkce

nejprve zjistí, zda je spořič k dispozici a pokud ano, spustí jej. V opačném případě se samozřejmě nestane nic a funkce vrátí na výstupu hodnotu false. I rychlé spuštění spořiče se může hodit jako miniaplikace (viz. předchozí příklad s vypínáním monitoru) a navíc zde odpadá i starost s opětovným programovým "probuzením" systému.
Na úplný závěr jsem si nechal deaktivaci a opětovnou aktivaci spořiče (neboli zakázání a povolení systému spořič aktivovat). K čemu je to vlastně dobré? Napadá mě hned několik využití, lépe řečeno aplikací, které tuto funkci využívají. Kupříkladu MediaPlayer nebo jiný váš oblíbený přehrávač videosouborů tuto funkci zcela jistě využívá, protože by asi nebylo moc příjemné, kdyby se vám po pár minutách filmu náhle zjevil spořič obrazovky a museli jste každých pár minut pro jistotu pohnout myší, aby se neobjevil znovu.

Sunday, January 08, 2006

pokracujeme

Milovníky Windows 2000 opět musím zklamat, že v tomto systému náš příklad nebude fungovat.
Spořič obrazovky
Na závěr jsem si nechal téma příbuzné tématu předchozímu .Spořič obrazovky jistě každý zná, takže žádné dlouhé úvody. Naučíme se jej nejen přímo spustit, ale také zakázat či povolit systému jeho spuštění, což je funkce nadmíru užitečná.
Tak tedy nejprve spuštění spořiče:
function SpustSporic : boolean;
var
b : boolean;
begin
result := false;
if SystemParametersInfo(SPI_GETSCREENSAVEACTIVE,0,@b,0) <> true then exit;
if not b then exit;
PostMessage(GetDesktopWindow, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
result := true;
end;

Friday, January 06, 2006

Takže dost teorie,

zde máme náš zdrojový kód:
procedure Uspi;
begin
SendMessage(Application.Handle,wm_SysCommand,SC_MonitorPower,0);
end;

procedure Probud;
begin
SendMessage(Application.Handle,wm_SysCommand,SC_MonitorPower,-1);
end;
Důrazně vás však musím upozornit na to, že musíte ve svém programu též ošetřit probuzení monitoru, protože pohnutí myší nebo stisk klávesy jako u běžného uspání nefunguje a vám by pravděpodobně nezbylo nic jiného, než tlačítko reset (a nebo naslepo restartovat počítač), protože monitor by se už nepodařilo probudit. Ideální a standardní je nastavit probuzení monitoru na již zmiňované pohnutí myší nebo stisk libovolné klávesy.

Wednesday, January 04, 2006

Napadá

mě, že by se dalo využít této funkce např. k naprogramování malého "vypínače" - tlačítka v rohu obrazovky, po jehož aktivaci by se monitor uspal .Pokud kupříkladu víte, že musíte od počítače odběhnout na více než jen pár minut, ale z nějakého důvodu nemůžete vypnout počítač (např. probíhající výpočet apod.), potom by to byla funkce celkem užitečná. Jinak by se totiž nejprve spustil spořič obrazovky a až po delší době (podle nastavení) by se deaktivoval monitor, což může být nejen zbytečné plýtvání energií, ale také zbytečné opotřebování monitoru.

Monday, January 02, 2006

Uspání monitoru

Na druhou stranu ale musím přiznat, že jsem viděl i software, který touto vadou netrpěl, avšak dosud se mi nepodařilo přijít na způsob jak to dokázat. Pokud někdo ví, jak na to, budu rád, když se ozvete a pochlubíte se.

V našem dalším příkladu si ukážeme, jak "uspat" monitor neboli jak jej přepnout do úsporného režimu. Je to funkce zajímavá, ačkoliv jí asi většina z vás moc nevyužije. Chce to opravdu již závažný důvod k tomu, aby vaše aplikace uspala monitor, pokud to ovšem není její primární funkcí.

Abych byl upřímný,

nejsem příliš spokojený s funkcí na zavření mechaniky. Sice funguje, to ano, avšak při zavírání dojde na chvilku k určitému "zamrznutí" systému, které trvá tak dlouho, dokud se mechanika nezinicializuje, což může trvat i 2 až 3 sekundy (záleží na modelu vaší mechaniky). Zkuste si např. spustit Přehrávač CD z Windows a zkusit zasunout CD přes tlačítko Eject. I v tomto programu (a řadě dalších) dojde k malému "mikrospánku" systému, což mě utvrzuje v tom, že tento způsob není moje chyba, nýbrž pravděpodobně vlastnost systému Windows.