Monday, June 20, 2011

Práce s INI soubory

Jistě mi dáte za pravdu, že každá i jen malinko rozsáhlejší aplikace tu a tam potřebuje uložit nějaká data na disk. Typicky to mohou být různá uživatelská nastavení, stavové informace o programu (jako je poloha okna, naposledy otevřený adresář atd..) a řada dalších informací nutných pro běh aplikace. S příchodem Windows 95 se zpočátku s nadšením upustilo od INI souborů, ve kterých byly podobné informace uloženy, a všichni se vrhli na registry. Logickým argumentem bylo kromě jiného i to, že v dobách starých Windows se v jejich adresáři často hromadilo velké množství nepotřebných INI souborů od již dávno odinstalovaných aplikací. Bohužel se brzy zjistilo, že se tento problém se zapomenutými či špatně odinstalovanými daty přechodem na registry moc neodstranil, pouze se přesunul na jiné místo a přeplněné a nepřehledné registry máme v našich systémech zřejmě všichni.

Labels:

Wednesday, May 25, 2011

Práce s INI soubory

Jistě mi dáte za pravdu, že každá i jen malinko rozsáhlejší aplikace tu a tam potřebuje uložit nějaká data na disk. Typicky to mohou být různá uživatelská nastavení, stavové informace o programu (jako je poloha okna, naposledy otevřený adresář atd..) a řada dalších informací nutných pro běh aplikace. S příchodem Windows 95 se zpočátku s nadšením upustilo od INI souborů, ve kterých byly podobné informace uloženy, a všichni se vrhli na registry. Logickým argumentem bylo kromě jiného i to, že v dobách starých Windows se v jejich adresáři často hromadilo velké množství nepotřebných INI souborů od již dávno odinstalovaných aplikací. Bohužel se brzy zjistilo, že se tento problém se zapomenutými či špatně odinstalovanými daty přechodem na registry moc neodstranil, pouze se přesunul na jiné místo a přeplněné a nepřehledné registry máme v našich systémech zřejmě všichni.
Proto si myslím, že není třeba INI soubory ještě zcela zatracovat. Ukážeme si, co nám mohou pro pohodlnou práci s nimi nabídnout Delphi. Všechny důležité funkce se skrývají v knihovně IniFiles, takže ji přidejte do projektu. Nevím, jestli to není zbytečné, ale možná bychom se měli nejprve přece jen alespoň krátce zmínit, jak takový INI soubor vlastně vypadá. Jedná se o obyčejný textový soubor, a když si nějaký prohlédnete, zjistíte, že je rozdělen na určité sekce. Každá je označena svým názvem uvedeným v hranatých závorkách. Těsně za tímto názvem sekce následují jednotlivé řádky, kde je vždy uveden název parametru a za rovnítkem jeho hodnota. Formát je to tedy velmi jednoduchý, přehledný a snadno (i ručně) editovatelný.

Labels:

Monday, May 09, 2011

Až si budete s těmito parametry hrát, jistě brzy zjistíte, že tento efekt sice může vypadat velmi zajímavě a hezky, ale někdy je problém s čitelností textu na takto poloprůhledném okně, neboť prosvítající podklad může vytvářet menší chaos, pokud obsahuje například text se stejným fontem a stejnou barvou podkladu. Je proto nutné šikovně zvolit úroveň průhlednosti a také barvy jednotlivých prvků na takovémto okně s ohledem na podklad. Rozhodně by nebylo příliš moudré využít této vlastnosti například pro okno textového editoru, protože prosvítající podklad by mohl dost značně zkomplikovat čitelnost textu. Naproti tomu je tato vlastnost ideální k vytvoření různých "About..." boxů a přímo dokonale se hodí k vytvoření "Spash screen". Možná znáte oblíbený grafický benchmark 3D Mark, který po svém spuštění zobrazí obvyklý splashscreen, navíc s efektem postupného objevování. Přesně tento efekt si můžete vytvořit ve svých aplikacích také, právě s využitím průhlednosti okna. Jak vytvořit splashscreen jsme si již v našem seriálu říkali a efekt postupného objevování či mizení vytvoříte snadno tím, že budete postupně měnit hodnotu vlastnosti AlphaBlendValue, protože je to vlastnost, která se dá pochopitelně měnit přímo za běhu aplikace. Tohoto efektu se dá využít prakticky u všech oken aplikace, jenom je třeba si dát pozor, aby ono objevování či mizení netrvalo příliš dlouho a nezdržovalo.
A dostáváme se k vlastnostem TransparentColor a TransparentColorValue. První z nich je opět logická proměnná nabývající hodnot True nebo False. Zapíná nebo vypíná průhlednost barvy, kterou definuje vlastnost TransparentColorValue. Budete-li tedy chtít, aby nějaká konkrétní barva nebyla vůbec vidět, tedy přesněji řečeno byla průhledná a místo ní se zobrazovalo pozadí okna (to, co je pod oknem), tímto parametrem toho dosáhnete. Snadno tak můžete vytvořit na formuláři "díry", i když v tomto případě mě nenapadá nějaké rozumné využití.
Co říci na závěr? Že každá legrace něco stojí. V tomto případě je to výkon počítače. Pokud totiž máte zastaralejší hardware, nemusí být překreslování těchto poloprůhledných oken právě nejrychlejší, obzvlášť pokud máte zapnutou vlastnost "Zobrazovat obsah okna během přetahování". Další nevýhodou je to, že tento efekt bude viditelný pouze ve Windows 2000 a XP, ale na druhou stranu si nemusíte dělat starosti s nefunkčností aplikace pod staršími Windows 9x, protože zde bude váš program bez problémů také pracovat. Pouze bude ignorována vlastnost průhlednosti oken a ta budou zobrazena standardním způsobem. A poslední problém? Nutnost mít Delphi 6 (tedy šlo by to i bez nich, ale složitějším způsobem než pouhým nastavováním vlastností v Object Inspectoru), verzi Personal si však můžete zdarma stáhnout přímo od Borlandu.

Tuesday, March 08, 2011

Tipy a triky v Delphi

Prvním tématem dnešního dílu bude práce s průhledností oken pod Delphi 6 a poté se poněkud obsáhleji zaměříme na použití INI souborů.
Průhlednost oken v Delphi 6
Moderní operační systémy se snaží nejen dobře fungovat, což se předpokládá jako samozřejmost (škoda, že tomu tak ne vždy je), ale snaží se též zaujmout svým vzhledem. Proto se i v nejnovější verzi Windows, tedy Windows XP, objevily vizuální styly. Kromě tohoto na první pohled viditelného rozdílu však Windows (a to dokonce už ve verzi 2000) obsahují ještě jeden zajímavý vizuální prvek, který se však v programech přesto příliš neobjevuje. Tímto prvkem je průhlednost oken. Od nové verze Delphi 6 se tato vlastnost oken již objevila v seznamu parametrů v Object Inspectoru, takže použití bude hračka.
O průhlednost okna, či přesněji řečeno průsvitnost, se starají 4 základní vlastnosti okna. Jsou to vlastnosti AlphaBlend, AlphaBlendValue, TransparentColor a TransparentColorValue. Hned si objasníme, co která vlastnost znamená, i když z názvů je to docela patrné.
AlphaBlend může nabývat hodnot True nebo False a určuje, zda chceme či nechceme průhlednost oken používat. Až tedy budete experimentovat, musíte nastavit hodnotu True, jinak se pochopitelně nedostanete dál. Když tímto způsobem průhlednost povolíme, druhý parametr AlphaBlendValue určuje číselnou hodnotu průhlednosti. Může nabývat hodnot od 0 do 255, přičemž 0 znamená zcela průhledné okno, zatímco 255 je přesný opak, tedy okno zcela neprůhledné (standardní).

Labels:

Wednesday, February 09, 2011

Zmizení kurzoru myši

Velice krátký a jednoduchý tip. Zmizení kurzoru myši docílíme takto:
ShowCursor(false);
a jeho opětovné zobrazení celkem logicky takto:
ShowCursor(true);
Je třeba něco dodávat ? Myslím, že určitě ne. Využití tohoto tipu nechám na vás.
Kopírování souboru se zobrazením průběhu
Chcete si vytvořit vlastní souborový manažer ? Pak se vám možná bude hodit tento tip, ve kterém si ukážeme kopírování souborů s ukazatelem průběhu celé akce. O stupínek výš bychom se s naším příkladem dostali, pokud by kopírování probíhalo v samostatném vlákně na pozadí, ale to poněkud přesahuje prostorové možnosti tohoto dílu seriálu. Takže nám opět pomůže obvyklé Application.ProcessMessages, aby nedošlo k "zamrznutí" aplikace po dobu kopírování.
procedure CopyFileWithProgressBar(Source, Destination : string);
var
FromF,
ToF : file of byte;
Buffer : array[0..4096] of char;
NumRead : integer;
FileLength : longint;
begin
AssignFile(FromF,Source);
reset(FromF);
AssignFile(ToF,Destination);
rewrite(ToF);
FileLength:=FileSize(FromF);
with Form1.Progressbar1 do
begin
Min := 0;
Max := FileLength;
while FileLength > 0 do
begin
BlockRead(FromF,Buffer[0],SizeOf(Buffer),NumRead);
FileLength := FileLength - NumRead;
BlockWrite(ToF,Buffer[0],NumRead);
Position := Position + NumRead;
Application.ProcessMessages;
end;
CloseFile(FromF);
CloseFile(ToF);
end;
end;

procedure TForm1.Button16Click(Sender: TObject);
begin
CopyFileWithProgressBar('c:\zdroj.exe','c:\cíl.exe');
end;
Jak vidíte, princip je velmi jednoduchý a snadno pochopitelný. Samozřejmě je nutné, aby byla formuláři umístěna komponenta ProgressBar.

Labels: