<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-15451656</id><updated>2011-11-11T01:16:49.168-08:00</updated><category term='Stav modemu'/><category term='windows'/><category term='Počítače'/><category term='Tipy a triky v Delphi'/><category term='delphi'/><title type='text'>html</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://html-jazyk.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default?start-index=101&amp;max-results=100'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>572</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-15451656.post-292793159737799618</id><published>2011-06-20T05:53:00.001-07:00</published><updated>2011-06-20T05:53:56.792-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>Práce s INI soubory</title><content type='html'>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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-292793159737799618?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/292793159737799618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/292793159737799618'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2011/06/prace-s-ini-soubory.html' title='Práce s INI soubory'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-1181494398568320678</id><published>2011-05-25T23:56:00.000-07:00</published><updated>2011-05-25T23:59:44.406-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>Práce s INI soubory</title><content type='html'>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. &lt;br /&gt;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ý.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-1181494398568320678?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1181494398568320678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1181494398568320678'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2011/05/prace-s-ini-soubory.html' title='Práce s INI soubory'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-699834030138474437</id><published>2011-05-09T00:47:00.000-07:00</published><updated>2011-05-09T00:48:35.544-07:00</updated><title type='text'></title><content type='html'>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. &lt;br /&gt;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í. &lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-699834030138474437?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/699834030138474437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/699834030138474437'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2011/05/az-si-budete-s-temito-parametry-hrat.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-2617305118384575387</id><published>2011-03-08T07:36:00.000-08:00</published><updated>2011-03-08T07:37:39.413-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>Tipy a triky v Delphi</title><content type='html'>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ů.&lt;br /&gt;Průhlednost oken v Delphi 6 &lt;br /&gt;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. &lt;br /&gt;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é. &lt;br /&gt;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í).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-2617305118384575387?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2617305118384575387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2617305118384575387'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2011/03/tipy-triky-v-delphi.html' title='Tipy a triky v Delphi'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-8539217633544311520</id><published>2011-02-09T05:42:00.000-08:00</published><updated>2011-02-09T05:45:41.435-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tipy a triky v Delphi'/><title type='text'>Zmizení kurzoru myši</title><content type='html'>Velice krátký a jednoduchý tip. Zmizení kurzoru myši docílíme takto:&lt;br /&gt;ShowCursor(false);&lt;br /&gt;a jeho opětovné zobrazení celkem logicky takto:&lt;br /&gt;ShowCursor(true);&lt;br /&gt;Je třeba něco dodávat ? Myslím, že určitě ne. Využití tohoto tipu nechám na vás.&lt;br /&gt;Kopírování souboru se zobrazením průběhu&lt;br /&gt;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í.&lt;br /&gt;procedure CopyFileWithProgressBar(Source, Destination : string);&lt;br /&gt;var&lt;br /&gt;  FromF,&lt;br /&gt;  ToF        : file of byte;&lt;br /&gt;  Buffer    : array[0..4096] of char;&lt;br /&gt;  NumRead    : integer;&lt;br /&gt;  FileLength : longint;&lt;br /&gt;begin&lt;br /&gt;  AssignFile(FromF,Source);&lt;br /&gt;  reset(FromF);&lt;br /&gt;  AssignFile(ToF,Destination);&lt;br /&gt;  rewrite(ToF);&lt;br /&gt;  FileLength:=FileSize(FromF);&lt;br /&gt;  with Form1.Progressbar1 do&lt;br /&gt;  begin&lt;br /&gt;    Min := 0;&lt;br /&gt;    Max := FileLength;&lt;br /&gt;    while FileLength &gt; 0 do&lt;br /&gt;    begin&lt;br /&gt;      BlockRead(FromF,Buffer[0],SizeOf(Buffer),NumRead);&lt;br /&gt;      FileLength := FileLength - NumRead;&lt;br /&gt;      BlockWrite(ToF,Buffer[0],NumRead);&lt;br /&gt;      Position := Position + NumRead;&lt;br /&gt;      Application.ProcessMessages;&lt;br /&gt;    end;&lt;br /&gt;    CloseFile(FromF);&lt;br /&gt;    CloseFile(ToF);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button16Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;CopyFileWithProgressBar('c:\zdroj.exe','c:\cíl.exe');&lt;br /&gt;end;&lt;br /&gt;Jak vidíte, princip je velmi jednoduchý a snadno pochopitelný. Samozřejmě je nutné, aby byla formuláři umístěna komponenta ProgressBar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-8539217633544311520?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8539217633544311520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8539217633544311520'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2011/02/zmizeni-kurzoru-mysi.html' title='Zmizení kurzoru myši'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-5404615011277594532</id><published>2010-10-26T04:25:00.000-07:00</published><updated>2010-10-26T04:26:18.279-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>Zobrazení vlastností komponent</title><content type='html'>Tento příklad zřejmě nevyužijete v reálných aplikacích či přesněji řečeno, nejedná o funkci, kterou by uživatelé vašich aplikací na první pohled mohli ocenit. Ukážeme si, jak jednoduchým způsobem zjišťovat za běhu aplikace vlastnosti všech komponent, které obsahuje. Může to být neocenitelná pomoc při ladění aplikace při fázi vývoje, při logování chyb v případě pádu aplikace a podobně.&lt;br /&gt;Umístěte si na formulář komponentu Memo, do které budeme v naší ukázce vlastnosti komponent vypisovat. Poté můžete na formulář umístit libovolné další komponenty, na kterých si ověříte funkčnost našeho příkladu.&lt;br /&gt;procedure ListComponentProperties(Component: TComponent; Strings: TStrings);&lt;br /&gt;var&lt;br /&gt;  Count, Size, I: Integer;&lt;br /&gt;  List: PPropList;&lt;br /&gt;  PropInfo: PPropInfo;&lt;br /&gt;  PropOrEvent, PropValue: string;&lt;br /&gt;begin&lt;br /&gt;  Count := GetPropList(Component.ClassInfo, tkAny, nil);&lt;br /&gt;  Size  := Count * SizeOf(Pointer);&lt;br /&gt;  GetMem(List, Size);&lt;br /&gt;  try&lt;br /&gt;    Count := GetPropList(Component.ClassInfo, tkAny, List);&lt;br /&gt;    for I := 0 to Count - 1 do&lt;br /&gt;    begin&lt;br /&gt;      PropInfo := List^[I];&lt;br /&gt;      if PropInfo^.PropType^.Kind in tkMethods then&lt;br /&gt;        PropOrEvent := 'Event'&lt;br /&gt;      else&lt;br /&gt;        PropOrEvent := 'Property';&lt;br /&gt;      PropValue := VarToStr(GetPropValue(Component, PropInfo^.Name));&lt;br /&gt;      Strings.Add(Format('[%s] %s: %s = %s', [PropOrEvent, PropInfo^.Name,&lt;br /&gt;        PropInfo^.PropType^.Name, PropValue]));&lt;br /&gt;    end;&lt;br /&gt;  finally&lt;br /&gt;    FreeMem(List);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  Memo1.Lines.BeginUpdate;&lt;br /&gt;  Memo1.Lines.Clear;&lt;br /&gt;  ListComponentProperties(Button1, Memo1.Lines);&lt;br /&gt;  Memo1.Lines.EndUpdate;&lt;br /&gt;end;&lt;br /&gt;Nejdůležitějším parametrem je pochopitelně komponenta, jejíž vlastnosti chceme zjistit (v naší ukázce je to Button1).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-5404615011277594532?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5404615011277594532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5404615011277594532'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/10/zobrazeni-vlastnosti-komponent.html' title='Zobrazení vlastností komponent'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-4198799486333183822</id><published>2010-06-07T02:33:00.000-07:00</published><updated>2010-06-07T02:34:08.680-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>tipy a triky</title><content type='html'>Ako zmeniť názov okna IE a OE ??&lt;br /&gt;Nájdite kľúč [HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main], &lt;br /&gt;vytvorte premennú WindowTitle typu STRING a ako hodnotu zadajte požadovaný názov okna. &lt;br /&gt;Pokiaľ ide o Outlook Express, vyhľadajte kľúč &lt;br /&gt;[HKEY_CURRENT_USER\Identities\{** Identity ID **}\Software\Microsoft\Outlook Express\5.0]. &lt;br /&gt;Obdobne vytvorte premennú s názvom Window Title typu STRING.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-4198799486333183822?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4198799486333183822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4198799486333183822'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/06/tipy-triky.html' title='tipy a triky'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-938363933777504542</id><published>2010-05-25T01:52:00.000-07:00</published><updated>2010-05-25T01:53:31.341-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>tipy a triky</title><content type='html'>Ako zmeniť štartovaciu stránku Outlook Expressu?&lt;br /&gt;Riešení sa ponúka niekoľko, najjednoduchším je urobenie malej zmeny v kľúči &lt;br /&gt;[HKEY_CURRENT_USER\Identities\[Identity]\Software\Microsoft\Outlook Express\5.0]. &lt;br /&gt;Vytvorte premennú typu STRING s názvom FrontPagePath. &lt;br /&gt;Hodnotou premennej bude požadovaná adresa (napr. www.zive.sk).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-938363933777504542?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/938363933777504542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/938363933777504542'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/05/tipy-triky_25.html' title='tipy a triky'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-6939192783362076155</id><published>2010-05-19T04:09:00.000-07:00</published><updated>2010-05-19T04:10:15.622-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>tipy a triky</title><content type='html'>Zmena umiestnenia adresára, kde sa budú ukladať všetky prijaté súbory v OExpress&lt;br /&gt;Vyhľadajte kľúč [HKEY_CURRENT_USER\Software\Microsoft\Outlook Express]. &lt;br /&gt;Zmeňte hodnotu premennej Store Root na požadovanú cestu. &lt;br /&gt;Uistite sa, že zadaná cesta naozaj existuje. &lt;br /&gt;Niektoré verzie programu Outlook Express totiž požadovaný adresár nevytvoria.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-6939192783362076155?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6939192783362076155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6939192783362076155'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/05/tipy-triky.html' title='tipy a triky'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-5443187441548290494</id><published>2010-05-11T04:21:00.000-07:00</published><updated>2010-05-11T04:22:30.427-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>rady v outlook express</title><content type='html'>Máte strach, že by nejaká nepovolaná osoba mohla zmeniť nastavenia vášho konta &lt;br /&gt;v programe Outlook Express? &lt;br /&gt;Jednoducho zakážte vykonávanie zmien zmenou v registroch. &lt;br /&gt;Vyhľadajte kľúč [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Outlook Express]. &lt;br /&gt;Stačí už len vytvoriť premennú typu DWORD s názvom &lt;br /&gt;No Modify Accts (vrátane medzier a dvoma c v slove Accts). &lt;br /&gt;Nastavte hodnotu na 1 alebo 0 podľa toho, či chcete zakázať, &lt;br /&gt;resp. povoliť užívateľom robiť zmeny v nastavení konta.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-5443187441548290494?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5443187441548290494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5443187441548290494'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/05/rady-v-outlook-express.html' title='rady v outlook express'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-7448209116606705379</id><published>2010-05-10T00:13:00.001-07:00</published><updated>2010-05-10T00:13:55.092-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>Splash screen</title><content type='html'>Ak vám vadí, že pri každom štarte Outlook Expresu musíte trpieť &lt;br /&gt;zobrazenie tzv. Splash Screen, nasledujúci trik vám ho pomôže ľahko odstrániť. &lt;br /&gt;Ak používate Outlook 4 a staršie verzie, zmenu treba vykonať v kľúči &lt;br /&gt;[HKEY_CURRENT_USER\Software\Microsoft\Outlook Express]. &lt;br /&gt;V novších verziách treba vyhľadať kľúč &lt;br /&gt;[HKEY_CURRENT_USER\Identities\{** Identity ID **}\Software\Microsoft\Outlook Express\5.0]. &lt;br /&gt;V oboch prípadoch je ďalší postup rovnaký. &lt;br /&gt;Vytvorte premennú s názvom NoSplash typu DWORD a nastavte jej hodnotu na 1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-7448209116606705379?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7448209116606705379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7448209116606705379'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/05/splash-screen.html' title='Splash screen'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-4663310253903524244</id><published>2010-05-07T06:21:00.000-07:00</published><updated>2010-05-07T06:22:26.941-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>outlook express</title><content type='html'>Odstránenie MSN Messengera z Outlook Express &lt;br /&gt;V kľúči [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Outlook Express] pridajte premennú typu DWORD s názvom Hide Messenger a nastavte jej hodnotu na 2&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-4663310253903524244?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4663310253903524244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4663310253903524244'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/05/outlook-express.html' title='outlook express'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-4906976141829296417</id><published>2010-05-06T00:11:00.000-07:00</published><updated>2010-05-06T00:12:44.541-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>Počítačová encyklopedie</title><content type='html'>ako vypnúť odkaz na inštaláciu Macromedia Flash a jemu podobných programov??&lt;br /&gt;Možností je opäť viacero, podľa mňa najrýchlejšou bude táto (pokiaľ používate Internet Explorer 6):&lt;br /&gt;&lt;br /&gt;V IE choďte do Tools – Internet Options – kliknite na záložku Security, &lt;br /&gt;nastavte Custom level a zakážte možnosť „Download signed ActiveX controls...“. &lt;br /&gt;Dajte však pozor, aby aj ostatné položky boli zakázané. &lt;br /&gt;Potom kliknite na záložku Advanced a zakážte položku „Install on demand“ a máte po probléme.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-4906976141829296417?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4906976141829296417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4906976141829296417'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/05/pocitacova-encyklopedie.html' title='Počítačová encyklopedie'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-9183780899619673157</id><published>2010-05-04T23:47:00.000-07:00</published><updated>2010-05-04T23:48:36.074-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>ako upravovať (pridávať, odoberať) tlačidlá na Paneli nástrojov.</title><content type='html'>Ak napríklad chcete odstrániť tlačidlo GO, vyhľadajte kľúč &lt;br /&gt;[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main] &lt;br /&gt;a vytvorte hodnotu typu STRING s názvom ShowGoButton. &lt;br /&gt;Nastavte jeho hodnotu na No a tlačidlo zmizne. &lt;br /&gt;Obdobne sa dá manipulovať aj s ostatnými tlačidlami. &lt;br /&gt;Stačí vytvoriť hodnotu s názvom Show(anglický ekvivalent názvu tlačidla, &lt;br /&gt;napr. Print, Home atď.)Button. &lt;br /&gt;Existuje však aj ďalší spôsob, ako dôjdete k tomu istému cieľu. &lt;br /&gt;Vyhľadajte kľúč &lt;br /&gt;[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]. &lt;br /&gt;Vytvorte hodnotu typu DWORD s názvom SpecifyDefaultButtons a nastavte ju na 1. &lt;br /&gt;Tým povolíte odstraňovanie a pridávanie jednotlivých tlačidiel na Paneli nástrojov. &lt;br /&gt;Podľa nasledujúceho zoznamu vytvorte premenné typu DWORD. &lt;br /&gt;Ich nastavenie na hodnotu 2 spôsobí ich odstránenie z panela. &lt;br /&gt;Ak chcete tlačidlo na panel pridať, nastavte hodnotu na 1. &lt;br /&gt;Rovnaký efekt dosiahnete aj vymazaním premennej z aktívneho kľúča.&lt;br /&gt;&lt;br /&gt;Zoznam premenných: &lt;br /&gt;    * Btn_Back&lt;br /&gt;    * Btn_Forward&lt;br /&gt;    * Btn_Stop&lt;br /&gt;    * Btn_Refresh&lt;br /&gt;    * Btn_Home&lt;br /&gt;    * Btn_Search&lt;br /&gt;    * Btn_Folders&lt;br /&gt;    * Btn_Favorites&lt;br /&gt;    * Btn_Media&lt;br /&gt;    * Btn_History&lt;br /&gt;    * Btn_Fullscreen&lt;br /&gt;    * Btn_Tools&lt;br /&gt;    * Btn_MailNews&lt;br /&gt;    * Btn_Size&lt;br /&gt;    * Btn_Print&lt;br /&gt;    * Btn_Edit&lt;br /&gt;    * Btn_Discussions&lt;br /&gt;    * Btn_Cut&lt;br /&gt;    * Btn_Copy&lt;br /&gt;    * Btn_Paste&lt;br /&gt;    * Btn_Encoding&lt;br /&gt;    * Btn_PrintPreview&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-9183780899619673157?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/9183780899619673157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/9183780899619673157'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/05/ako-upravovat-pridavat-odoberat.html' title='ako upravovať (pridávať, odoberať) tlačidlá na Paneli nástrojov.'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3000732359887060132</id><published>2010-05-02T09:30:00.000-07:00</published><updated>2010-05-02T09:32:03.071-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>Tipy a triky v Delphi</title><content type='html'>Ale pojďme k naší ukázce. Jelikož budeme používat registry, přidejte si do projektu knihovnu Registry. Dále si přidejte na formulář ListView a nastavte jeho styl na vsReport. Právě do tohoto ListView si do dvou sloupců vypíšeme názvy příslušných nainstalovaných aplikací a jejich odinstalační řetězec. Tvorba hlavičky ListView je vyřešena přímo v programu, takže po přidání komponenty na formulář a nastavení jejího zobrazovacího stylu (ačkoliv i to bychom mohli přidat přímo do programu) se již o víc nemusíte starat. Na závěr po načtení celého seznamu bude ještě pro přehlednost setříděn podle abecedy. &lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;const&lt;br /&gt;    UNINST_PATH = 'Software\Microsoft\Windows\CurrentVersion\Uninstall';&lt;br /&gt;var&lt;br /&gt;    Reg : TRegistry;&lt;br /&gt;    SubKey: TSTringList;&lt;br /&gt;    ListItem: TListItem;&lt;br /&gt;    I : Integer;&lt;br /&gt;    sDisplayName, sUninstallString : String;&lt;br /&gt;begin&lt;br /&gt;    with ListView1 do begin        &lt;br /&gt;        Columns.Add;&lt;br /&gt;        Columns.Add;&lt;br /&gt;        Columns[0].Caption := 'Jméno';&lt;br /&gt;        Columns[1].Caption := 'Odinstalační řetězec';&lt;br /&gt;        Columns[0].Width := 200;&lt;br /&gt;        Columns[1].Width := 300;&lt;br /&gt;    end;&lt;br /&gt;    Reg := TRegistry.Create;&lt;br /&gt;    try&lt;br /&gt;        With ListView1.Items do&lt;br /&gt;            try&lt;br /&gt;                BeginUpdate;&lt;br /&gt;                Clear;&lt;br /&gt;                Reg.RootKey := HKEY_LOCAL_MACHINE;&lt;br /&gt;                if Reg.OpenKeyReadOnly(UNINST_PATH) then begin&lt;br /&gt;                    SubKey := TStringList.Create;&lt;br /&gt;                    try&lt;br /&gt;                        Reg.GetKeyNames(SubKey);&lt;br /&gt;                        Reg.CloseKey;&lt;br /&gt;                        for i := 0 to subKey.Count - 1 do&lt;br /&gt;                        if Reg.OpenKeyReadOnly(Format('%s\%s', [UNINST_PATH, SubKey[i]]))&lt;br /&gt;                        then begin&lt;br /&gt;                            try&lt;br /&gt;                                sDisplayName := Reg.ReadString('DisplayName');&lt;br /&gt;                                sUninstallString := Reg.ReadString('UninstallString');&lt;br /&gt;                                if (sDisplayName) &lt;&gt; '' then begin&lt;br /&gt;                                    ListItem := Add;&lt;br /&gt;                                    ListItem.Caption := sDisplayName;&lt;br /&gt;                                    ListItem.SubItems.Add(sUninstallString);&lt;br /&gt;                                end;&lt;br /&gt;                            finally&lt;br /&gt;                                Reg.CloseKey;&lt;br /&gt;                            end;&lt;br /&gt;                        end;&lt;br /&gt;                    finally&lt;br /&gt;                        SubKey.Free;&lt;br /&gt;                    end;&lt;br /&gt;                end;&lt;br /&gt;            finally&lt;br /&gt;                ListView1.AlphaSort;&lt;br /&gt;                EndUpdate;&lt;br /&gt;            end;&lt;br /&gt;        finally&lt;br /&gt;            Reg.CloseKey;&lt;br /&gt;            reg.Free;&lt;br /&gt;        end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A máme tu další díl našeho seriálu. Dnes se bude opět jednat o sprchu drobných, ale doufám že užitečných tipů. Předvedeme si, jak umístit vlastní tlačítko do nástrojové lišty Internet Exploreru, jak zobrazit HTML kód v komponentě WebBrowser, mizet kurzor myši a další tipy. Vzhůru do čtení.&lt;br /&gt;Přidání vlastního tlačítka do panelu nástrojů v IE&lt;br /&gt;Možná znáte různé programy, které se snaží vylepšit a rozšířit funkce Internet Exploreru. Oblíbenou módou zejména různých vyhledávačů (a to i českých) je vnutit svým uživatelům drobné utility, které například rozšíří nástrojový panel IE o vyhledávací políčko daného vyhledávače nebo umožní například odeslat zprávu SMS. Ponechme teď stranou, jak užitečné či neužitečné podobné prográmky jsou a zkusme si něco obdobného. Ukážeme si, jak přidat do panelu nástrojů vlastní tlačítko, které spustí námi definovanou aplikaci. Zároveň se do menu Nástroje přidá další položka se stejnou funkcí.&lt;br /&gt;Celé je to vlastně velmi jednoduché a je to opět záležitost systémového registru, kam do příslušné větve IE vložíme náš záznam. Zdrojový kód tedy může vypadat například takto:&lt;br /&gt;procedure TlacitkoIE(Path: string);&lt;br /&gt;const&lt;br /&gt;  Tagit = '\{10954C80-4F0F-11d3-B17C-00C0DFE39736}\';&lt;br /&gt;var&lt;br /&gt;  Reg: TRegistry;&lt;br /&gt;  Vetev: string;&lt;br /&gt;begin&lt;br /&gt;  Reg := TRegistry.Create;&lt;br /&gt;  try&lt;br /&gt;    with Reg do&lt;br /&gt;    begin&lt;br /&gt;      RootKey := HKEY_LOCAL_MACHINE;&lt;br /&gt;      Vetev := 'Software\Microsoft\Internet Explorer\Extensions' + Tagit;&lt;br /&gt;      OpenKey(Vetev, True);&lt;br /&gt;      WriteString('ButtonText', 'Text tlačítka');&lt;br /&gt;      WriteString('MenuText', 'Název položky v menu');&lt;br /&gt;      WriteString('MenuStatusBar', 'Run Script');&lt;br /&gt;      WriteString('ClSid', '{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}');&lt;br /&gt;      WriteString('Default Visible', 'Yes');&lt;br /&gt;      WriteString('Exec', Path);&lt;br /&gt;      WriteString('HotIcon', ',4');&lt;br /&gt;      WriteString('Icon', ',4');&lt;br /&gt;    end&lt;br /&gt;  finally&lt;br /&gt;    Reg.CloseKey;&lt;br /&gt;    Reg.Free;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;TlacitkoIE('c:\windows\calc.exe');&lt;br /&gt;end;&lt;br /&gt;Náš příklad přidá do nástrojové lišty tlačítko s nadpisem Text tlačítka a přidá do menu položku Název položky v menu. Pokud se vám na lištu tlačítko nepřidá, budete ho muset přes menu Zobrazit -&gt; Panely nástrojů -&gt; Vlastní přidat ručně a najdete ho mezi dostupnými položkami.&lt;br /&gt;Aktivací tlačítka nebo položky z menu dojde ke spuštění Kalkulačky. Jak vidíte podle parametrů, lze též nastavit ikonku, která bude na tlačítku zobrazena a to jak ve své neaktivní podobě, tak po najetí myší. Místo mnou zvolené systémové ikony s číslem 4 můžete jako parametr pochopitelně uvést cestu k libovolné ikoně v souboru ICO nebo k nějaké jiné knihovně.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3000732359887060132?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3000732359887060132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3000732359887060132'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/05/tipy-triky-v-delphi.html' title='Tipy a triky v Delphi'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-825539179880528177</id><published>2010-04-30T03:04:00.000-07:00</published><updated>2010-04-30T03:05:32.172-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>Prohození tlačítek myši</title><content type='html'>Tento tip je opět jedním z těch, které asi v praxi příliš nevyužijeme, ale možná se může hodit, když budeme chtít například někoho trošku pozlobit. Ukážeme si, jak se snadno dají prohodit tlačítka na myši. Tedy pravé tlačítko se bude poté chovat jako levé a naopak. Poslouží nám k tomu následující jednoduchá funkce, jejímž parametrem je logická proměnná, určující, zda mají či nemají být klávesy prohozeny. &lt;br /&gt;procedure ProhoditTlacitka(prohodit: Boolean);&lt;br /&gt;begin&lt;br /&gt;if prohodit then SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 1, nil, 0)&lt;br /&gt;else SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 0, nil, 0);&lt;br /&gt;end; &lt;br /&gt;Převod barvy formátu TColor na HTML &lt;br /&gt;Následující jednoduchá funkce převede barvu ve formátu TColor, tedy formát běžně v Delphi používaný, na její hexa formu (či chcete-li "HTML barvu"). &lt;br /&gt;function ColorToHtml(Color: TColor): string;&lt;br /&gt;var&lt;br /&gt;col: LongInt;&lt;br /&gt;begin&lt;br /&gt;col := ColorToRGB(Color);&lt;br /&gt;Result := '#' + IntToHex(col and $FF, 2) + IntToHex(col shr 8 and $FF, 2) + IntToHex(col shr 16 and $FF, 2);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;ShowMessage(ColorToHtml(clLime));&lt;br /&gt;end; &lt;br /&gt;Seznam nainstalovaných aplikací &lt;br /&gt;Chcete-li vědět či přesněji řečeno programově zjistit, které programy máte v systému nainstalovány, není to žádný problém. Jako většina podobných informací o systému jsou i tyto informace uloženy v registrech, takže je stačí jen najít a přečíst si je. Jejich součástí je také tzv. odinstalační řetězec, což není nic jiného než cesta k příslušnému odinstalačnímu programu včetně případných parametrů. Pokud budete chtít, můžete si tímto způsobem vytvořit vlastní program podobný systémovému ovládacímu panelu "Přidat nebo odebrat programy" a odebrat tak libovolnou aplikaci, i když to není asi primární cíl našeho příkladu. Využít však seznamu nainstalovaných aplikací můžete ve vašem programu k různým účelům, protože některé aplikace třeba vyžadují ke své práci současně nainstalované i další programy, takže pokud je váš program podobného ražení, může si sám otestovat přítomnost všech potřebných součástí. Ovšem vše jen za předpokladu, že jsou aplikace korektně nainstalovány v systému a mají svůj záznam v registrech.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-825539179880528177?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/825539179880528177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/825539179880528177'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/04/prohozeni-tlacitek-mysi.html' title='Prohození tlačítek myši'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-109993110966177789</id><published>2010-04-29T06:05:00.000-07:00</published><updated>2010-04-29T06:11:23.272-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>Tipy a triky v Delphi</title><content type='html'>V naší ukázce si předvedeme změnu parametrů u Editu a u tlačítka. U komponenty Edit bude při aktivaci změněna barva, u tlačítka se změní font popisku na tučný. Provedeme to tak, že si vytvoříme vlastní obsluhy událostí OnEnter a OnExit, které nazveme prostě Enter a Exit. Poté na formulář umístěte libovolný počet editačních polí a nějaká tlačítka. U všech těchto prvků poté nastavte v Object Inspectoru obsluhu událostí OnEnter a OnExit právě na naše připravené procedury. U těch komponent, kde tyto události nenastavíte, se nestane pochopitelně nic, což ovšem rozhodně nemusí být na škodu a můžete si tak vybrat, které komponenty budou takto "postiženy". &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;type&lt;br /&gt;  TForm1 = class(TForm)&lt;br /&gt;    Edit1: TEdit;&lt;br /&gt;    Edit2: TEdit;&lt;br /&gt;    Button1: TButton;&lt;br /&gt;    Button2: TButton;&lt;br /&gt;    procedure Enter(Sender: TObject);&lt;br /&gt;    procedure Exit(Sender: TObject);&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;procedure TForm1.Enter(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;if (Sender is TCustomEdit) then TEdit(Sender).Color := clRed;&lt;br /&gt;if (Sender is TButton) then TButton(Sender).Font.Style := [fsBold];&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Exit(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;if (Sender is TCustomEdit) then TEdit(Sender).Color := clWindow;&lt;br /&gt;if (Sender is TButton) then TButton(Sender).Font.Style := [];&lt;br /&gt;end;&lt;br /&gt;Jak vidíte, každá obsluha obsahuje podmínku, podle které se určuje, jaké parametry budou změněny na základě typu daného vizuálního objektu (tedy u typu TButton font, u TEdit zase barva). Změnit se dají vlastně libovolné parametry, ale nás budou zřejmě zajímat pouze ty vizuální. V události OnEnter jednotlivých komponent tedy naše procedura Enter změní barevnost či další parametry a poté, když uživatel přejde na jinou komponentu (zaktivuje ji), původní hodnoty budou opět obnoveny procedurou Exit v události OnExit. Tím docílíme jednoduchého efektu, kdy právě aktivní prvek na formuláři bude vždy zvýrazněn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-109993110966177789?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/109993110966177789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/109993110966177789'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/04/tipy-triky-v-delphi_29.html' title='Tipy a triky v Delphi'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-8454922942213007270</id><published>2010-04-27T07:49:00.000-07:00</published><updated>2010-04-27T07:51:19.295-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>Tipy a triky v Delphi</title><content type='html'>Popis jednotlivých částí najdete v podobě komentářů ve zdrojovém kódu. Samotný princip je snad dostatečně jasný, jsou to vlastně jen jednoduché čáry s textovým popisem, umístěné na příslušných místech, které se vypočítají z rozměrů formuláře (grafu). &lt;br /&gt;Ještě jedno malé upozornění. Jelikož je pro vykreslení grafu, tedy propojení vypočítaných bodů křivkou, použita procedura Polyline, která všechny jednotlivé po sobě jdoucí body spojí bez ohledu na matematiku, je tento konkrétní postup použitelný na spojité funkce. Ostatní funkce by bylo vhodné vykreslovat buď bod po bodu (tedy bez jejich vzájemného propojení, a proto je třeba kvůli dobré vizuální podobě grafu použít větší přesnost – vypočítat více bodů) a nebo jiným způsobem.&lt;br /&gt;&lt;br /&gt;Po čase tu máme opět několik tipů z různých oblastí. Předvedeme si, jak vizuálně zvýraznit právě aktivní prvek na formuláři a zpřehlednit tak uživateli práci. Dále si ukážeme, jak prohodit tlačítka na myši, převod barev formátu TColor do hexa podoby a také si ukážeme, jak zjistit z registrů seznam nainstalovaných aplikací.&lt;br /&gt;Vizuální zvýraznění aktivní komponenty Edit &lt;br /&gt;Komponenta Edit, tedy editační pole pro vyplňování dat rozličného druhu, je jistě jedním z nejběžnějších prvků uživatelského prostředí. Ukážeme si jedno drobné vylepšení, kterým se může práce s těmito editačními poli zvláště v případě rozsáhlejších formulářů pro uživatele velmi zpřehlednit. Toho docílíme tak, že editační pole, které bude zrovna aktivní (tedy uživatel do něj bude právě něco vyplňovat nebo bude prostě označeno – bude mít tzv. Focus), určitým způsobem zvýrazníme. Zvýraznit jej můžeme třeba tím, že se změní jeho barva a font písma nebo některé jiné vizuální vlastnosti, které daná komponenta má. Postup lze totiž aplikovat i na komponenty typu Edit, které nejsou standardně dodávané s Delphi, máte-li některé takové nainstalovány a používáte-li je raději. Ale obecně se dá říci, že je postup použitelný na všechny vizuální komponenty, které mají události OnExit a OnEnter (viz. dále), tedy například tlačítka a různé další prvky. Ne každý takový prvek má však například vlastnost Color, takže je potřeba individuálně podle potřeb náš příklad upravit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-8454922942213007270?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8454922942213007270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8454922942213007270'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/04/tipy-triky-v-delphi.html' title='Tipy a triky v Delphi'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-8916444342600810435</id><published>2010-04-19T02:49:00.000-07:00</published><updated>2010-04-19T02:53:44.448-07:00</updated><title type='text'>Kreslení grafu funkce</title><content type='html'>Tento příklad sice patří mezi klasické, skoro až školní příklady z učebnice programování, ale přesto si jej ukážeme. Pokročilejším čtenářům se tedy omlouvám, ale vydržte to. &lt;br /&gt;V naší ukázce budeme pro názornost kreslit graf funkce sinus. Co také jiného. Kdo ví proč se obvykle v příkladech používá tato funkce, takže nebudeme bourat tradice. &lt;br /&gt;Vytvořte si tedy nový projekt a na formulář umístěte komponentu PaintBox, ve které bude graf kreslen. Vlastnost Align nastavte tak, aby komponenta vyplňovala celý formulář (tedy na hodnotu alClient). Využijeme toho k tomu, aby se nám graf automaticky přizpůsoboval velikosti okna. &lt;br /&gt;Nejprve tedy zdrojový kód (jeho popis bude následovat): &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;const pInterval=1000;&lt;br /&gt;&lt;br /&gt;private&lt;br /&gt;    { Private declarations }&lt;br /&gt;    FPoints: array [0..pInterval] of TPoint;&lt;br /&gt;&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;procedure VypocitatGraf;&lt;br /&gt;var&lt;br /&gt;  RozsahX, RozsahY: Integer;&lt;br /&gt;  pocatek: TPoint;&lt;br /&gt;  radian, interval: Double;&lt;br /&gt;  i: Integer;&lt;br /&gt;begin&lt;br /&gt;RozsahX := (Form1.paintbox1.Width - 2) div 4;&lt;br /&gt;RozsahY := (Form1.paintbox1.Height - 2) div 2;&lt;br /&gt;pocatek := Point(Form1.paintbox1.Width div 2, Form1.paintbox1.Height div 2);&lt;br /&gt;radian := -2.0 * Pi;&lt;br /&gt;interval := 4.0 * Pi / pInterval;&lt;br /&gt;for i := 0 to High(Form1.FPoints) do&lt;br /&gt;begin&lt;br /&gt;  Form1.FPoints[i].X := pocatek.x + Round(radian * RozsahX / Pi);&lt;br /&gt;  Form1.FPoints[i].Y := pocatek.y - Round(sin(radian) * RozsahY);&lt;br /&gt;  radian := radian + interval;&lt;br /&gt;end;&lt;br /&gt;end; &lt;br /&gt;Konstanta pInterval udává "rozlišení" grafu (počet jeho bodů) na intervalu od -2Pi do 2Pi, na kterém budeme funkci vykreslovat. Čím vyšší číslo, tím více body bude graf tvořen a tím lépe bude vypadat. Tyto body budou poté propojeny výslednou křivkou (viz dále). Počátek souřadnicové soustavy grafu je umístěn na střed PaintBoxu, rozsah X-ových souřadnic je dán Pi, Y-ové souřadnice ohraničuje samozřejmě jednička. Y-ové souřadnice jsou zároveň "převráceny", jak už to u počítačů bývá. Tedy nerostou z levého dolního rohu směrem nahoru, ale z levého horního rohu směrem dolů. Že se počítá v radiánech a ne ve stupních, snad netřeba zdůrazňovat. &lt;br /&gt;Takže máme tedy vypočítané body, nyní nám zbývá nakreslit samotný graf. Kreslení bude provedeno jako událost OnPaint komponenty PaintBox: &lt;br /&gt;procedure TForm1.PaintBox1Paint(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  with PaintBox1.Canvas do&lt;br /&gt;  begin&lt;br /&gt;  Pen.Color := clBlue; &lt;br /&gt;  Polyline(FPoints); &lt;br /&gt;  end;&lt;br /&gt;end; &lt;br /&gt;Dále je třeba zajistit překreslování v daném měřítku při změně velikosti formuláře. Proto musíme ještě doplnit události OnCreate a OnResize formuláře: &lt;br /&gt;procedure TForm1.FormResize(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;VypocitatGraf;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;VypocitatGraf;&lt;br /&gt;end; &lt;br /&gt;A tím je vlastně základ hotov. Funkce je již vykreslena. Příklad by však nebyl úplný bez nakreslení a popsání souřadnicových os. Přidáme si proto opět do události OnPaint několik dalších řádků; celá procedura tedy bude vypadat takto: &lt;br /&gt;procedure TForm1.PaintBox1Paint(Sender: TObject); &lt;br /&gt;var &lt;br /&gt;  pocatek: TPoint; &lt;br /&gt;  RozsahX, RozsahY: Integer; &lt;br /&gt;begin &lt;br /&gt;  with PaintBox1.Canvas do  &lt;br /&gt;  begin &lt;br /&gt;    {bílé pozadí grafu} &lt;br /&gt;    Brush.Color := clWhite; &lt;br /&gt;    Brush.Style := bsSolid; &lt;br /&gt;    Fillrect(paintbox1.BoundsRect); &lt;br /&gt;&lt;br /&gt;    {souřadnicový kříž} &lt;br /&gt;    pocatek    := Point(paintbox1.Width div 2, paintbox1.Height div 2); &lt;br /&gt;    Pen.Color := clBlack; &lt;br /&gt;    Pen.Style := psSolid; &lt;br /&gt;    Pen.Width := 1; &lt;br /&gt;    MoveTo(1, pocatek.Y); &lt;br /&gt;    LineTo(paintbox1.Width - 1, pocatek.y); &lt;br /&gt;    MoveTo(pocatek.x, 1); &lt;br /&gt;    LineTo(pocatek.x, paintbox1.Height - 1); &lt;br /&gt;&lt;br /&gt;    Font.Name    := 'Symbol'; &lt;br /&gt;    Font.Size    := 8; &lt;br /&gt;    Font.Color  := clBlack; &lt;br /&gt;    RozsahX := (paintbox1.Width - 2) div 4;&lt;br /&gt;    RozsahY := (paintbox1.Height - 2) div 2;&lt;br /&gt;&lt;br /&gt;    {ukazatele a popis osy X} &lt;br /&gt;    MoveTo(pocatek.x - 2 * RozsahX, pocatek.y - 4); &lt;br /&gt;    LineTo(pocatek.x - 2 * RozsahX, pocatek.y + 4); &lt;br /&gt;    TextOut(pocatek.x - 2 * RozsahX + 2, pocatek.y + 2, '-2p'); &lt;br /&gt;    MoveTo(pocatek.x - RozsahX, pocatek.y - 4); &lt;br /&gt;    LineTo(pocatek.x - RozsahX, pocatek.y + 4); &lt;br /&gt;    TextOut(pocatek.x - RozsahX + 2, pocatek.y + 2, '-p'); &lt;br /&gt;    MoveTo(pocatek.x + RozsahX, pocatek.y - 4); &lt;br /&gt;    LineTo(pocatek.x + RozsahX, pocatek.y + 4); &lt;br /&gt;    TextOut(pocatek.x + RozsahX - 2 - TextWidth('p'), pocatek.y + 2, 'p'); &lt;br /&gt;    MoveTo(pocatek.x + 2 * RozsahX, pocatek.y - 4); &lt;br /&gt;    LineTo(pocatek.x + 2 * RozsahX, pocatek.y + 4); &lt;br /&gt;    TextOut(pocatek.x + 2 * RozsahX - 2 - TextWidth('2p'), pocatek.y + 2, '2p');&lt;br /&gt;&lt;br /&gt;    {ukazatele a popis osy Y} &lt;br /&gt;    MoveTo(pocatek.x - 4, pocatek.y - RozsahY); &lt;br /&gt;    LineTo(pocatek.x + 4, pocatek.y - RozsahY); &lt;br /&gt;    TextOut(pocatek.x + 4, pocatek.y - RozsahY, '1.0'); &lt;br /&gt;    MoveTo(pocatek.x - 4, pocatek.y - RozsahY div 2); &lt;br /&gt;    LineTo(pocatek.x + 4, pocatek.y - RozsahY div 2); &lt;br /&gt;    TextOut(pocatek.x + 4, pocatek.y - (RozsahY + TextHeight('1')) div 2, '0.5'); &lt;br /&gt;    MoveTo(pocatek.x - 2, pocatek.y + RozsahY div 2); &lt;br /&gt;    LineTo(pocatek.x + 2, pocatek.y + RozsahY div 2); &lt;br /&gt;    TextOut(pocatek.x + 3, pocatek.y + (RozsahY - TextHeight('1')) div 2, '-0.5'); &lt;br /&gt;    MoveTo(pocatek.x - 2, pocatek.y + RozsahY); &lt;br /&gt;    LineTo(pocatek.x + 2, pocatek.y + RozsahY); &lt;br /&gt;    TextOut(pocatek.x + 3, pocatek.y + RozsahY - TextHeight('1'), '-1.0');&lt;br /&gt;&lt;br /&gt;    {nakreslení samotné funkce}&lt;br /&gt;    Pen.Color := clBlue; &lt;br /&gt;    Polyline(FPoints); &lt;br /&gt;  end; &lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-8916444342600810435?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8916444342600810435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8916444342600810435'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/04/kresleni-grafu-funkce.html' title='Kreslení grafu funkce'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3198112610166398495</id><published>2010-03-16T05:02:00.000-07:00</published><updated>2010-03-16T05:04:11.824-07:00</updated><title type='text'>Tipy a triky v Delphi</title><content type='html'>Dnes si ještě naposledy řekneme pár tipů k tématu grafiky a od příštího dílu se zase vrhneme na jiné oblasti. Tématem dnešního dílu je převod obrázku na ikonu a kreslení grafu funkce.&lt;br /&gt;Převod obrázku BMP na ikonu &lt;br /&gt;Nedílnou součástí každé aplikace je i její ikona. Jistě se nespokojíte s implicitní ikonou, kterou vaší aplikaci přiřadí Delphi, a budete si chtít vytvořit vlastní. K tomu můžete použít nějaký k tomu určený editor ikon. Pokud jej náhodou nemáte po ruce a nebo nejste natolik výtvarně schopní a raději použijete již hotový obrázek, možná se vám bude hodit následující funkce, která převede obrázek BMP na formát ikony. Ačkoliv se to může zdát jako velmi jednoduchá funkce, dokonce ani velmi oblíbený prohlížeč obrázků ACDsee ji – pokud vím – neobsahuje, a pokud jste již někdy potřebovali rychle vytvořit ikonu bez patřičného editoru, jistě mi dáte za pravdu, že to může být na první pohled celkem problém. Ten se také snaží částečně řešit naše funkce. &lt;br /&gt;Samozřejmě jsou zde jistá omezení, a to především v rozlišení zdrojového obrázku. Ten si musíte předem pomocí grafického editoru upravit na rozlišení ikony (tj. 32x32, 64x64 bodů atd..). Poté na něj již jen aplikujete následující funkci a získáte soubor ICO. &lt;br /&gt;procedure bmp2ico(Image: TImage; FileName: TFilename); &lt;br /&gt;var &lt;br /&gt;  Bmp: TBitmap; &lt;br /&gt;  Icon: TIcon; &lt;br /&gt;  ImageList: TImageList; &lt;br /&gt;begin &lt;br /&gt;  Bmp := TBitmap.Create; &lt;br /&gt;  Icon := TIcon.Create; &lt;br /&gt;  try &lt;br /&gt;    Bmp.Assign(Image.Picture); &lt;br /&gt;    ImageList := TImageList.CreateSize(Bmp.Width, Bmp.Height); &lt;br /&gt;    try &lt;br /&gt;      ImageList.AddMasked(Bmp, Bmp.TransparentColor); &lt;br /&gt;      ImageList.GetIcon(0, Icon); &lt;br /&gt;      Icon.SaveToFile(FileName); &lt;br /&gt;    finally &lt;br /&gt;      ImageList.Free; &lt;br /&gt;    end; &lt;br /&gt;  finally &lt;br /&gt;    Bmp.Free; &lt;br /&gt;    Icon.Free; &lt;br /&gt;  end; &lt;br /&gt;end; &lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject); &lt;br /&gt;begin&lt;br /&gt;  bmp2ico(Image1, 'c:\ikonka.ico');&lt;br /&gt;end; &lt;br /&gt;Všimněte si uvnitř procedury parametru TransparentColor. Ten, jak název napovídá, slouží k určení transparentní barvy ikonky, tedy barvy "pozadí", které nebude vidět. Zde je nastaven podle vstupního souboru, ale klidně můžete celou proceduru obohatit o tento parametr navíc a určovat tuto barvu přímo. Parametr je pochopitelně typu TColor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3198112610166398495?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3198112610166398495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3198112610166398495'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/03/tipy-triky-v-delphi.html' title='Tipy a triky v Delphi'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-1027211148928045847</id><published>2010-02-02T07:18:00.000-08:00</published><updated>2010-02-02T07:20:12.600-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>Transparentní text v obrázku</title><content type='html'>Velmi užitečnou funkcí též může být umístění transparentního textu, tedy textu s průhledným pozadím, přímo do obrázku. Jaký může být způsob využití takové funkce? Namátkou mě napadá třeba situace, kdy potřebujete hromadně u desítek obrázků přidat do jejich rohu váš copyright nebo časový údaj pro budoucí prezentaci. V tom případě vám může tato funkce ušetřit řadu času. &lt;br /&gt;Příklad opět předpokládá, že v komponentě Image máte již načtenu bitmapu, a samotné přidání textu bude opět voláno jako událost stisku tlačítka: &lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  with Image1.Picture.Bitmap.Canvas do&lt;br /&gt;  begin&lt;br /&gt;    Font.Color  := clRed;&lt;br /&gt;    Brush.Style := bsclear;&lt;br /&gt;    Font.Size  := 13;&lt;br /&gt;    TextOut(10, 10, 'Dnes je 3.4. 2002');&lt;br /&gt;  end;&lt;br /&gt;end; &lt;br /&gt;Jak vidíte, lze bez problému měnit všechny základní parametry textu. Pokud by vám snad nevyhovovalo, že je text transparentní, stačí příslušným způsobem změnit Brush.Style například na bsSolid a v tom případě bude pod textem pozadí. &lt;br /&gt;A to je pro dnešek všechno. Příště si ještě ukážeme několik drobných funkcí s obrázky a začneme se opět věnovat jiným tématům.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-1027211148928045847?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1027211148928045847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1027211148928045847'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/02/transparentni-text-v-obrazku.html' title='Transparentní text v obrázku'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-563085880263159639</id><published>2010-01-28T00:45:00.000-08:00</published><updated>2010-01-28T00:51:08.734-08:00</updated><title type='text'></title><content type='html'>Dnes si ještě naposledy řekneme pár tipů k tématu grafiky a od příštího dílu se zase vrhneme na jiné oblasti. Tématem dnešního dílu je převod obrázku na ikonu a kreslení grafu funkce.&lt;br /&gt;Převod obrázku BMP na ikonu &lt;br /&gt;Nedílnou součástí každé aplikace je i její ikona. Jistě se nespokojíte s implicitní ikonou, kterou vaší aplikaci přiřadí Delphi, a budete si chtít vytvořit vlastní. K tomu můžete použít nějaký k tomu určený editor ikon. Pokud jej náhodou nemáte po ruce a nebo nejste natolik výtvarně schopní a raději použijete již hotový obrázek, možná se vám bude hodit následující funkce, která převede obrázek BMP na formát ikony. Ačkoliv se to může zdát jako velmi jednoduchá funkce, dokonce ani velmi oblíbený prohlížeč obrázků ACDsee ji – pokud vím – neobsahuje, a pokud jste již někdy potřebovali rychle vytvořit ikonu bez patřičného editoru, jistě mi dáte za pravdu, že to může být na první pohled celkem problém. Ten se také snaží částečně řešit naše funkce. &lt;br /&gt;Samozřejmě jsou zde jistá omezení, a to především v rozlišení zdrojového obrázku. Ten si musíte předem pomocí grafického editoru upravit na rozlišení ikony (tj. 32x32, 64x64 bodů atd..). Poté na něj již jen aplikujete následující funkci a získáte soubor ICO. &lt;br /&gt;procedure bmp2ico(Image: TImage; FileName: TFilename); &lt;br /&gt;var &lt;br /&gt;  Bmp: TBitmap; &lt;br /&gt;  Icon: TIcon; &lt;br /&gt;  ImageList: TImageList; &lt;br /&gt;begin &lt;br /&gt;  Bmp := TBitmap.Create; &lt;br /&gt;  Icon := TIcon.Create; &lt;br /&gt;  try&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-563085880263159639?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/563085880263159639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/563085880263159639'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/01/dnes-si-jeste-naposledy-rekneme-par.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-4531097370957415577</id><published>2010-01-24T06:25:00.000-08:00</published><updated>2010-01-24T06:31:24.659-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Počítače'/><title type='text'>Transparentní text v obrázku</title><content type='html'>Transparentní text v obrázku &lt;br /&gt;Velmi užitečnou funkcí též může být umístění transparentního textu, tedy textu s průhledným pozadím, přímo do obrázku. Jaký může být způsob využití takové funkce? Namátkou mě napadá třeba situace, kdy potřebujete hromadně u desítek obrázků přidat do jejich rohu váš copyright nebo časový údaj pro budoucí prezentaci. V tom případě vám může tato funkce ušetřit řadu času. &lt;br /&gt;Příklad opět předpokládá, že v komponentě Image máte již načtenu bitmapu, a samotné přidání textu bude opět voláno jako událost stisku tlačítka: &lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  with Image1.Picture.Bitmap.Canvas do&lt;br /&gt;  begin&lt;br /&gt;    Font.Color  := clRed;&lt;br /&gt;    Brush.Style := bsclear;&lt;br /&gt;    Font.Size  := 13;&lt;br /&gt;    TextOut(10, 10, 'Dnes je 3.4. 2002');&lt;br /&gt;  end;&lt;br /&gt;end; &lt;br /&gt;Jak vidíte, lze bez problému měnit všechny základní parametry textu. Pokud by vám snad nevyhovovalo, že je text transparentní, stačí příslušným způsobem změnit Brush.Style například na bsSolid a v tom případě bude pod textem pozadí. &lt;br /&gt;A to je pro dnešek všechno. Příště si ještě ukážeme několik drobných funkcí s obrázky a začneme se opět věnovat jiným tématům.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-4531097370957415577?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4531097370957415577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4531097370957415577'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/01/transparentni-text-v-obrazku.html' title='Transparentní text v obrázku'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-6584388148798895033</id><published>2010-01-03T14:51:00.000-08:00</published><updated>2010-01-03T14:52:42.602-08:00</updated><title type='text'>Převod barev do odstínů šedi</title><content type='html'>Převod barev obrázku do odstínů šedi je další z obvyklých funkcí a řekl bych, že docela potřebnou, protože řada fotografií získá převodem na "černobílou" zcela jiný umělecký rozměr. Ale to teď nechme stranou, ukažme si rovnou samotnou funkci na převod. Podobně jako u předchozích funkcí lze i tuto provést řadou způsobů, z nichž jeden vám předkládám: &lt;br /&gt;procedure Grayscale(const Bmp: TBitmap);&lt;br /&gt;type&lt;br /&gt;  TRGBArray = array[0..32767] of TRGBTriple;&lt;br /&gt;  pRGBArray = ^TRGBArray;&lt;br /&gt;var&lt;br /&gt;  x, y, Gray: Integer;&lt;br /&gt;  Row: pRGBArray;&lt;br /&gt;begin&lt;br /&gt;  Bmp.PixelFormat := pf24Bit;&lt;br /&gt;  for y := 0 to Bmp.Height - 1 do&lt;br /&gt;  begin&lt;br /&gt;    Row := Bmp.ScanLine[y];&lt;br /&gt;    for x := 0 to Bmp.Width - 1 do&lt;br /&gt;    begin&lt;br /&gt;      Gray := (Row[x].rgbtRed + Row[x].rgbtGreen + Row[x].rgbtBlue) div 3;&lt;br /&gt;      Row[x].rgbtRed := Gray;&lt;br /&gt;      Row[x].rgbtGreen := Gray;&lt;br /&gt;      Row[x].rgbtBlue := Gray;&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;if Image1.Picture &lt;&gt; nil then Grayscale(Image1.Picture.Bitmap);&lt;br /&gt;Form1.Image1.Repaint;&lt;br /&gt;end; &lt;br /&gt;Opět, stejně jako u všech předchozích příkladů, je třeba mít na formuláři komponentu Image, do které například pomocí OpenPictureDialogu nejprve načteme bitmapu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-6584388148798895033?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6584388148798895033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6584388148798895033'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2010/01/prevod-barev-do-odstinu-sedi.html' title='Převod barev do odstínů šedi'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3247601706032271407</id><published>2009-06-04T05:48:00.000-07:00</published><updated>2009-06-04T05:49:40.721-07:00</updated><title type='text'>Tipy a triky v Delphi</title><content type='html'>Tipy a triky v Delphi&lt;br /&gt;Do třetice zde máme tip pro Windows XP a opět se bude týkat bublinkové nápovědy - hintů. Tentokrát ale té běžné, která se zobrazuje u všech prvků uživatelského prostředí.&lt;br /&gt;Windows XP nám kromě nových funkcí přinášejí řadu novinek uživatelského prostředí. Kromě "skinů", vyhlazování fontů a různých dalších efektů, týkajících se všech možných prvků prostředí, jsme si minule ukazovali i nové balónové hinty. Jestli jsou všechny tyto efekty přínosem, to je věc názoru. První věcí, kterou velká část uživatelů udělá, je to, že tyto efekty prostě vypne. Toto je ovšem téma na úplně jiný článek, i když budu rád, pokud svůj názor vyjádříte v diskusi pod článkem. Vraťme se však k Delphi. I dnes si budeme povídat o hintech, tedy o bublinkové nápovědě, ale tentokrát té klasické, kterou obsahují (či mohou obsahovat) již od pradávna všechny (tedy téměř) prvky uživatelského prostředí systému. &lt;br /&gt;I u tohoto poměrně jednoduchého prvku nám Windows XP přinášejí rovněž vylepšení vzhledu. Pokud ji do svých programů zapracujete a necháte aktivované příslušné volby vzhledu v samotném systému, budou pak vypadat hinty o malý chloupek lépe než dosud. Změna spočívá v přidání poměrně efektního, i když možná na první pohled snadno přehlédnutelného, stínu k samotnému popisku. Tím vypadá nápověda ještě o něco lépe a vyvolává mnohem plastičtější dojem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3247601706032271407?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3247601706032271407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3247601706032271407'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2009/06/tipy-triky-v-delphi.html' title='Tipy a triky v Delphi'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-1773598277424416300</id><published>2008-11-26T07:22:00.000-08:00</published><updated>2008-11-26T07:23:11.583-08:00</updated><title type='text'></title><content type='html'>Zajímavá je taktéž procedura SysTrayIconMsgHandler, která má na starosti zpracování zpráv o stavu nápovědy. V naší ukázce nejsou jednotlivým stavům přiřazeny žádné akce, takže si příslušné funkce doplňte dle vaší potřeby sami. Jak vidíte ze zdrojového kódu, jsou zde reakce na stisknutí tlačítka myši, skrytí či zobrazení nápovědy, uplynutí timeoutu a podobně. &lt;br /&gt;A na závěr snad už jen poznámka k drobným rozdílům mezi systémy. Zatímco pod Windows XP bude zobrazena nápověda v "plné síle" včetně uzavíracího tlačítka a s efektem postupného zobrazování a pohasínání, pod Windows 2000 bude toto tlačítko i efekt chybět. Nemám představu, jak bude situace vypadat pod Windows ME, ale předpokládám že stejně jako pod Windows 2000. A konečně pod Windows 98 (či staršími systémy) se nezobrazí nic, pouze ikona v hlavním panelu a varovné upozornění, které je tam pochopitelně pouze pro naše testovací účely a v opravdových aplikacích není samozřejmě nutné tímto dialogem uživatele obtěžovat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-1773598277424416300?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1773598277424416300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1773598277424416300'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/11/zajmav-je-takt-procedura.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-7416311036676610812</id><published>2008-10-09T00:33:00.000-07:00</published><updated>2008-10-09T00:36:51.241-07:00</updated><title type='text'></title><content type='html'>type&lt;br /&gt;  PNewNotifyIconData = ^TNewNotifyIconData;&lt;br /&gt;  TDUMMYUNIONNAME = record&lt;br /&gt;    case Integer of&lt;br /&gt;      0: (uTimeout: UINT);&lt;br /&gt;      1: (uVersion: UINT);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  TNewNotifyIconData = record&lt;br /&gt;    cbSize: DWORD;&lt;br /&gt;    Wnd: HWND;&lt;br /&gt;    uID: UINT;&lt;br /&gt;    uFlags: UINT;&lt;br /&gt;    uCallbackMessage: UINT;&lt;br /&gt;    hIcon: HICON;&lt;br /&gt;    szTip: array [0..127] of Char;&lt;br /&gt;    dwState: DWORD;&lt;br /&gt;    dwStateMask: DWORD;&lt;br /&gt;    szInfo: array [0..255] of Char;&lt;br /&gt;    DUMMYUNIONNAME: TDUMMYUNIONNAME;&lt;br /&gt;    szInfoTitle: array [0..63] of Char;&lt;br /&gt;    dwInfoFlags: DWORD;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TForm1 = class(TForm)&lt;br /&gt;    procedure FormCreate(Sender: TObject);&lt;br /&gt;    procedure FormDestroy(Sender: TObject);&lt;br /&gt;  private&lt;br /&gt;    IconData: TNewNotifyIconData;&lt;br /&gt;    procedure SysTrayIconMsgHandler(var Msg: TMessage); message TRAY_CALLBACK;&lt;br /&gt;    procedure AddSysTrayIcon;&lt;br /&gt;    procedure ShowBalloonTips;&lt;br /&gt;    procedure DeleteSysTrayIcon;&lt;br /&gt;  public&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  Form1: TForm1;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{$R *.DFM}&lt;br /&gt;&lt;br /&gt;procedure TForm1.SysTrayIconMsgHandler(var Msg: TMessage);&lt;br /&gt;begin&lt;br /&gt;  case Msg.lParam of&lt;br /&gt;    WM_MOUSEMOVE:;&lt;br /&gt;    WM_LBUTTONDOWN:;&lt;br /&gt;    WM_LBUTTONUP:;&lt;br /&gt;    WM_LBUTTONDBLCLK:;&lt;br /&gt;    WM_RBUTTONDOWN:;&lt;br /&gt;    WM_RBUTTONUP:;&lt;br /&gt;    WM_RBUTTONDBLCLK:;&lt;br /&gt;    NIN_BALLOONSHOW:;&lt;br /&gt;    NIN_BALLOONHIDE:;&lt;br /&gt;    NIN_BALLOONTIMEOUT:;&lt;br /&gt;    NIN_BALLOONUSERCLICK:;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.AddSysTrayIcon;&lt;br /&gt;begin&lt;br /&gt;  IconData.cbSize := SizeOf(IconData);&lt;br /&gt;  IconData.Wnd := AllocateHWnd(SysTrayIconMsgHandler);&lt;br /&gt;  IconData.uID := 0;&lt;br /&gt;  IconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;&lt;br /&gt;  IconData.uCallbackMessage := TRAY_CALLBACK;&lt;br /&gt;  IconData.hIcon := Application.Icon.Handle;&lt;br /&gt;  IconData.szTip := 'Toto je testovací nápověda.';&lt;br /&gt;  if not Shell_NotifyIcon(NIM_ADD, @IconData) then ShowMessage('Chyba, nepodařilo se vložit ikonu do hlavního panelu !');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.ShowBalloonTips;&lt;br /&gt;var&lt;br /&gt;  TipInfo, TipTitle: string;&lt;br /&gt;begin&lt;br /&gt;  IconData.cbSize := SizeOf(IconData);&lt;br /&gt;  IconData.uFlags := NIF_INFO;&lt;br /&gt;  TipInfo := 'Toto je testovací nápověda.';&lt;br /&gt;  strPLCopy(IconData.szInfo, TipInfo, SizeOf(IconData.szInfo) - 1);&lt;br /&gt;  IconData.DUMMYUNIONNAME.uTimeout := 3000;&lt;br /&gt;  TipTitle := 'Upozornění';&lt;br /&gt;  strPLCopy(IconData.szInfoTitle, TipTitle, SizeOf(IconData.szInfoTitle) - 1);&lt;br /&gt;  IconData.dwInfoFlags := NIIF_INFO;&lt;br /&gt;  Shell_NotifyIcon(NIM_MODIFY, @IconData);&lt;br /&gt;  IconData.DUMMYUNIONNAME.uVersion := NOTIFYICON_VERSION;&lt;br /&gt;  if not Shell_NotifyIcon(NIM_SETVERSION, @IconData) then ShowMessage('Chyba ve verzi.');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.DeleteSysTrayIcon;&lt;br /&gt;begin&lt;br /&gt;  DeallocateHWnd(IconData.Wnd);&lt;br /&gt;  if not Shell_NotifyIcon(NIM_DELETE, @IconData) then ShowMessage('Chyba, nepodařilo se odstranit ikonu z hlavního panelu.');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  AddSysTrayIcon;&lt;br /&gt;  ShowBalloonTips;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  DeleteSysTrayIcon;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end. &lt;br /&gt;Při úpravě kódu je pro vás důležitá hlavně procedura ShowBalloonTips, kde najdete jednak texty, které se budou v nápovědě zobrazovat (tedy nadpis a vlastní zpráva) a dále také typ ikony. Ta je v ukázce nastavena na NIIF_INFO, tedy informační ikona. Další možnosti můžete najít v konstantách, jsou to NIIF_WARNING a NIIF_ERROR a jistě sami dobře víte, jaké ikony budou tyto názvy představovat. Rovněž zde najdete i časový interval (timeout), jak dlouho bude bublina zobrazena, ale rovnou se vám přiznám, že je třeba brát tento údaj s rezervou, neboť se nápověda zobrazí vždy na o něco delší okamžik (tedy alespoň na mém počítači).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-7416311036676610812?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7416311036676610812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7416311036676610812'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/10/type-pnewnotifyicondata.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-783886079454901115</id><published>2008-10-07T00:00:00.000-07:00</published><updated>2008-10-07T00:01:57.825-07:00</updated><title type='text'>Tipy a triky v Delphi</title><content type='html'>I dnešní tip bude poněkud zaměřen na Windows XP, i když příklad by vám měl fungovat i v jiných verzích. Budeme se zabývat "balónovými hinty".&lt;br /&gt;Tzv. balónové hinty, tedy poněkud vylepšená klasická bublinková nápověda, která se objevuje u ikon na hlavním panelu vedle hodin, se ve větší míře začaly objevovat až s příchodem Windows XP, i když v jisté omezené míře fungují i pod Windows 2000 či ME (stejně jako náš dnešní příklad). &lt;br /&gt;Kromě výrazně změněného vzhledu samotné "bubliny", která teď už vypadá skutečně jako komiksová bublina, se drobně odlišuje i text. Bublina obsahuje jednak jakýsi nadpis, který je napsán tučněji než samotný text a pak pochopitelně samotnou zprávu uživateli, která může být několikařádková. Dále je zde drobná ikonka, symbolizující druh zprávy (podobně jako u klasických message dialogů) a rovněž tlačítko na uzavření tohoto malého "okna". Ale dost popisu, všichni víte, oč se jedná. &lt;br /&gt;Náš příklad tedy ve zkratce provede to, že po spuštění se přidá do hlavního panelu ikonka naší aplikace a zobrazí se balónový hint s krátkým textem. Po uplynutí zadaného času (nastaven na 3 sekundy) nebo kliknutí uživatele pak nápověda zmizí. &lt;br /&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ShellAPI;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;  NIF_INFO = $10;&lt;br /&gt;  NIF_MESSAGE = 1;&lt;br /&gt;  NIF_ICON = 2;&lt;br /&gt;  NOTIFYICON_VERSION = 3;&lt;br /&gt;  NIF_TIP = 4;&lt;br /&gt;  NIM_SETVERSION = $00000004;&lt;br /&gt;  NIM_SETFOCUS = $00000003;&lt;br /&gt;  NIIF_INFO = $00000001;&lt;br /&gt;  NIIF_WARNING = $00000002;&lt;br /&gt;  NIIF_ERROR = $00000003;&lt;br /&gt;  NIN_BALLOONSHOW = WM_USER + 2;&lt;br /&gt;  NIN_BALLOONHIDE = WM_USER + 3;&lt;br /&gt;  NIN_BALLOONTIMEOUT = WM_USER + 4;&lt;br /&gt;  NIN_BALLOONUSERCLICK = WM_USER + 5;&lt;br /&gt;  NIN_SELECT = WM_USER + 0;&lt;br /&gt;  NINF_KEY = $1;&lt;br /&gt;  NIN_KEYSELECT = NIN_SELECT or NINF_KEY;&lt;br /&gt;  TRAY_CALLBACK = WM_USER + $7258;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-783886079454901115?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/783886079454901115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/783886079454901115'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/10/tipy-triky-v-delphi.html' title='Tipy a triky v Delphi'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3023321143745660097</id><published>2008-08-11T03:38:00.000-07:00</published><updated>2008-08-11T03:39:41.190-07:00</updated><title type='text'></title><content type='html'>{$R *.dfm}&lt;br /&gt;&lt;br /&gt;function RegisterSessionNotification(Wnd: HWND; dwFlags: DWORD): Boolean;&lt;br /&gt;type&lt;br /&gt;  TWTSRegisterSessionNotification = function(Wnd: HWND; dwFlags: DWORD): BOOL; stdcall;&lt;br /&gt;var&lt;br /&gt;  hWTSapi32dll: THandle;&lt;br /&gt;  WTSRegisterSessionNotification: TWTSRegisterSessionNotification;&lt;br /&gt;begin&lt;br /&gt;  Result := False;&lt;br /&gt;  hWTSAPI32DLL := LoadLibrary('Wtsapi32.dll');&lt;br /&gt;  if (hWTSAPI32DLL &gt; 0) then&lt;br /&gt;  begin&lt;br /&gt;    try&lt;br /&gt;      @WTSRegisterSessionNotification := GetProcAddress(hWTSAPI32DLL, 'WTSRegisterSessionNotification');&lt;br /&gt;      if Assigned(WTSRegisterSessionNotification) then Result := WTSRegisterSessionNotification(Wnd, dwFlags);&lt;br /&gt;    finally&lt;br /&gt;      if hWTSAPI32DLL &gt; 0 then FreeLibrary(hWTSAPI32DLL);&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function UnRegisterSessionNotification(Wnd: HWND): Boolean;&lt;br /&gt;type&lt;br /&gt;  TWTSUnRegisterSessionNotification = function(Wnd: HWND): BOOL; stdcall;&lt;br /&gt;var&lt;br /&gt;  hWTSapi32dll: THandle;&lt;br /&gt;  WTSUnRegisterSessionNotification: TWTSUnRegisterSessionNotification;&lt;br /&gt;begin&lt;br /&gt;  Result := False;&lt;br /&gt;  hWTSAPI32DLL := LoadLibrary('Wtsapi32.dll');&lt;br /&gt;  if (hWTSAPI32DLL &gt; 0) then&lt;br /&gt;  begin&lt;br /&gt;    try&lt;br /&gt;      @WTSUnRegisterSessionNotification := GetProcAddress(hWTSAPI32DLL, 'WTSUnRegisterSessionNotification');&lt;br /&gt;      if Assigned(WTSUnRegisterSessionNotification) then Result:= WTSUnRegisterSessionNotification(Wnd);&lt;br /&gt;    finally&lt;br /&gt;      if hWTSAPI32DLL &gt; 0 then FreeLibrary(hWTSAPI32DLL);&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function GetCurrentSessionID: Integer;&lt;br /&gt;type&lt;br /&gt;  TProcessIdToSessionId = function(dwProcessId: DWORD; pSessionId: DWORD): BOOL; stdcall;&lt;br /&gt;var&lt;br /&gt;  ProcessIdToSessionId: TProcessIdToSessionId;&lt;br /&gt;  Lib : THandle;&lt;br /&gt;  pSessionId : DWord;&lt;br /&gt;begin&lt;br /&gt;  Result := 0;&lt;br /&gt;  Lib := GetModuleHandle('kernel32');&lt;br /&gt;  if Lib &lt;&gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    ProcessIdToSessionId := GetProcAddress(Lib, '1ProcessIdToSessionId');&lt;br /&gt;    if Assigned(ProcessIdToSessionId) then&lt;br /&gt;    begin&lt;br /&gt;      ProcessIdToSessionId(GetCurrentProcessId(), DWORD(@pSessionId));&lt;br /&gt;      Result:= pSessionId;&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.AppMessage(var Msg: TMSG; var Handled: Boolean);&lt;br /&gt;var&lt;br /&gt;  strReason: string;&lt;br /&gt;begin&lt;br /&gt;  Handled := False;&lt;br /&gt;  if Msg.Message = WM_WTSSESSION_CHANGE then&lt;br /&gt;    begin&lt;br /&gt;      case Msg.wParam of&lt;br /&gt;        WTS_CONSOLE_CONNECT: strReason := 'WTS_CONSOLE_CONNECT';&lt;br /&gt;        WTS_CONSOLE_DISCONNECT: strReason := 'WTS_CONSOLE_DISCONNECT';&lt;br /&gt;        WTS_REMOTE_CONNECT: strReason := 'WTS_REMOTE_CONNECT';&lt;br /&gt;        WTS_REMOTE_DISCONNECT: strReason := 'WTS_REMOTE_DISCONNECT';&lt;br /&gt;        WTS_SESSION_LOGON: strReason := 'WTS_SESSION_LOGON';&lt;br /&gt;        WTS_SESSION_LOGOFF: strReason := 'WTS_SESSION_LOGOFF';&lt;br /&gt;        WTS_SESSION_LOCK: strReason := 'WTS_SESSION_LOCK';&lt;br /&gt;        WTS_SESSION_UNLOCK: strReason := 'WTS_SESSION_UNLOCK';&lt;br /&gt;        WTS_SESSION_REMOTE_CONTROL: strReason := 'WTS_SESSION_REMOTE_CONTROL';&lt;br /&gt;      else&lt;br /&gt;        strReason := 'WTS_Unknown';&lt;br /&gt;      end;&lt;br /&gt;    Memo1.Lines.Add(strReason + ' ' + IntToStr(msg.Lparam));&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;ShowMessage(IntToStr(GetCurrentSessionID));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;if FRegisteredSessionNotification then UnRegisterSessionNotification(Handle);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;FRegisteredSessionNotification := RegisterSessionNotification(Handle, NOTIFY_FOR_THIS_SESSION);&lt;br /&gt;Application.OnMessage := AppMessage;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end. &lt;br /&gt;A zbývá jen poslední informace, týkající se ostatních systémů Windows. Není třeba se obávat žádných chybových hlášení, program vybavený těmito funkcemi bude fungovat i na starších systémech, ale tyto funkce pochopitelně nebudou mít žádný efekt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3023321143745660097?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3023321143745660097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3023321143745660097'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/08/r.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-343147367879181670</id><published>2008-08-07T05:57:00.000-07:00</published><updated>2008-08-07T05:59:26.537-07:00</updated><title type='text'></title><content type='html'>Vytvoříme si proto malou ukázkovou aplikaci, která bude toto přepínání hlídat. Poslouží nám k tomu dvě funkce. První zařídí, aby aplikace dostávala od systému upozornění na změnu session (tu použijeme při spuštění programu), druhou funkcí zase toto upozorňování zrušíme (při ukončení programu). Ještě přidáme navíc funkci pro detekci čísla aktuální session. V konstantách budou uloženy názvy jednotlivých stavů session (a zřejmě nemá cenu je překládat do češtiny, takže je ponechávám v původní podobě) a všechny výpisy budou prováděny do komponenty Memo. Umístěte ji proto na prázdný formulář. Jelikož totiž po přepnutí uživatele nebudete mít k aplikaci přístup, bude záznam o této změně vypsán právě do komponenty Memo a po opětovném přepnutí zpět si můžete jednotlivé stavy prohlédnout. Poslední věcí je tlačítko, které rovněž přidejte na formulář. Po jeho stisku bude zobrazeno číslo session, což má v tomto případě spíše ukázkový charakter, protože budete vidět vždy jen vaší aktuální session (po přepnutí na jiného uživatele pochopitelně tlačítko nepůjde stisknout, protože neuvidíte vůbec samotnou aplikaci). V "ostrých" aplikacích však tato funkce své využití jistě najde a rovněž místo výpisu daných stavů do Memo se bude aplikace chovat jinak. A zde tedy již samotný kód. Pro dnešek opět kompletní unit pro snadnější zkopírování do Delphi. &lt;br /&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;  Dialogs, StdCtrls;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;&lt;br /&gt;  WM_WTSSESSION_CHANGE = $2B1;&lt;br /&gt;  WTS_CONSOLE_CONNECT = 1;&lt;br /&gt;  WTS_CONSOLE_DISCONNECT = 2;&lt;br /&gt;  WTS_REMOTE_CONNECT = 3;&lt;br /&gt;  WTS_REMOTE_DISCONNECT = 4;&lt;br /&gt;  WTS_SESSION_LOGON = 5;&lt;br /&gt;  WTS_SESSION_LOGOFF = 6;&lt;br /&gt;  WTS_SESSION_LOCK = 7;&lt;br /&gt;  WTS_SESSION_UNLOCK = 8;&lt;br /&gt;  WTS_SESSION_REMOTE_CONTROL = 9;&lt;br /&gt;  NOTIFY_FOR_THIS_SESSION = 0;&lt;br /&gt;  NOTIFY_FOR_ALL_SESSIONS = 1;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TForm1 = class(TForm)&lt;br /&gt;    Memo1: TMemo;&lt;br /&gt;    Button1: TButton;&lt;br /&gt;    procedure Button1Click(Sender: TObject);&lt;br /&gt;    procedure FormDestroy(Sender: TObject);&lt;br /&gt;    procedure FormCreate(Sender: TObject);&lt;br /&gt;  private&lt;br /&gt;    { Private declarations }&lt;br /&gt;    FRegisteredSessionNotification : Boolean;&lt;br /&gt;    procedure AppMessage(var Msg: TMSG; var HAndled: Boolean);&lt;br /&gt;  public&lt;br /&gt;    { Public declarations }&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  Form1: TForm1;&lt;br /&gt;&lt;br /&gt;implementation&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-343147367879181670?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/343147367879181670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/343147367879181670'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/08/vytvome-si-proto-malou-ukzkovou.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-7635037431664818367</id><published>2008-08-01T12:27:00.000-07:00</published><updated>2008-08-01T12:28:07.155-07:00</updated><title type='text'></title><content type='html'>Kdysi jsme si v našem seriálu ukazovali, jak detekovat vypnutí či restart systému, protože to je stav, který je pro aplikaci poměrně důležitý. Aplikace v takovém případě může reagovat uložením dat a podobně. S příchodem Windows XP, které jsou stále rozšířenější, se nám celá věc drobně zkomplikovala. Přibyla nám totiž funkce na přepínání uživatelů, kdy nedojde k odhlášení uživatele v pravém slova smyslu, ale jeho aplikace běží na pozadí dál, zatímco může pracovat jiný přihlášený uživatel. Tyto spuštěné aplikace normálně pracují a pro aktuálního uživatele nejsou viditelné ani přístupné. A právě toto přepínání mezi uživateli se naučíme detekovat, aby mohla naše aplikace příslušným způsobem reagovat. V běžných případech to zřejmě nebude vůbec nutné, ale pokud je vaše aplikace natolik speciální, že by přepnutí uživatele mohlo vadit (přistupuje například k nějakým sdíleným prostředkům), jistě se bude tato detekce hodit. Program pak může reagovat tak, že některé své funkce omezí nebo úplně vypne, dokud nedojde opět k přepnutí na původního uživatele.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-7635037431664818367?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7635037431664818367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7635037431664818367'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/08/kdysi-jsme-si-v-naem-serilu-ukazovali.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3585439382170876685</id><published>2008-07-30T01:52:00.000-07:00</published><updated>2008-07-30T01:53:11.747-07:00</updated><title type='text'></title><content type='html'>procedure PaintRainbow(Dc : hDc; x : integer; y : integer; Width : integer; Height : integer; bVertical : bool; WrapToRed : bool);&lt;br /&gt;var&lt;br /&gt;  i : integer;&lt;br /&gt;  ColorChunk : integer;&lt;br /&gt;  OldBrush : hBrush;&lt;br /&gt;  r : integer;&lt;br /&gt;  g : integer;&lt;br /&gt;  b : integer;&lt;br /&gt;  Chunks : integer;&lt;br /&gt;  pt : TPoint;&lt;br /&gt;begin&lt;br /&gt;  OffsetViewportOrgEx(Dc, x, y, pt);&lt;br /&gt;  if WrapToRed then Chunks := 6&lt;br /&gt;                else Chunks := 5;&lt;br /&gt;  if bVertical then ColorChunk := Height div Chunks&lt;br /&gt;                else ColorChunk := Width div Chunks;&lt;br /&gt;&lt;br /&gt;  {Red -&gt; Yellow}&lt;br /&gt;  r := 255;&lt;br /&gt;  b := 0;&lt;br /&gt;  for i := 0 to ColorChunk do&lt;br /&gt;    begin&lt;br /&gt;    g:= (255 div ColorChunk) * i;&lt;br /&gt;    OldBrush := SelectObject(Dc, CreateSolidBrush(Rgb(r, g, b)));&lt;br /&gt;    if bVertical then PatBlt(Dc, 0, i, Width, 1, PatCopy)&lt;br /&gt;                else PatBlt(Dc, i, 0, 1, Height, PatCopy);&lt;br /&gt;    DeleteObject(SelectObject(Dc, OldBrush));&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;  {Yellow -&gt; Green}&lt;br /&gt;  g:=255;&lt;br /&gt;  b:=0;&lt;br /&gt;  for i := ColorChunk  to (ColorChunk * 2) do&lt;br /&gt;    begin&lt;br /&gt;    r := 255 - (255 div ColorChunk) * (i - ColorChunk);&lt;br /&gt;    OldBrush := SelectObject(Dc, CreateSolidBrush(Rgb(r, g, b)));&lt;br /&gt;    if bVertical then PatBlt(Dc, 0, i, Width, 1, PatCopy)&lt;br /&gt;                else PatBlt(Dc, i, 0, 1, Height, PatCopy);&lt;br /&gt;    DeleteObject(SelectObject(Dc, OldBrush));&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;  {Green -&gt; Cyan}&lt;br /&gt;  r:=0;&lt;br /&gt;  g:=255;&lt;br /&gt;  for i:= (ColorChunk * 2) to (ColorChunk * 3) do&lt;br /&gt;    begin&lt;br /&gt;    b := (255 div ColorChunk)*(i - ColorChunk * 2);&lt;br /&gt;    OldBrush := SelectObject(Dc, CreateSolidBrush(Rgb(r, g, b)));&lt;br /&gt;    if bVertical then PatBlt(Dc, 0, i, Width, 1, PatCopy)&lt;br /&gt;                else PatBlt(Dc, i, 0, 1, Height, PatCopy);&lt;br /&gt;    DeleteObject(SelectObject(Dc,OldBrush));&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;  {Cyan -&gt; Blue}&lt;br /&gt;  r := 0;&lt;br /&gt;  b := 255;&lt;br /&gt;  for i:= (ColorChunk * 3) to (ColorChunk * 4) do&lt;br /&gt;    begin&lt;br /&gt;    g := 255 - ((255 div ColorChunk) * (i - ColorChunk * 3));&lt;br /&gt;    OldBrush := SelectObject(Dc, CreateSolidBrush(Rgb(r, g, b)));&lt;br /&gt;    if bVertical then PatBlt(Dc, 0, i, Width, 1, PatCopy)&lt;br /&gt;                else PatBlt(Dc, i, 0, 1, Height, PatCopy);&lt;br /&gt;    DeleteObject(SelectObject(Dc, OldBrush));&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;  {Blue -&gt; Magenta}&lt;br /&gt;  g := 0;&lt;br /&gt;  b := 255;&lt;br /&gt;  for i:= (ColorChunk * 4) to (ColorChunk * 5) do&lt;br /&gt;    begin&lt;br /&gt;    r := (255 div ColorChunk) * (i - ColorChunk * 4);&lt;br /&gt;    OldBrush := SelectObject(Dc, CreateSolidBrush(Rgb(r, g, b)));&lt;br /&gt;    if bVertical then PatBlt(Dc, 0, i, Width, 1, PatCopy)&lt;br /&gt;                else PatBlt(Dc, i, 0, 1, Height, PatCopy);&lt;br /&gt;    DeleteObject(SelectObject(Dc, OldBrush))&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;  if WrapToRed then&lt;br /&gt;    begin&lt;br /&gt;    {Magenta -&gt; Red}&lt;br /&gt;    r := 255;&lt;br /&gt;    g := 0;&lt;br /&gt;    for i := (ColorChunk * 5) to ((ColorChunk * 6) - 1) do&lt;br /&gt;    begin&lt;br /&gt;      b := 255 -((255 div ColorChunk) * (i - ColorChunk * 5));&lt;br /&gt;      OldBrush := SelectObject(Dc, CreateSolidBrush(Rgb(r,g,b)));&lt;br /&gt;      if bVertical then PatBlt(Dc, 0, i, Width, 1, PatCopy)&lt;br /&gt;                  else PatBlt(Dc, i, 0, 1, Height, PatCopy);&lt;br /&gt;      DeleteObject(SelectObject(Dc,OldBrush));&lt;br /&gt;    end;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;  if (Width - (ColorChunk * Chunks) - 1 ) &gt; 0 then&lt;br /&gt;    begin&lt;br /&gt;    if WrapToRed then&lt;br /&gt;    begin&lt;br /&gt;      r := 255;&lt;br /&gt;      g := 0;&lt;br /&gt;      b := 0;&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;    begin&lt;br /&gt;      r := 255;&lt;br /&gt;      g := 0;&lt;br /&gt;      b := 255;&lt;br /&gt;    end;&lt;br /&gt;    OldBrush := SelectObject(Dc, CreateSolidBrush(Rgb(r, g, b)));&lt;br /&gt;    if bVertical then PatBlt(Dc, 0, ColorChunk * Chunks, Width, Height - (ColorChunk * Chunks), PatCopy)&lt;br /&gt;                else PatBlt(Dc, ColorChunk * Chunks, 0, Width - (ColorChunk * Chunks), Height, PatCopy);&lt;br /&gt;    DeleteObject(SelectObject(Dc,OldBrush));&lt;br /&gt;    end;&lt;br /&gt;  OffsetViewportOrgEx(Dc, Pt.x, Pt.y, pt);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function ColorAtRainbowPoint(ColorPlace : integer; RainbowWidth : integer; WrapToRed : bool) : TColorRef;&lt;br /&gt;var&lt;br /&gt;  ColorChunk : integer;&lt;br /&gt;  ColorChunkIndex : integer;&lt;br /&gt;  ColorChunkStart : integer;&lt;br /&gt;begin&lt;br /&gt;  if ColorPlace = 0 then&lt;br /&gt;    begin&lt;br /&gt;    result := RGB(255, 0, 0);&lt;br /&gt;    exit;&lt;br /&gt;    end;&lt;br /&gt;  if WrapToRed then ColorChunk := RainbowWidth div 6&lt;br /&gt;                else ColorChunk := RainbowWidth div 5;&lt;br /&gt;  ColorChunkStart := ColorPlace div ColorChunk;&lt;br /&gt;  ColorChunkIndex := ColorPlace mod ColorChunk;&lt;br /&gt;  case ColorChunkStart of&lt;br /&gt;    0 : result := RGB(255, (255 div ColorChunk) * ColorChunkIndex, 0);&lt;br /&gt;    1 : result := RGB(255 - (255 div ColorChunk) * ColorChunkIndex, 255, 0);&lt;br /&gt;    2 : result := RGB(0, 255, (255 div ColorChunk) * ColorChunkIndex);&lt;br /&gt;    3 : result := RGB(0, 255 - (255 div ColorChunk) * ColorChunkIndex, 255);&lt;br /&gt;    4 : result := RGB((255 div ColorChunk) * ColorChunkIndex, 0, 255);&lt;br /&gt;    5 : result := RGB(255, 0, 255 - (255 div ColorChunk) * ColorChunkIndex);&lt;br /&gt;  else&lt;br /&gt;    if WrapToRed then result := RGB(255, 0, 0)&lt;br /&gt;                else result := RGB(255, 0, 255);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormPaint(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  PaintRainbow(Form1.Canvas.Handle, 0, 0, Form1.ClientWidth, Form1.ClientHeight, false, true);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormResize(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  InvalidateRect(Form1.Handle, nil, false);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;var&lt;br /&gt;  Color : TColorRef;&lt;br /&gt;begin&lt;br /&gt;  Color := ColorAtRainbowPoint(y, Form1.ClientWidth, true);&lt;br /&gt;  ShowMessage(IntToStr(GetRValue(Color)) + #32 + IntToStr(GetGValue(Color)) + #32 +  IntToStr(GetBValue(Color)));&lt;br /&gt;end; &lt;br /&gt;K čemu dnešní příklad použijete, to již ponechám jako obvykle na vás. Zřejmě asi nebude nejvhodnější dávat takové barevné pozadí na hlavní formulář aplikace, ale jistě se najdou i jiná vhodná místa. Rovněž si povšimněte, že není nutné aplikovat kreslení spektra pouze na pozadí formuláře, ale prakticky na libovolný objekt, která má "plátno" (Canvas). Například jej můžete použít jako pozadí ToolBaru, ale musíte si dát v tomto případě pozor na překreslování jednotlivých prvků (tlačítek), které bude ToolBar obsahovat. &lt;br /&gt;A to je již pro dnešek opravdu vše a jako obvykle vás v podobných případech vybízím k experimentování se zdrojákem. Určitě se vám povede vykouzlit různé barevné "šílenosti".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3585439382170876685?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3585439382170876685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3585439382170876685'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/07/procedure-paintrainbowdc-hdc-x-integer.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-125407948719436401</id><published>2008-07-17T20:34:00.000-07:00</published><updated>2008-07-17T20:37:32.684-07:00</updated><title type='text'></title><content type='html'>Tipy a triky v Delphi, díl 61.&lt;br /&gt;V našem seriálu už jsme vylepšovali aplikace opravdu rozličnými způsoby. Od tvaru a barev samotného okna, přes úpravu jednotlivých komponent. Ne vždy to samozřejmě bylo účelné a některá tato vylepšení byla spíše pro zábavu a zkoušení. Vše záleží do jisté míry na vašem vkusu, jak moc aplikaci podobnými efekty "přeplácáte". Do podobné kategorie spadá i dnešní tip. &lt;br /&gt;Ukážeme si, jak na pozadí formuláře, které je jinak šedivě (či jinak) nudné, nakreslit duhu. Tedy, ne úplně přesně duhu, ale spíše barevné spektrum. Zkrátka jednotlivé barvy spektra, které postupně přecházejí jedna v druhou. &lt;br /&gt;Příklad se skládá vlastně ze dvou procedur. První slouží k samotnému vykreslování "duhy", druhá pro zjišťování čísla barvy na daném místě duhy (viz. dále). Pohledem do zdrojového kódu můžete vidět, jak jsou postupně kresleny přechody jednotlivých barev. Procedura má postupně parametry, které určují místo, kde bude spektrum kresleno (zde plátno formuláře), dále souřadnice a velikost spektra. Předposledním parametrem určíme, zda má být spektrum horizontální či vertikální a posledním parametrem můžeme zajistit, zda má spektrum opět končit červenou počáteční barvou a uzavřít tak pomyslný "kruh" (což v tomto případě není zrovna přesné vyjádření). &lt;br /&gt;Druhá procedura je spíše takové nepovinné rozšíření pro kontrolu, se samotným kreslením spektra nemá nic společného. Poslouží nám pouze k tomu, že po kliknutí na libovolné místo formuláře se nám zobrazí hodnota barvy, kterou v daném místě spektrum má.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-125407948719436401?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/125407948719436401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/125407948719436401'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/07/tipy-triky-v-delphi-dl-61.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-7506470201900453418</id><published>2008-07-08T04:27:00.001-07:00</published><updated>2008-07-08T04:29:10.319-07:00</updated><title type='text'>Tapeta na ploše během přihlašování</title><content type='html'>I druhý dnešní tip vzdáleně souvisí s přihlašováním do systému a rovněž využijeme registry. Možná vám vadí, že během přihlašování do systému Windows 2000 je pod přihlašovacím dialogem zobrazena jen prázdná (modrá) "pracovní plocha". Samotná tapeta (obrázek) se načte až jednotlivým uživatelům po přihlášení. To však lze změnit a vámi zvolený obrázek se může místo modré prázdné plochy zobrazit už při přihlašování. Stačí do příslušného místa registru zadat cestu k souboru s obrázkem a je to. Bylo by zřejmě zbytečné zde uvádět stejný zdrojový kód jako v předchozím případě a proto si uvedeme pouze příslušnou větev a klíč registru, který je třeba změnit. Konkrétně je to tedy tato větev: &lt;br /&gt;HKEY_USERS\.DEFAULT\Control Panel\Desktop &lt;br /&gt;Zde najdete položku Wallpaper, jejíž hodnotu vyplníte cestou k souboru s obrázkem a vše je hotovo. Po restartu systému již bude daný obrázek načten ihned při zobrazení přihlašovacího okna.&lt;br /&gt;Offline verze ve formátu nápovědy&lt;br /&gt;Soubor všech tipů a triků osažených v dílech 1 až 55 si můžete nyní také stáhnout pro offline prohlížení ve formátu nápovědy pro Windows. Velikost zip souboru je 194 kB.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-7506470201900453418?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7506470201900453418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7506470201900453418'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/07/tapeta-na-ploe-bhem-pihlaovn_08.html' title='Tapeta na ploše během přihlašování'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-6257825676797499176</id><published>2008-07-08T04:27:00.000-07:00</published><updated>2008-07-08T04:29:06.333-07:00</updated><title type='text'>Tapeta na ploše během přihlašování</title><content type='html'>I druhý dnešní tip vzdáleně souvisí s přihlašováním do systému a rovněž využijeme registry. Možná vám vadí, že během přihlašování do systému Windows 2000 je pod přihlašovacím dialogem zobrazena jen prázdná (modrá) "pracovní plocha". Samotná tapeta (obrázek) se načte až jednotlivým uživatelům po přihlášení. To však lze změnit a vámi zvolený obrázek se může místo modré prázdné plochy zobrazit už při přihlašování. Stačí do příslušného místa registru zadat cestu k souboru s obrázkem a je to. Bylo by zřejmě zbytečné zde uvádět stejný zdrojový kód jako v předchozím případě a proto si uvedeme pouze příslušnou větev a klíč registru, který je třeba změnit. Konkrétně je to tedy tato větev: &lt;br /&gt;HKEY_USERS\.DEFAULT\Control Panel\Desktop &lt;br /&gt;Zde najdete položku Wallpaper, jejíž hodnotu vyplníte cestou k souboru s obrázkem a vše je hotovo. Po restartu systému již bude daný obrázek načten ihned při zobrazení přihlašovacího okna.&lt;br /&gt;Offline verze ve formátu nápovědy&lt;br /&gt;Soubor všech tipů a triků osažených v dílech 1 až 55 si můžete nyní také stáhnout pro offline prohlížení ve formátu nápovědy pro Windows. Velikost zip souboru je 194 kB.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-6257825676797499176?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6257825676797499176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6257825676797499176'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/07/tapeta-na-ploe-bhem-pihlaovn.html' title='Tapeta na ploše během přihlašování'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-5956712805873964374</id><published>2008-06-23T00:49:00.001-07:00</published><updated>2008-06-23T00:49:30.820-07:00</updated><title type='text'>Zobrazení upozornění před logovacím dialogem</title><content type='html'>Ve Windows existuje možnost drobnou úpravou registru zajistit to, že se ještě před samotným dialogem pro přihlášení do systému zobrazí okno s textem, které tak může uživatele upozornit na různé události. Po potvrzení dialogu kliknutím na OK pak již pokračuje přihlášení zcela běžným způsobem. Má to tu výhodu, že takto můžete jednak upozornit všechny "legální" uživatele daného systému na nějakou důležitou věc (lépe řečeno vaše aplikace může ohlásit nějakou událost), ale můžete také na cokoliv upozornit (varovat) uživatele, kteří na daném počítači svůj účet nemají. &lt;br /&gt;Postup by měl fungovat ve všech Windows, i když musím přiznat, že mně osobně to na systémech 9x nepracovalo. Pod Windows 2000 však vše pracovalo bezvadně a koneckonců má tato funkce pro systémy NT/2000/XP mnohem větší opodstatnění než pro systémy 9x, které nejsou víceuživatelské v pravém slova smyslu. &lt;br /&gt;Nyní tedy již k samotné implementaci v Delphi. Jelikož jsme v našem seriálu už prováděli úpravy registrů nesčetněkrát, zřejmě by stačilo pouze uvést, kterou větev a klíč upravit, ale pro jistotu si uvedeme celý kód. Snad nemusím připomínat, že je třeba do projektu přidat jednotku Registry. &lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  key: string;&lt;br /&gt;  Reg: TRegIniFile;&lt;br /&gt;begin&lt;br /&gt;  key := '\Software\Microsoft\Windows NT\CurrentVersion\Winlogon';&lt;br /&gt;  Reg := TRegIniFile.Create;&lt;br /&gt;  try&lt;br /&gt;    Reg.RootKey := HKEY_LOCAL_MACHINE;&lt;br /&gt;    Reg.CreateKey(Key);&lt;br /&gt;    if Reg.OpenKey(Key, False) then&lt;br /&gt;      begin&lt;br /&gt;        Reg.WriteString(key, 'LegalNoticeCaption', 'Titulek zobrazeného okna');&lt;br /&gt;        Reg.WriteString(key, 'LegalNoticeText', 'Vlastní zobrazovaný text');&lt;br /&gt;      end;&lt;br /&gt;  finally&lt;br /&gt;    Reg.Free;&lt;br /&gt;  end;&lt;br /&gt;end; &lt;br /&gt;Pro systémy 9x musíte vynechat v textu klíče NT, takže klíč pak vypadá takto: &lt;br /&gt;'\Software\Microsoft\Windows\CurrentVersion\Winlogon' &lt;br /&gt;Zobrazovaný text může mít 256 znaků, u systémů NT s posledním service packem (a zřejmě tím pádem u všech systému 2000 a XP) až 1024 znaků.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-5956712805873964374?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5956712805873964374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5956712805873964374'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/06/zobrazen-upozornn-ped-logovacm-dialogem.html' title='Zobrazení upozornění před logovacím dialogem'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-6614000624451410436</id><published>2008-06-19T02:51:00.001-07:00</published><updated>2008-06-19T02:51:49.050-07:00</updated><title type='text'></title><content type='html'>V jednom z předchozích dílů jsme se zabývali načítáním informací ze souboru WAV a dnes se na to podíváme z poněkud opačné stránky, protože budeme tyto zvukové soubory programově vytvářet. &lt;br /&gt;Procedura, která nám k tomu poslouží, na základě požadovaných parametrů vygeneruje příslušný zvuk do souboru WAV, který pak můžete již běžným způsobem přehrát. Mezi parametry procedury patří jednak frekvence zvuku pro oba kanály, dále pak délka vygenerovaného zvuku (či spíše tónu) a konečně jméno výstupního souboru. Do seznamu použitých jednotek ještě přidejte knihovnu MMSystem, kterou budeme potřebovat. &lt;br /&gt;procedure CreateWave(LeftFreq, RightFreq: Single; Duration: Cardinal; const FileName: String);&lt;br /&gt;const&lt;br /&gt;  BitsPerSample = 16;&lt;br /&gt;  NumChannels = 2;&lt;br /&gt;  SampleRate = 44100;&lt;br /&gt;var&lt;br /&gt;  ChunkSize: Integer;&lt;br /&gt;  DataSize: Integer;&lt;br /&gt;  Factor: Single;&lt;br /&gt;  Format: TWaveFormatEx;&lt;br /&gt;  FourCC: array[0..3] of Char;&lt;br /&gt;  I: Integer;&lt;br /&gt;  NumSamples: Integer;&lt;br /&gt;  L: SmallInt;&lt;br /&gt;  R: SmallInt;&lt;br /&gt;  WaveStream: TFileStream;&lt;br /&gt;begin&lt;br /&gt;  WaveStream := TFileStream.Create(FileName, fmCreate);&lt;br /&gt;  try&lt;br /&gt;    FourCC := 'RIFF';&lt;br /&gt;    WaveStream.Write(FourCC, SizeOf(FourCC));&lt;br /&gt;    NumSamples := (SampleRate * Duration) div 1000;&lt;br /&gt;    DataSize := (BitsPerSample shr 3) * NumChannels * NumSamples;&lt;br /&gt;    ChunkSize := DataSize + SizeOf(TWaveFormatEx) + 20;&lt;br /&gt;    WaveStream.Write(ChunkSize, SizeOf(ChunkSize));&lt;br /&gt;    FourCC := 'WAVE';&lt;br /&gt;    WaveStream.Write(FourCC, SizeOf(FourCC));&lt;br /&gt;    FourCC := 'fmt ';&lt;br /&gt;    WaveStream.Write(FourCC, SizeOf(FourCC));&lt;br /&gt;    ChunkSize := SizeOf(TWaveFormatEx);&lt;br /&gt;    WaveStream.Write(ChunkSize, SizeOf(ChunkSize));&lt;br /&gt;    with Format do&lt;br /&gt;    begin&lt;br /&gt;      wFormatTag := WAVE_FORMAT_PCM;&lt;br /&gt;      nChannels := NumChannels;&lt;br /&gt;      nSamplesPerSec := SampleRate;&lt;br /&gt;      wBitsPerSample := BitsPerSample;&lt;br /&gt;      nBlockAlign := nChannels * wBitsPerSample shr 3;&lt;br /&gt;      nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;&lt;br /&gt;      cbSize := 0&lt;br /&gt;    end;&lt;br /&gt;    WaveStream.Write(Format, SizeOf(Format));&lt;br /&gt;    FourCC := 'data';&lt;br /&gt;    WaveStream.Write(FourCC, SizeOf(FourCC));&lt;br /&gt;    ChunkSize := DataSize;&lt;br /&gt;    WaveStream.Write(ChunkSize, SizeOf(ChunkSize));&lt;br /&gt;    for I := 0 to 999 do&lt;br /&gt;    begin&lt;br /&gt;      Factor := Exp(- 0.005 * (1000 - I));&lt;br /&gt;      L := Round(Factor * 32767 * Sin(2 * Pi * LeftFreq * I / SampleRate));&lt;br /&gt;      R := Round(Factor * 32767 * Sin(2 * Pi * RightFreq * I / SampleRate));&lt;br /&gt;      WaveStream.Write(L, SizeOf(L));&lt;br /&gt;      WaveStream.Write(R, SizeOf(R))&lt;br /&gt;    end;&lt;br /&gt;    for I := 1000 to NumSamples - 1001 do&lt;br /&gt;    begin&lt;br /&gt;      L := Round(32767 * Sin(2 * Pi * LeftFreq * I / SampleRate));&lt;br /&gt;      R := Round(32767 * Sin(2 * Pi * RightFreq * I / SampleRate));&lt;br /&gt;      WaveStream.Write(L, SizeOf(L));&lt;br /&gt;      WaveStream.Write(R, SizeOf(R))&lt;br /&gt;    end;&lt;br /&gt;    for I := NumSamples - 1000 to NumSamples - 1 do&lt;br /&gt;    begin&lt;br /&gt;      Factor := Exp(0.005 * (NumSamples - 1001 - I));&lt;br /&gt;      L := Round(Factor * 32767 * Sin(2 * Pi * LeftFreq * I / SampleRate));&lt;br /&gt;      R := Round(Factor * 32767 * Sin(2 * Pi * RightFreq * I / SampleRate));&lt;br /&gt;      WaveStream.Write(L, SizeOf(L));&lt;br /&gt;      WaveStream.Write(R, SizeOf(R))&lt;br /&gt;    end;&lt;br /&gt;    WaveStream.Position := 0;&lt;br /&gt;  finally&lt;br /&gt;    WaveStream.Free&lt;br /&gt;  end&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;CreateWave(500, 100, 1000, 'test.wav');&lt;br /&gt;end; &lt;br /&gt;Pohledem do části konstant zdrojového kódu si můžete všimnout, jaké parametry bude výsledný soubor mít. &lt;br /&gt;Konkrétní příklad použití vidíte hned za procedurou v události OnClick tlačítka, kdy po jeho stisknutí bude vygenerován testovací soubor o délce jedné sekundy s příslušnými parametry pro levý a pravý kanál. Výsledný "zvuk" sice vzdáleně připomíná spíše nějaké vrčení elektromotoru, ale jsem si jist, že při troše experimentování něco zajímavého vytvoříte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-6614000624451410436?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6614000624451410436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6614000624451410436'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/06/v-jednom-z-pedchozch-dl-jsme-se-zabvali.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-6015370917723626056</id><published>2008-06-15T01:24:00.000-07:00</published><updated>2008-06-15T01:25:02.885-07:00</updated><title type='text'></title><content type='html'>Po spuštění naší ukázkové aplikace se vám zobrazí prázdný formulář. Stačí kliknout kamkoliv na jeho plochu a na tomto místě se vytvoří Label s jednoduchým textem, obsahující informace u původních souřadnicích textu (tedy před tím, než s ním začnete hýbat). &lt;br /&gt;Jak vidíte, kód je uveden opět jako celá jednotka, takže stačí, když si vytvoříte nový projekt a celý tento kód umístíte do vytvořené jednotky. Pak již zbývá jen přiřadit událost OnClick formuláře a vše je hotovo. &lt;br /&gt;Zkuste s kódem trošku experimentovat a uvidíte, že se dá tohoto jednoduchého postupu využít k různým účelům. Přesunovat takto můžete i jiné komponenty, třeba tlačítka, ale to již ponechám na vaší fantazii.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-6015370917723626056?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6015370917723626056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6015370917723626056'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/06/po-sputn-na-ukzkov-aplikace-se-vm.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-7806959515461245432</id><published>2008-06-09T23:12:00.001-07:00</published><updated>2008-06-09T23:12:41.512-07:00</updated><title type='text'></title><content type='html'>Pro zvýšení "efektu" je barva Labelu během přetahování změněna na červenou (z původní modré). K přesunování textu můžete použít libovolné tlačítko na myši, ale pokud by vám to nevyhovovalo, jistě pro vás nebude problém kód upravit tak, aby přesun reagoval například jen na pravé tlačítko, neboť identifikace tlačítka je součástí parametrů procedur pro pohyb (či přesněji řečeno události pro stisk a uvolnění tlačítka). Do nich pak stačí vložit na začátek jednoduchou podmínku: &lt;br /&gt;if Button = mbRight then &lt;br /&gt;begin &lt;br /&gt;. &lt;br /&gt;. &lt;br /&gt;. &lt;br /&gt;end; &lt;br /&gt;Do těla této podmínky pak vložíte zbytek kódu události.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-7806959515461245432?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7806959515461245432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7806959515461245432'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/06/pro-zven-efektu-je-barva-labelu-bhem.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-8865596960614994475</id><published>2008-06-08T00:02:00.000-07:00</published><updated>2008-06-08T00:03:31.602-07:00</updated><title type='text'></title><content type='html'>Po dvou dílech, ve kterých jsme se zabývali soubory MP3, se dnes podíváme opět na něco jiného. Tentokrát budeme pomocí myši posouvat text po formuláři.&lt;br /&gt;Poněkud zamlžený úvod si hned podrobněji vysvětlíme. Příklad, který si teď ukážeme, bude dělat jednoduchou věc. Po kliknutí na formulář se na daném místě objeví textový popisek (Label). Tento Label pak budeme moci po formuláři libovolně přesunovat myší ve stylu drag and drop. Takovýchto Labelů si budete moci na formulář "naklikat" kolik budete chtít, protože jsou vytvářeny až za běhu programu. &lt;br /&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TForm1 = class(TForm)&lt;br /&gt;  procedure FormClick(Sender: TObject);&lt;br /&gt;private&lt;br /&gt;  { Private declarations }&lt;br /&gt;  downX, downY: Integer;&lt;br /&gt;  dragging: Boolean;&lt;br /&gt;  procedure ControlMouseDown(Sender: TObject; Button: TMouseButton;&lt;br /&gt;    Shift: TShiftState; X, Y: Integer);&lt;br /&gt;  procedure ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);&lt;br /&gt;  procedure ControlMouseUp(Sender: TObject; Button: TMouseButton;&lt;br /&gt;    Shift: TShiftState; X, Y: Integer);&lt;br /&gt;public&lt;br /&gt;  { Public declarations }&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  Form1: TForm1;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{$R *.DFM}&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TMCapture = Class(TControl);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormClick(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  pt: TPoint;&lt;br /&gt;begin&lt;br /&gt;  GetCursorPos( pt );&lt;br /&gt;  pt := ScreenToClient( pt );&lt;br /&gt;  with TLabel.Create( Self ) do&lt;br /&gt;    begin&lt;br /&gt;      SetBounds(pt.x, pt.y, width, height);&lt;br /&gt;      Caption := Format('Souřadnice %d, %d', [pt.x, pt.y]);&lt;br /&gt;      Color := clBlue;&lt;br /&gt;      Font.Color := clWhite;&lt;br /&gt;      Autosize := True;&lt;br /&gt;      Parent := Self;&lt;br /&gt;      OnMouseDown := ControlMouseDown;&lt;br /&gt;      OnMouseUp := ControlMouseUp;&lt;br /&gt;      OnMouseMove := ControlMouseMove;&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.ControlMouseDown(Sender: TObject; Button: TMouseButton;&lt;br /&gt;Shift: TShiftState; X, Y: Integer);&lt;br /&gt;begin&lt;br /&gt;  downX := X;&lt;br /&gt;  downY := Y;&lt;br /&gt;  dragging := True;&lt;br /&gt;  with TMCapture(Sender) do&lt;br /&gt;    begin&lt;br /&gt;      MouseCapture := True;&lt;br /&gt;      Color := clRed;&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.ControlMouseMove(Sender: TObject; Shift: TShiftState;  X, Y: Integer);&lt;br /&gt;begin&lt;br /&gt;  if dragging then&lt;br /&gt;    with Sender as TControl do&lt;br /&gt;    begin&lt;br /&gt;      Left := X - downX + Left;&lt;br /&gt;      Top := Y - downY + Top;&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.ControlMouseUp(Sender: TObject; Button: TMouseButton;&lt;br /&gt;Shift: TShiftState; X, Y: Integer);&lt;br /&gt;begin&lt;br /&gt;  if dragging then&lt;br /&gt;    begin&lt;br /&gt;      dragging := False;&lt;br /&gt;      with TMCapture(Sender) do&lt;br /&gt;        begin&lt;br /&gt;          MouseCapture := False;&lt;br /&gt;          Color := clBlue;&lt;br /&gt;        end;&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-8865596960614994475?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8865596960614994475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8865596960614994475'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/06/po-dvou-dlech-ve-kterch-jsme-se-zabvali.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3681140092299453741</id><published>2008-05-22T02:40:00.000-07:00</published><updated>2008-05-22T02:42:23.446-07:00</updated><title type='text'></title><content type='html'>Pro výpis informací o souboru použijeme podobně jako minule opět komponentu Memo, takže i tu je třeba umístit na formulář. &lt;br /&gt;Samotné zpracování načtených informací a jejich zobrazení budeme provádět v události OnClick komponenty FileListBox. &lt;br /&gt;procedure TForm1.FileListBox1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  soubor: MPEG_Header;&lt;br /&gt;  f: file;&lt;br /&gt;  hlavicka: header_type;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  try&lt;br /&gt;    Assignfile(f, Filelistbox1.Filename);&lt;br /&gt;    Reset(f, 1);&lt;br /&gt;    blockread(f, hlavicka, SizeOf(hlavicka));&lt;br /&gt;    if not (hlavicka[0] &lt;&gt; 255) or ((hlavicka[1] or $1F) &lt;&gt; 255) then&lt;br /&gt;      begin&lt;br /&gt;        if ((hlavicka[1] and 16) shr 4) = 0 then soubor.version := 2&lt;br /&gt;        else soubor.version := (hlavicka[1] and 8) shr 3;&lt;br /&gt;        soubor.layer := 4 - ((hlavicka[1] and 6) shr 1);&lt;br /&gt;        soubor.protect := hlavicka[1] and 1;&lt;br /&gt;        soubor.bitrate := (hlavicka[2] and 240) shr 4;&lt;br /&gt;        soubor.samplerate := (hlavicka[2] and 12) shr 2;&lt;br /&gt;        soubor.padding := (hlavicka[2] and 2) shr 1;&lt;br /&gt;        soubor.extension := (hlavicka[2] and 1);&lt;br /&gt;        soubor.channelmode := (hlavicka[3] and 192) shr 6;&lt;br /&gt;        soubor.modeextension := (hlavicka[3] and 48) shr 4;&lt;br /&gt;        soubor.copyright := (hlavicka[3] and 8) shr 3;&lt;br /&gt;        soubor.original := (hlavicka[3] and 4) shr 2;&lt;br /&gt;        soubor.emphasis := (hlavicka[3] and 3);&lt;br /&gt;&lt;br /&gt;        Memo1.Clear;&lt;br /&gt;        Memo1.Lines.Add('MPEG ' + MPEG_version[soubor.version] + ' Layer ' + MPEG_layer[soubor.layer]);&lt;br /&gt;        Memo1.Lines.Add(IntToStr(MPEG_bitrates[soubor.version, soubor.layer-1, soubor.bitrate]) + ' kbps');&lt;br /&gt;        Memo1.Lines.Add(IntToStr(MPEG_frequencies[soubor.version, soubor.samplerate]) + ' Hz');&lt;br /&gt;        Memo1.Lines.Add(MPEG_channel[soubor.channelmode]);&lt;br /&gt;        Memo1.Lines.Add('Private : ' + MPEG_extension[soubor.extension]);&lt;br /&gt;        Memo1.Lines.Add('CRCs : ' + MPEG_protection[soubor.protect]);&lt;br /&gt;        Memo1.Lines.Add('Copyrighted : ' + MPEG_copyright[soubor.copyright]);&lt;br /&gt;        Memo1.Lines.Add('Original : ' + MPEG_original[soubor.original]);&lt;br /&gt;        Memo1.Lines.Add('Emphasis : ' + MPEG_emphasis[soubor.emphasis]);&lt;br /&gt;      end&lt;br /&gt;    else Memo1.Lines.Add('Chyba !!!!!');&lt;br /&gt;  except&lt;br /&gt;  end;&lt;br /&gt;end; &lt;br /&gt;Toto je tedy zhruba základ toho, co lze ze souboru MPEG vyčíst a co je asi pro běžného uživatele nejdůležitější. Pokud by vás zajímaly další informace, které se dají z MPEG souboru "vyždímat", odkáži vás pouze na internet jako zdroj informací. Nebudu vás směrovat na konkrétní stránku, aby to nedopadlo jako minule, ale tentokrát již třeba v době čtení tohoto článku bude www.id3.org fungovat, takže to zkuste například tam.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3681140092299453741?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3681140092299453741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3681140092299453741'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/05/pro-vpis-informac-o-souboru-pouijeme.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-9197831949984175229</id><published>2008-05-19T04:02:00.000-07:00</published><updated>2008-05-19T04:05:57.416-07:00</updated><title type='text'></title><content type='html'>Tipy a triky v Delphi&lt;br /&gt;&lt;br /&gt;Minule jsem si slíbili, že si budeme povídat o souborech MPEG a jak získat z těchto souborů rozličné informace. Ukážeme si tedy, jak zjistit například vzorkovací frekvenci či datový tok a další základní informace.&lt;br /&gt;Podobně jako v minulém díle, vytvoříme si nejprve základní struktury, které budou soubor MPEG (či přesněji jeho hlavičku) popisovat. Na rozdíl od minule, kdy jsme se zabývali ID3 popiskem a informace jsme prakticky rovnou načítali ze souboru, musíme si v tomto případě nejprve nadefinovat řadu konstant. Ty budou obsahovat jednak příslušné frekvence, datové toky a další informace, které jsou standardní a předem definované a každý soubor se dá zařadit do jedné z kolonek. Tyto konstanty tedy mohou vypadat například takto: &lt;br /&gt;const&lt;br /&gt;  MPEG_version: array[0..2] of string = ('2', '1', '2.5');&lt;br /&gt;  MPEG_layer: array[0..3] of string = ('neznámý', 'I', 'II', 'III');&lt;br /&gt;  MPEG_protection: array[0..1] of string = ('Ano', 'Ne');&lt;br /&gt;  MPEG_frequencies: array[0..2, 0..3] of word = ((22050,24000,16000,0), (44100,48000,32000,0), (11025,12000,8000,0));&lt;br /&gt;  MPEG_bitrates: array[0..2,0..2,0..15] of word=&lt;br /&gt;                  (((0,32,48,46,64,80,96,112,128,144,160,176,192,224,256,0),&lt;br /&gt;                    (0, 8,46,24,32,40,48, 56, 64, 80, 96,112,128,144,160,0),&lt;br /&gt;                    (0, 8,16,24,32,40,48, 56, 64, 80, 96,112,128,144,160,0)),&lt;br /&gt;&lt;br /&gt;                  ((0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0),&lt;br /&gt;                    (0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,0),&lt;br /&gt;                    (0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,0)),&lt;br /&gt;&lt;br /&gt;                  ((0,32,48,46,64,80,96,112,128,144,160,176,192,224,256,0),&lt;br /&gt;                    (0, 8,46,24,32,40,48, 56, 64, 80, 96,112,128,144,160,0),&lt;br /&gt;                    (0, 8,16,24,32,40,48, 56, 64, 80, 96,112,128,144,160,0)));&lt;br /&gt;&lt;br /&gt;  MPEG_padding: array[0..1] of string = ('All bits in frame are used', 'Unused bits are filled');&lt;br /&gt;&lt;br /&gt;  MPEG_extension: array[0..1] of string = ('Ne','Ano');&lt;br /&gt;&lt;br /&gt;  MPEG_channel: array[0..3] of string = ('Stereo', 'Joint stereo', 'Dual channel', 'Mono');&lt;br /&gt;&lt;br /&gt;  MPEG_modeext: array[0..3,0..3] of word =&lt;br /&gt;                  ((4,8,12,16),&lt;br /&gt;                  (4,8,12,16),&lt;br /&gt;                  (0,4,8,16),&lt;br /&gt;                  (0,0,0,0));&lt;br /&gt;&lt;br /&gt;  MPEG_copyright: array[0..1] of string = ('Ne','Ano');&lt;br /&gt;&lt;br /&gt;  MPEG_original: array[0..1] of string = ('Ne','Ano');&lt;br /&gt;&lt;br /&gt;  MPEG_emphasis: array[0..3] of string = ('None','50/15 microseconds','Unknown','CITT j.17'); &lt;br /&gt;Nyní je třeba si nadefinovat strukturu pro vlastní hlavičku MPEG souboru a její typ, kterou lze popsat kupříkladu takovýmto záznamem: &lt;br /&gt;MPEG_header = record&lt;br /&gt;                  version,&lt;br /&gt;                  layer,&lt;br /&gt;                  protect,&lt;br /&gt;                  bitrate,&lt;br /&gt;                  samplerate,&lt;br /&gt;                  padding,&lt;br /&gt;                  extension,&lt;br /&gt;                  channelmode,&lt;br /&gt;                  modeextension,&lt;br /&gt;                  copyright,&lt;br /&gt;                  original,&lt;br /&gt;                  emphasis:byte;&lt;br /&gt;                end;&lt;br /&gt;&lt;br /&gt;  header_type = array[0..3] of byte; &lt;br /&gt;A teď již zbývá jen informace z jednotlivých souborů MP3 načíst do předem připravených struktur, zařadit je podle definovaných konstant do příslušné kategorie, zpracovat a výsledek zobrazit. Abychom si náš příklad usnadnili, použijeme pro celé rozhraní procházení disků, složek a souborů komponenty ze záložky Win 3.1, konkrétně tedy komponenty DriveComboBox, DirectoryListBox a FileListBox. Ty navzájem "propojíme" v Object Inspectoru jejich vlastnostmi tak, jak je běžně zvykem, tedy aby se změna v jedné komponentě interaktivně projevila i v komponentách ostatních.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-9197831949984175229?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/9197831949984175229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/9197831949984175229'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/05/tipy-triky-v-delphi-minule-jsem-si.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-1870988308945277455</id><published>2008-05-15T07:43:00.000-07:00</published><updated>2008-05-15T07:45:40.643-07:00</updated><title type='text'></title><content type='html'>Nyní jsme tedy již teoreticky připraveni a můžeme se pustit do samotné implementace načítání tagů v Delphi. Věřím, že většina z vás by již tuto fázi zvládla bez problému sama, ale pro úplnost si uvedeme ukázkový kód. V něm si nejprve nadefinujeme strukturu záznamu pro ID3 tag a dále pak jednoduchou funkci pro načítání tagu ze souboru. Na formulář dále umístěte tlačítko, dialog pro otevření souboru a komponentu Memo pro výpis tagu. Samotné načítání umístíme do události OnClick tlačítka a zde bude zároveň i výpis. &lt;br /&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;  Dialogs, StdCtrls;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TForm1 = class(TForm)&lt;br /&gt;    Button1: TButton;&lt;br /&gt;    OpenDialog1: TOpenDialog;&lt;br /&gt;    Memo1: TMemo;&lt;br /&gt;    procedure Button1Click(Sender: TObject);&lt;br /&gt;  private&lt;br /&gt;    { Private declarations }&lt;br /&gt;  public&lt;br /&gt;    { Public declarations }&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  TagRecord = record&lt;br /&gt;    Header: array [1..3] of Char;&lt;br /&gt;    Title: array [1..30] of Char;&lt;br /&gt;    Artist: array [1..30] of Char;&lt;br /&gt;    Album: array [1..30] of Char;&lt;br /&gt;    Year: array [1..4] of Char;&lt;br /&gt;    Comment: array [1..30] of Char;&lt;br /&gt;    Genre: Byte;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  Form1: TForm1;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;function ReadTag(const FileName: string; var TagData: TagRecord): Boolean;&lt;br /&gt;var&lt;br /&gt;  SourceFile: file;&lt;br /&gt;begin&lt;br /&gt;  try&lt;br /&gt;    Result := true;&lt;br /&gt;    AssignFile(SourceFile, FileName);&lt;br /&gt;    FileMode := 0;&lt;br /&gt;    Reset(SourceFile, 1);&lt;br /&gt;    Seek(SourceFile, FileSize(SourceFile) - 128);&lt;br /&gt;    BlockRead(SourceFile, TagData, 128);&lt;br /&gt;    CloseFile(SourceFile);&lt;br /&gt;  except&lt;br /&gt;    Result := false;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;Tag: TagRecord;&lt;br /&gt;begin&lt;br /&gt;  OpenDialog1.Execute;&lt;br /&gt;  if OpenDialog1.FileName &lt;&gt; '' then ReadTag(OpenDialog1.FileName, Tag);&lt;br /&gt;  if Tag.Header = 'TAG' then&lt;br /&gt;    begin&lt;br /&gt;      Memo1.Clear;&lt;br /&gt;      Memo1.Lines.Add('Titulek: ' + TrimRight(Tag.Title));&lt;br /&gt;      Memo1.Lines.Add('Interpret: ' + TrimRight(Tag.Artist));&lt;br /&gt;      Memo1.Lines.Add('Album: ' + TrimRight(Tag.Album));&lt;br /&gt;      Memo1.Lines.Add('Rok: ' + TrimRight(Tag.Year));&lt;br /&gt;      if ((Tag.Comment[29] = #0) and (Tag.Comment[30] &lt;&gt; #0)) or ((Tag.Comment[29] = #32) and (Tag.Comment[30] &lt;&gt; #32)) then&lt;br /&gt;        begin&lt;br /&gt;          Memo1.Lines.Add('Komentář: ' + TrimRight(Copy(Tag.Comment, 1, 28)));&lt;br /&gt;          Memo1.Lines.Add('Číslo stopy: ' + IntToStr(Ord(Tag.Comment[30])));&lt;br /&gt;        end&lt;br /&gt;      else&lt;br /&gt;        Memo1.Lines.Add('Komentář: ' + TrimRight(Tag.Comment));&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;Pozornější z vás si jistě všimli, že jsem "takticky" vynechal položku žánr. Ten se samozřejmě během načítání rovněž ze souboru načte a uloží do záznamu Genre, ale v podobě čísla, které danému žánru odpovídá a jeho slovní vyjádření je nutné najít v příslušné tabulce (viz. úvodní text). Abych výsledný kód příliš nekomplikoval a neprodlužoval (žánrů je celkem 147), rozhodl jsem se tuto položku vynechat a opět vás musím odkázat na adresu, kde tyto hodnoty a jejich slovní vyjádření naleznete. &lt;br /&gt;To bude pro dnešek vše a příště pravděpodobně ještě u MP3 souborů zůstaneme a povíme si něco o jeho vlastnostech, přesněji řečeno, jak tyto vlastnosti ze souborů získat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-1870988308945277455?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1870988308945277455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1870988308945277455'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/05/nyn-jsme-tedy-ji-teoreticky-pipraveni.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-2227763374778630232</id><published>2008-05-02T03:42:00.000-07:00</published><updated>2008-05-02T03:43:45.728-07:00</updated><title type='text'></title><content type='html'>Dnes se budeme pro začátek zabývat první verzí tagu a časem se možná dostane i na verzi 2, i když to by si již vyžádalo poněkud komplexnější vysvětlování. Ale uvidíme časem. Dnes tedy verze 1. &lt;br /&gt;Jak již bylo řečeno, nachází se na konci souboru a má přesně 128 bajtů. Je pochopitelné, že do takového malého prostoru příliš informací neuložíme, ale něco přeci. Popišme si tedy blíže strukturu tohoto tagu. První tři bajty tvoří vždy slovo TAG a je to vlastně jeden ze znaků, podle kterého se dá testovat, zda soubor tag obsahuje nebo ne. Dalších 30 bajtů tvoří titulek skladby, pak následuje 30 bajtů pro název skupiny či umělce a dále rovněž 30 bajtů pro název alba. Následují 4 bajty pro rok vydání skladby, poté opět 30 bajtů - tentokrát pro komentář a poslední bajt obsahuje žánr skladby. Časem byl tento formát ještě drobně rozšířen (někdy pak bývá označován jako verze 1.1) o parametr čísla skladby. Velikost takového tagu je však stejná, pouze se drobně ukrojil prostor pro komentář. Platí pak pravidlo, že pokud je předposlední bajt komentáře nulový a poslední bajt naopak různý od nuly, vyjadřuje právě tento poslední bajt číslo skladby. Ještě je potřeba vysvětlit, jak je vyřešena otázka žánru. Na něj je vyhrazen pouhý jeden bajt, ale jak jistě dobře víte například při prohlížení detailních informací o souboru ve Winampu, názvy žánrů jsou pochopitelně slovní. Toho je docíleno celkem jednoduše tím, že je předem určena v normě ID3 množina definovaných žánrů se svými čísly. Každý program, který tedy s ID3 tagy pracuje, tuto tabulku v sobě obsahuje a ze souboru je pouze načten identifikující bajt. &lt;br /&gt;Tolik tedy teorie a pokud byste chtěli o tomto tématu získat další znalosti, navštivte tuto adresu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-2227763374778630232?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2227763374778630232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2227763374778630232'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/05/dnes-se-budeme-pro-zatek-zabvat-prvn.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3718036074766076944</id><published>2008-04-25T23:16:00.000-07:00</published><updated>2008-04-25T23:17:33.968-07:00</updated><title type='text'></title><content type='html'>Jak vidíte, ještě než dojde k samotnému testování a případnému přesouvání (přichycování) okna, uloží se nejprve původní rozměry okna, které jsou na konci celé procedury opět na okno aplikovány. Kdyby jsme to neudělali, okno by mělo tendenci během přichycování či "odtrhávání" od okraje plochy měnit svoje rozměry. &lt;br /&gt;Příklad je tedy velmi jednoduchý a jistě sami přijdete na mnohá zlepšení. Určitě by se například slušelo uložit hodnoty tolerance okrajů do konstant pro snadnější modifikaci. Další drobná vada, kterou byste časem jistě objevili, je to, že pokud změníte polohu nabídky Start až po spuštění aplikace, nebude se k menu přichytávat správně. To je celkem samozřejmé, protože rozměry plochy zjišťujeme v události OnCreate. Pokud by tedy přichytávání mělo být ještě o něco dokonalejší, museli bychom hlídat i případnou změnu polohy nabídky Start (či její automatické schovávání) a také rozlišení obrazovky. Ale to již ponechám na vašem uvážení a každý jistě zvládne úpravu kódu tak, jak bude potřebovat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3718036074766076944?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3718036074766076944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3718036074766076944'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/04/jak-vidte-jet-ne-dojde-k-samotnmu.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-9209547245542794347</id><published>2008-04-19T01:23:00.000-07:00</published><updated>2008-04-19T01:25:24.007-07:00</updated><title type='text'></title><content type='html'>Kromě samotné procedury, která hlídá pohyb okna, ještě přidáme do programu jeden krátký řádek kódu do události OnCreate formuláře. Ten zjistí rozměry pracovní plochy, abychom věděli, jestli se okno aplikace přiblížilo k okraji nebo ne. Zároveň se tím vyřeší i "problém" s nabídkou Start a bez ohledu na to, na kterém okraji plochy ji máte umístěnu a zda máte nastaveno automatické schovávání, okno naší aplikace se k ní stejně přichytí. &lt;br /&gt;Celý kód jednoduchého formuláře, který se přichycuje k okrajím plochy, tedy vypadá takto: &lt;br /&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;  Dialogs;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TWMMoving = record&lt;br /&gt;    Msg: Cardinal;&lt;br /&gt;    Side: Longint;&lt;br /&gt;    Coord: PRect;&lt;br /&gt;    Unused: longint;&lt;br /&gt;  end;&lt;br /&gt;  &lt;br /&gt;  TForm1 = class(TForm)&lt;br /&gt;    procedure FormCreate(Sender: TObject);&lt;br /&gt;  private&lt;br /&gt;    { Private declarations }&lt;br /&gt;    procedure WMMoving(var Message: TWMMoving); message WM_MOVING;&lt;br /&gt;  public&lt;br /&gt;    { Public declarations }&lt;br /&gt;    Desktop: TRect;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  Form1: TForm1;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;procedure TForm1.WMMoving(var Message: TWMMoving);&lt;br /&gt;var&lt;br /&gt;  OriginalWidth, OriginalHeight: integer;&lt;br /&gt;begin&lt;br /&gt;  OriginalWidth := Width;&lt;br /&gt;  OriginalHeight := Height;&lt;br /&gt;  if (WindowState = wsNormal) and Visible then&lt;br /&gt;    begin&lt;br /&gt;      if (Message.Coord.Left &lt; (Desktop.Left + 10)) then Message.Coord.Left := Desktop.Left;&lt;br /&gt;      if (Message.Coord.Top &lt; (Desktop.Top + 10)) then Message.Coord.Top := Desktop.Top;&lt;br /&gt;      if (Message.Coord.Bottom &gt; (Desktop.Bottom - 10)) then Message.Coord.Top := Desktop.Bottom - Height;&lt;br /&gt;      if (Message.Coord.Right &gt; (Desktop.Right - 10)) then Message.Coord.Left := Desktop.Right - Width;&lt;br /&gt;    end;&lt;br /&gt;  Message.Coord.Right := Message.Coord.Left + OriginalWidth;&lt;br /&gt;  Message.Coord.Bottom := Message.Coord.Top + OriginalHeight;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  SystemParametersInfo(SPI_GETWORKAREA, 0, @Desktop, 0);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-9209547245542794347?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/9209547245542794347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/9209547245542794347'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/04/krom-samotn-procedury-kter-hld-pohyb.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3795115488541772650</id><published>2008-04-09T03:00:00.000-07:00</published><updated>2008-04-09T03:05:36.096-07:00</updated><title type='text'>Tipy a triky v Delphi</title><content type='html'>Tipy a triky v Delphi, &lt;br /&gt;&lt;br /&gt;Dnes budeme přichytávat okno formuláře k okrajím pracovní plochy. Tato funkce se stává poměrně oblíbeným vylepšením uživatelského prostředí řady programů a proto si ukážeme, jak na to.&lt;br /&gt;Věřím, že jistě všichni víte, o čem je vlastně řeč. Mnoho programů (namátkou třeba populární Winamp) umožňuje uživateli nastavit, že když přesouváte okno aplikace po pracovní ploše a přiblížíte se k některému okraji, okno aplikace se automaticky "přichytí" k tomuto okraji. Pokud tedy chce uživatel umístit okno například do pravého horního rohu pracovní plochy, nemusí se složitě strefovat a má práci velmi usnadněnou. Přesně touto funkcí se dnes budeme zabývat. &lt;br /&gt;Celá věc se dá udělal různými způsoby (jako ostatně většina věcí), ale jako obvykle jsem se snažil o pokud možno co nejjednodušší a také nejkratší kód. Slovní popis celého principu je poměrně logický a jasný. Sledujeme pohyb okna (prostřednictvím zpráv systému) a když se okno přiblíží k některému z okrajů plochy na námi definovanou vzdálenost (v našem případě je to 10 bodů), posuneme okno tak, aby se daného okraje dotýkalo (přichytíme jej).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3795115488541772650?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3795115488541772650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3795115488541772650'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/04/tipy-triky-v-delphi.html' title='Tipy a triky v Delphi'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-1014963386636052251</id><published>2008-04-07T04:23:00.000-07:00</published><updated>2008-04-07T04:29:21.338-07:00</updated><title type='text'></title><content type='html'>procedure TForm1.FileListBox1Change(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;Label1.Caption := '';&lt;br /&gt;Label2.Caption := '';&lt;br /&gt;Label3.Caption := '';&lt;br /&gt;Label4.Caption := '';&lt;br /&gt;Label5.Caption := '';&lt;br /&gt;if FileListBox1.FileName &lt;&gt; '' then&lt;br /&gt;begin&lt;br /&gt;ReadWAV(FileListBox1.FileName, soubor);&lt;br /&gt;if HeaderOK(soubor) then&lt;br /&gt;                    begin&lt;br /&gt;                      Label1.Caption := 'Hlavička souboru v pořádku - soubor rozpoznán';&lt;br /&gt;                      case Soubor.FormatID of&lt;br /&gt;                      1: Label2.Caption := 'Windows PCM';&lt;br /&gt;                      2: Label2.Caption := 'Microsoft ADPCM';&lt;br /&gt;                      6: Label2.Caption := 'A-LAW';&lt;br /&gt;                      7: Label2.Caption := 'MU-LAW';&lt;br /&gt;                      17: Label2.Caption := 'DVI/IMA ADPCM';&lt;br /&gt;                      85: Label2.Caption := 'MPEG Layer III';&lt;br /&gt;                      else&lt;br /&gt;                      Label2.Caption := 'Neznámý formát';&lt;br /&gt;                      end;&lt;br /&gt;&lt;br /&gt;                      case Soubor.ChannelNumber of&lt;br /&gt;                      0: Label3.Caption := 'Neznámý typ';&lt;br /&gt;                      1: Label3.Caption := 'Mono';&lt;br /&gt;                      2: Label3.Caption := 'Stereo';&lt;br /&gt;                      end;&lt;br /&gt;&lt;br /&gt;                      Label4.Caption := IntToStr(Soubor.BitsPerSample) + ' bit';&lt;br /&gt;                      Label5.Caption := IntToStr(Soubor.SampleRate) + ' Hz';&lt;br /&gt;                    end&lt;br /&gt;                      else&lt;br /&gt;                      Label1.Caption := 'Hlavička souboru není v pořádku - soubor nerozpoznán';&lt;br /&gt;end;&lt;br /&gt;end; &lt;br /&gt;A to je pro dnešek vše. V některém z příštích dílu se určitě také podíváme na další zvukové formáty jako třeba MP3. Tento díl je zároveň první, ve kterém jsem se pokusil na základě reakcí některých čtenářů zlepšit čitelnost kódu zvýrazněním klíčových slov. Pokud vaše ohlasy budou kladné, začneme s tím od příště natrvalo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-1014963386636052251?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1014963386636052251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1014963386636052251'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/04/procedure-tform1.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-2427155967428800478</id><published>2008-04-02T04:12:00.000-07:00</published><updated>2008-04-02T04:14:12.791-07:00</updated><title type='text'></title><content type='html'>except&lt;br /&gt;    Result := false;&lt;br /&gt;  end;&lt;br /&gt;end; &lt;br /&gt;Ještě než se dostaneme k samotnému zpracování načtených dat a jejich zobrazení, vytvoříme si jednoduchou funkci, která nám otestuje hlavičku souboru a zjistí, zda je platná či ne a jestli má tím pádem smysl, pokoušet se vypisovat nějaké informace. Funkci pak poté využijeme v další části kódu. &lt;br /&gt;function HeaderOK(const WAVData: WAVRecord): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result := true;&lt;br /&gt;  if WAVData.RIFFHeader &lt;&gt; 'RIFF' then Result := false;&lt;br /&gt;  if WAVData.WAVEHeader &lt;&gt; 'WAVE' then Result := false;&lt;br /&gt;  if WAVData.FormatHeader &lt;&gt; 'fmt ' then Result := false;&lt;br /&gt;  if (WAVData.ChannelNumber &lt;&gt; 1) and (WAVData.ChannelNumber &lt;&gt; 2) then Result := false;&lt;br /&gt;end; &lt;br /&gt;A teď už se konečně dostáváme k výpisu informací na obrazovku. Jak jsme si řekli na začátku, výpis bude součástí události OnChange komponenty FileListBox. Když se podíváte na strukturu načítaných dat na začátek článku a porovnáte s těmi daty, které vypisujeme, jistě vidíte, že jsme nepoužili všechny možnosti, ale nechtěl jsem ukázku příliš prodlužovat. Myslím, že struktura záznamu je svými názvy dostatečně popsána a tak pro vás nebude problém vypsat i další informace. Proto jsou v našem příkladu převážně ty údaje, které jsou vlastně konstantami (a asi by se slušelo je jako konstanty nadefinovat, tak promiňte to zjednodušení). Vše ostatní již z názvů v záznamu pochopíte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-2427155967428800478?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2427155967428800478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2427155967428800478'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/04/except-result-false-end-end-jet-ne-se.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-5806519098376746947</id><published>2008-03-27T04:22:00.000-07:00</published><updated>2008-03-27T04:25:01.649-07:00</updated><title type='text'></title><content type='html'>Nyní můžeme začít vytvářet naší ukázkovou aplikaci. Na prázdný formulář tedy nejprve umístíme tři komponenty, které se nám postarají o procházení adresáři a disky. Kvůli zjednodušení můžeme použít například komponenty FileListBox, DirectoryListBox a DriveComboBox ze záložky Win 3.1 na paletě komponent. Komponenty pak navzájem "propojíme" běžným způsobem nastavením vlastností v Object Inspectoru tak, aby se změna disku či složky automaticky projevila i na výpis souborů a souborovou masku omezíme na soubory WAV. &lt;br /&gt;Pro výpis informací, získaných ze souborů, můžeme použít například Label, respektive jejich větší množství (podle toho kolik a jaké informace budeme vypisovat), ale použít můžete pochopitelně cokoliv, to již nechám na vás. Samotné načtení a zobrazení informací pak umístíme do události OnChange komponenty FileListBox. &lt;br /&gt;A to už se tedy postupně dostáváme k samotnému výpisu informací. Nejdříve si ještě nadefinujeme globální proměnnou, do které budou data načítána a poté již následuje vlastní funkce pro čtení dat ze souboru: &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;var&lt;br /&gt;  soubor: WAVrecord;&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function ReadWAV(const FileName: string; var WAVData: WAVrecord): Boolean;&lt;br /&gt;var&lt;br /&gt;  SourceFile: file;&lt;br /&gt;begin&lt;br /&gt;  try&lt;br /&gt;    Result := true;&lt;br /&gt;    AssignFile(SourceFile, FileName);&lt;br /&gt;    FileMode := 0;&lt;br /&gt;    Reset(SourceFile, 1);&lt;br /&gt;    BlockRead(SourceFile, WAVData, 40);&lt;br /&gt;    if WAVData.DataHeader &lt;&gt; 'data' then&lt;br /&gt;    begin&lt;br /&gt;      Seek(SourceFile, WAVData.FormatSize + 28);&lt;br /&gt;      BlockRead(SourceFile, WAVData.SampleNumber, 4);&lt;br /&gt;    end;&lt;br /&gt;    CloseFile(SourceFile);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-5806519098376746947?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5806519098376746947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5806519098376746947'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/03/nyn-meme-zat-vytvet-na-ukzkovou.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-4422101830806144878</id><published>2008-03-25T04:26:00.000-07:00</published><updated>2008-03-25T04:28:45.038-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tipy a triky v Delphi'/><title type='text'>Tipy a triky v Delphi</title><content type='html'>Tipy a triky v Delphi&lt;br /&gt;&lt;br /&gt;Tématem dnešního dílu budou soubory WAVE. Nebudeme je sice přehrávat, to není až zas tak velký problém, ale naučíme se zjišťovat o nich různé užitečné informace jako je typ, délka, frekvence a mnoho dalších.&lt;br /&gt;Soubory WAVE jsou alespoň na platformě Windows oblíbeným a celkem dlouhá léta standardním formátem pro ukládání zvukových dat. Hudbu máte sice pravděpodobně uloženu v jiném formátu kvůli úspoře místa, ale například pro nahrávání zvuků (hudby) z nějakého externího zdroje a následnou editaci je to celkem použitelný formát, který zvládá snad každý zvukový editor a můžete tak bez ztráty kvality zvuky upravovat. Až poté je teprve převedete do nějakého úspornějšího formátu (MP3, WMA a podobně). Rovněž rozličné systémové zvuky či zvuky v aplikacích jsou uloženy v tomto formátu. Proto jistě nebude na škodu, když si teď ukážeme, jak získat z hlavičky souboru některé zajímavé údaje a vlastnosti souboru. &lt;br /&gt;Nejprve si vytvoříme datovou strukturu, do které tyto informace z hlavičky načteme. Můžeme k tomu využít například záznam (record) a ten bude vypadat takto: &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;type&lt;br /&gt;  WAVrecord = record&lt;br /&gt;    RIFFHeader: array [1..4] of Char;&lt;br /&gt;    FileSize: Integer;&lt;br /&gt;    WAVEHeader: array [1..4] of Char;&lt;br /&gt;    FormatHeader: array [1..4] of Char;&lt;br /&gt;    FormatSize: Integer;&lt;br /&gt;    FormatID: Word;&lt;br /&gt;    ChannelNumber: Word;&lt;br /&gt;    SampleRate: Integer;&lt;br /&gt;    BytesPerSecond: Integer;&lt;br /&gt;    BlockAlign: Word;&lt;br /&gt;    BitsPerSample: Word;&lt;br /&gt;    DataHeader: array [1..4] of Char;&lt;br /&gt;    SampleNumber: Integer;&lt;br /&gt;  end;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-4422101830806144878?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4422101830806144878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4422101830806144878'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/03/tipy-triky-v-delphi_25.html' title='Tipy a triky v Delphi'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-5036212926257916360</id><published>2008-03-19T05:47:00.000-07:00</published><updated>2008-03-19T05:49:40.881-07:00</updated><title type='text'></title><content type='html'>if Pos(uppercase('soname'),exestring) &gt; 0 then&lt;br /&gt;begin&lt;br /&gt;  Extract('soname','eoname',ExeString,Temp);&lt;br /&gt;  SpeedButton1.Caption := 'Program je registrován na: '+Temp;&lt;br /&gt;end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.SpeedButton1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;MyStream: TMemoryStream;&lt;br /&gt;MyFile,newname: string;&lt;br /&gt;A,B: Integer;&lt;br /&gt;begin&lt;br /&gt;If Speedbutton1.Caption &lt;&gt; 'Napište vaše jméno a klikněte sem pro registraci' then exit;&lt;br /&gt;if edit1.text = '' then&lt;br /&gt;begin&lt;br /&gt;  showmessage('Vložte prosím vaše jméno !');&lt;br /&gt;  exit;&lt;br /&gt;end;&lt;br /&gt;MyStream := TMemoryStream.Create;&lt;br /&gt;try&lt;br /&gt;  ExeString := ExeString + uppercase('soname') + Edit1.Text + uppercase('eoname');&lt;br /&gt;  MyStream.Clear;&lt;br /&gt;  MyStream.WriteBuffer(Pointer(ExeString)^, Length(ExeString));&lt;br /&gt;  newname := application.exename;&lt;br /&gt;  Insert('_clone',newname,length(application.exename)-3);&lt;br /&gt;  MyStream.savetofile(newname);&lt;br /&gt;  finally&lt;br /&gt;  MyStream.Free;&lt;br /&gt;  end;&lt;br /&gt;  ShellExecute(Handle, 'open', pchar(newname), nil, nil, SW_SHOWNORMAL);&lt;br /&gt;  application.terminate;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end. &lt;br /&gt;Zdrojový program aplikace si ukazujeme celý, pěkně od začátku až do konce, aby nedošlo k nějakým nejasnostem. Zdrojový kód jsem nechal tentokrát téměř beze změn, tak jak se mi dostal do rukou. &lt;br /&gt;Možná jste si všimli, že je opět použita jedna z variant procedury Delay. Je použita proto, aby v kritické fázi mazání jednoho souboru a spouštění jiného nedošlo ke vzájemné kolizi, ke které může dojít. Proto je vložena půlsekundová pauza. &lt;br /&gt;Místo ve zdrojovém kódu, které je výrazně orámováno lomítky, obsahuje ten kód, který bude proveden v tom případě, že již došlo k úspěšné registraci (a v této fázi již by měl být tedy na disku pouze výsledný modifikovaný soubor). Sem tedy vložte ten kód, který má reagovat na tuto situaci. V naší ukázce dojde jednak k zneviditelnění komponenty Edit, protože ta již není potřeba, a pak je ještě změněna barva formuláře. &lt;br /&gt;Co říci na úplný závěr? Vzhledem ke způsobu manipulace se soubory, jejich kopírování a mazání nebude zřejmě příliš vhodné tento postup použít pro velmi velké soubory. A i při použití pro menší soubory nelze vyloučit za určitých extrémních podmínek možné selhání, ale to je riziko každého podobného krkolomného postupu. Pokud však nemáte jinou možnost, račte vyzkoušet...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-5036212926257916360?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5036212926257916360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5036212926257916360'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/03/if-posuppercasesonameexestring-0-then.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-7932857502879201658</id><published>2008-03-17T03:10:00.000-07:00</published><updated>2008-03-17T03:13:05.299-07:00</updated><title type='text'></title><content type='html'>procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;Var&lt;br /&gt;MyStream: TMemoryStream;&lt;br /&gt;name,C,Temp: String;&lt;br /&gt;D,E: integer;&lt;br /&gt;begin&lt;br /&gt;exe2String(ExeString);&lt;br /&gt;if pos(uppercase('soname'),exestring) &gt; 0 then&lt;br /&gt;begin&lt;br /&gt;  delay(500);&lt;br /&gt;  if pos('_clone',application.exename) = 0 then&lt;br /&gt;  begin&lt;br /&gt;    name := application.exename;&lt;br /&gt;    Insert('_clone',name,(length(name)-3));&lt;br /&gt;    deletefile(name);&lt;br /&gt;  end;&lt;br /&gt;////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;  edit1.visible := false;&lt;br /&gt;  form1.color := $00c6aa84;&lt;br /&gt;////////////////////////////////////////////////////////////////////////////////  &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;if pos('_CLONE',uppercase(application.exename)) &lt;&gt; 0 then&lt;br /&gt;begin&lt;br /&gt;delay(500);&lt;br /&gt;name := application.exename;&lt;br /&gt;Delete(name,length(name)-9,6);&lt;br /&gt;if deletefile(name) then&lt;br /&gt;begin&lt;br /&gt;MyStream := TMemoryStream.Create;&lt;br /&gt;try&lt;br /&gt;  MyStream.WriteBuffer(Pointer(ExeString)^, Length(ExeString));&lt;br /&gt;  MyStream.savetofile(name);&lt;br /&gt;  finally&lt;br /&gt;    MyStream.Free;&lt;br /&gt;    ShellExecute(Handle, 'open', pchar(name), nil, nil, SW_SHOWNORMAL);&lt;br /&gt;    application.terminate&lt;br /&gt;end;&lt;br /&gt;end&lt;br /&gt;else showmessage(name+' nenalezen');&lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-7932857502879201658?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7932857502879201658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7932857502879201658'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/03/procedure-tform1.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-1999155082883417804</id><published>2008-03-13T05:37:00.000-07:00</published><updated>2008-03-13T05:40:12.274-07:00</updated><title type='text'></title><content type='html'>• pokud se již nejedná o dočasný klon, program smaže v daném adresáři všechny soubory, které mají v názvu _CLONE (tím vlastně provede závěrečný úklid) a postup je u konce &lt;br /&gt;• jestliže se jedná o klon, je nejprve smazán z disku originální program, poté uložen na disk modifikovaný soubor pod původním názvem, ten je spuštěn a klon se sám ukončí &lt;br /&gt;• spuštěný finální soubor se postará o smazání klonu (viz. o dva body výše)&lt;br /&gt;Doufám, že je teď již postup zcela jasný a můžeme si tedy ukázat zdrojový kód. Příklad předpokládá, že na formuláři budete mít jeden Edit pro zadávání jména a dále pak SpeedButton, po jehož stisku dojde k registraci - spustí se modifikace souboru: &lt;br /&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface &lt;br /&gt;&lt;br /&gt;uses &lt;br /&gt;  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, &lt;br /&gt;  Buttons, StdCtrls,ShellAPI, ExtCtrls, Mask;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TForm1 = class(TForm)&lt;br /&gt;    SpeedButton1: TSpeedButton;&lt;br /&gt;    Edit1: TEdit;&lt;br /&gt;    procedure FormCreate(Sender: TObject);&lt;br /&gt;    procedure SpeedButton1Click(Sender: TObject);&lt;br /&gt;  private&lt;br /&gt;    { Private declarations }&lt;br /&gt;  public&lt;br /&gt;    { Public declarations }&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  Form1: TForm1;&lt;br /&gt;  ExeString: String;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{$R *.DFM}&lt;br /&gt;&lt;br /&gt;procedure Extract(A,B: String;Var C,D: String);&lt;br /&gt;Var&lt;br /&gt;E,F: Integer;&lt;br /&gt;begin&lt;br /&gt;if Pos(uppercase(A),C) &gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    E := Pos(uppercase(A),C)+length(A);&lt;br /&gt;    F := Pos(uppercase(B),C);&lt;br /&gt;    D := Copy(C,E,F-E);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure Exe2String(var A:String);&lt;br /&gt;Var&lt;br /&gt;ExeStream: TFileStream;&lt;br /&gt;MyStream: TMemoryStream;&lt;br /&gt;begin&lt;br /&gt;  ExeStream:=TFileStream.Create(Application.ExeName,fmOpenRead or fmShareDenyNone);&lt;br /&gt;  Try&lt;br /&gt;    SetLength(A, ExeStream.Size);&lt;br /&gt;    ExeStream.ReadBuffer(Pointer(A)^, ExeStream.Size);&lt;br /&gt;  Finally&lt;br /&gt;  ExeStream.Free;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure Delay(ms : longint);&lt;br /&gt;var&lt;br /&gt;TheTime : LongInt;&lt;br /&gt;begin&lt;br /&gt;TheTime := GetTickCount + ms;&lt;br /&gt;while GetTickCount &lt; TheTime do Application.ProcessMessages;&lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-1999155082883417804?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1999155082883417804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1999155082883417804'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/03/pokud-se-ji-nejedn-o-doasn-klon-program.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-8788032754573201205</id><published>2008-03-11T02:26:00.000-07:00</published><updated>2008-03-11T02:29:04.146-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tipy a triky v Delphi'/><title type='text'>Tipy a triky v Delphi</title><content type='html'>Tipy a triky v Delphi, díl 53.&lt;br /&gt;14. 8. 2002, Jan Šindelář formát pro tisk&lt;br /&gt;Tématem dnešního dílu bude poněkud kontroverzní záležitost, protože se pokusíme modifikovat soubor aplikace přímo za jejího běhu.&lt;br /&gt;Jistě vás napadlo, že běžným způsobem to nepůjde, protože běžící program by vám neměl operační systém v žádném případě dovolit jakkoliv pozměňovat či mazat z disku a také vám to nedovolí. Způsobů, jak toto omezení obejít, lze určitě vymyslet několik, ale vždy se bude jednat o ne příliš obvyklý způsob a proto berte i čistotu dnešního zdrojového kódů poněkud tolerantněji. &lt;br /&gt;Ale zpět k našemu příkladu. Jistou možností je vytvořit za běhu aplikace její upravenou kopii a původního souboru se poté zbavit například tím, že do registru systému vložíme příkaz k jeho vymazání po dalším restartu Windows. Jistě víte, že podobný způsob využívají například instalační programy, které se tak zbavují těch částí programu, které nemohly být z určitého důvodu ukončeny (a smazány) v době odinstalace aplikace. Způsob je to jistě korektní a čistý, ale má tu nevýhodu, že tento efekt změny není okamžitý a je závislý právě na restartu systému. Proto si ukážeme jiný postup, který bude mít okamžitý efekt, ale nebude tak způsobný, jako postup předchozí. &lt;br /&gt;Než si ukážeme zdrojový kód, je třeba si slovně popsat celý princip. Věc není komplikovaná, ale je potřeba si ujasnit jisté situace, které mohou nastat a které jsou pro příklad klíčové. Velmi zkráceně řečeno je postup takový, že se vytvoří kopie běžící aplikace, která bude poté uložena na disk v již pozměněné podobě a pochopitelně pod jiným názvem. Tato nová aplikace bude poté spuštěna, původní aplikace se ukončí a bude novou aplikací z disku smazána. Nyní již zbývá jen poslední věc a tou je název nově vzniklé aplikace. Ten je totiž jiný, než byl u aplikace původní, protože jsme pochopitelně nemohli uložit na disk dva soubory téhož názvu. A proto si postup ještě jednou zopakujeme. Opět uložíme kopii souboru na disk, ale tentokrát již pod původním názvem, tato další nová aplikace bude opět spuštěna a postará se o smazání "dočasné" aplikace. Tím je celý postup u konce a na disku (a běžící v paměti) je teď již pouze modifikovaná aplikace s původním názvem. Celé to trošku připomíná jeden ze základních programátorských postupů výměny hodnot dvou proměnných, která se udělá pomocí proměnné třetí (tedy, jak možná víte, ono to jde udělat i bez pomocné proměnné, ale to teď nechme stranou). &lt;br /&gt;Celá věc má ještě několik drobných fint, které by nemusely být ze zdrojového kódu hned jasné a tak si je teď ještě musíme vysvětlit. Příklad, který naleznete v závěru článku, řeší s využitím výše popsaného postupu jednoduchou registraci uživatele. Při prvním spuštění bude uživatel požádán o vložení jeho jména. Toto jméno bude poté uloženo přímo do aplikace modifikací jejího souboru a nemusí tak být uloženo v registrech nebo INI souboru. Když bude poté taková aplikace spuštěna, "pozná" že již byla registrována a tato úvodní procedura bude přeskočena. Toto uživatelské jméno bude uloženo na samém konci souboru mezi "klíčová" slova SONAME a EONAME. Tato slova jsou tam právě proto, aby aplikace při svém znovuspuštění poznala, zda již došlo k registraci a můžete si je dle potřeby změnit. &lt;br /&gt;Znovu si tedy popišme celý postup, tentokrát již jen heslovitě: &lt;br /&gt;• aplikace je spuštěna a podle toho, zda najde na svém konci jméno uživatele mezi speciálními klíčovými slovy pozná, zda má spustit registrační proceduru nebo ne &lt;br /&gt;• pokud k registraci ještě nedošlo, uživatel je požádán o vložení jména &lt;br /&gt;• poté dojde k převedení celého souboru aplikace na string, na jehož konec bude přidáno jméno uživatele spolu s klíčovými slovy &lt;br /&gt;• tento soubor je uložen pod dočasným názvem (k originálnímu názvu je přidáno _CLONE), tato nová aplikace je spuštěna a původní se sama ukončí &lt;br /&gt;• takto vzniklý modifikovaný klon nejprve zjistí, jestli již došlo k registraci a pokud ano, snaží se zjistit, zda je klon a nebo finální program (to pozná ze svého jména)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-8788032754573201205?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8788032754573201205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8788032754573201205'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/03/tipy-triky-v-delphi.html' title='Tipy a triky v Delphi'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3842540795344371371</id><published>2008-03-04T05:40:00.000-08:00</published><updated>2008-03-04T05:44:12.534-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stav modemu'/><title type='text'>Stav modemu</title><content type='html'>Stav modemu &lt;br /&gt;I druhý dnešní tip souvisí s modemem. Tentokrát si ukážeme, jak zjistit některé jeho stavové informace. Opět je třeba specifikovat COM port a celá struktura procedury je dost podobná předchozímu příkladu. Výsledný stav je poté vypsán v jednoduchém dialogu. &lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;CommPort : string;&lt;br /&gt;hCommFile : THandle;&lt;br /&gt;ModemStat : DWord;&lt;br /&gt;begin&lt;br /&gt;CommPort := 'COM3';&lt;br /&gt;hCommFile := CreateFile(PChar(CommPort), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);&lt;br /&gt;if hCommFile = INVALID_HANDLE_VALUE then&lt;br /&gt;begin&lt;br /&gt;  ShowMessage('Nelze otevřít '+ CommPort);&lt;br /&gt;  exit;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;if GetCommModemStatus(hCommFile, ModemStat) then&lt;br /&gt;begin&lt;br /&gt;  if ModemStat and MS_CTS_ON &lt;&gt; 0 then ShowMessage('The CTS (clear-to-send) is on.');&lt;br /&gt;  if ModemStat and MS_DSR_ON &lt;&gt; 0 then ShowMessage('The DSR (data-set-ready) is on.');&lt;br /&gt;  if ModemStat and MS_RING_ON &lt;&gt; 0 then ShowMessage('The ring indicator is on.');&lt;br /&gt;  if ModemStat and MS_RLSD_ON &lt;&gt; 0 then ShowMessage('The RLSD (receive-line-signal-detect) is on.');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;CloseHandle(hCommFile);&lt;br /&gt;end; &lt;br /&gt;Zjištění stavu modemu nějaký čas zabere (u mě okolo dvou sekund), takže nepanikařte, pokud se výsledek nezobrazí ihned. Text (tedy stav), který se zobrazí jako výsledek, jsem tentokrát nepřekládal, protože by to mohlo být spíše kontraproduktivní a věřím že ti, kteří tento tip budou zkoušet, ví o co jde a dají přednost původním termínům.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3842540795344371371?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3842540795344371371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3842540795344371371'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/03/stav-modemu.html' title='Stav modemu'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-4140735792247366647</id><published>2008-02-22T14:21:00.000-08:00</published><updated>2008-02-22T14:24:13.852-08:00</updated><title type='text'></title><content type='html'>Telefonní číslo v naší ukázce následuje v příslušné proměnné za znaky ATDT a pro názornost je použito smyšlené mobilní číslo. Pro lepší použitelnost by bylo pochopitelně lepší umožnit zadávání čísla například přes Edit. Totéž se týká COM portu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-4140735792247366647?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4140735792247366647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4140735792247366647'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/02/telefonn-slo-v-na-ukzce-nsleduje-v.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-819281162148646605</id><published>2008-01-12T10:37:00.001-08:00</published><updated>2008-01-12T10:37:54.005-08:00</updated><title type='text'></title><content type='html'>var &lt;br /&gt;  hCommFile : THandle; &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject); &lt;br /&gt;var &lt;br /&gt;  PhoneNumber : string; &lt;br /&gt;  CommPort : string; &lt;br /&gt;  nw : Cardinal;&lt;br /&gt;begin&lt;br /&gt;  PhoneNumber := 'ATDT 0603123456' + #13 + #10;&lt;br /&gt;  CommPort := 'COM3';&lt;br /&gt;  hCommFile := CreateFile(PChar(CommPort), GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);&lt;br /&gt;  if hCommFile=INVALID_HANDLE_VALUE then&lt;br /&gt;  begin&lt;br /&gt;  ShowMessage('Nelze otevřít '+ CommPort);&lt;br /&gt;  exit;&lt;br /&gt;  end;&lt;br /&gt;  nw := 0;&lt;br /&gt;  if  not WriteFile(hCommFile, PChar(PhoneNumber)^, Length(PhoneNumber), nw, nil) then ShowMessage('Nelze komunikovat přes ' + CommPort);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button2Click(Sender: TObject); &lt;br /&gt;begin &lt;br /&gt;CloseHandle(hCommFile); &lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-819281162148646605?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/819281162148646605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/819281162148646605'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2008/01/var-hcommfile-thandle.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-392209530031812159</id><published>2007-12-15T04:41:00.000-08:00</published><updated>2007-12-15T04:42:27.985-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Vytočení telefonního čísla</title><content type='html'>Máte-li modem, můžete si vyzkoušet následující příklad. Ukážeme si, jak prostřednictvím modemu a jeho AT příkazů vytočit libovolné telefonní číslo a samozřejmě také jak spojení ukončit. Musíte samozřejmě toto číslo specifikovat v programu a dále je též nutné v programu určit, na jakém portu máte modem, protože v tak kratičkém příkladu pochopitelně není autodetekce. Samotný kód je jako obvykle "přilepen" na událost stisku tlačítka, přesněji řečeno dvou tlačítek. První tlačítko se pokusí vytočit číslo a navázat spojení. Nejprve zkusí otevřít příslušný COM port, poté se pokusí vytočit číslo a pokud vše proběhne v pořádku, spojení je navázáno. Druhé tlačítko slouží k ukončení "hovoru".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-392209530031812159?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/392209530031812159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/392209530031812159'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/12/vytoen-telefonnho-sla.html' title='Vytočení telefonního čísla'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-7864160813665137438</id><published>2007-12-13T03:19:00.000-08:00</published><updated>2007-12-13T03:20:05.368-08:00</updated><title type='text'></title><content type='html'>A to už se pomalu blížíme k závěru. Nyní již zbývá jen několik drobností. V okně Object Inspectoru můžete nastavit u modulu apletu několik vlastností. První je vlastnost AppletIcon, která určuje ikonu apletu, jež bude zobrazena v Ovládacích panelech. Caption zase určuje popisek, který je u ikony zobrazen. Důležitá je též položka Help, kam můžete napsat krátký popis apletu a tento text bude zobrazen v levé části okna Ovládacích panelů po označení vašeho apletu.&lt;br /&gt;Zbývá nám poslední věc a tou je testování celého projektu. Pokud jste se již při tvorbě pokusili projekt spustit, jistě se vám ukázalo chybové hlášení o nutnosti specifikovat hostitelskou aplikaci. Je to samozřejmé, protože jak již bylo řečeno na začátku, nejedná se o klasickou aplikaci, ale vlastně o knihovnu. Proto z menu Run vyberte položku Parameters. Zde v prvním řádku Host Application vyplňte c:\windows\rundll32.exe (pro systémy na bázi NT c:\winnt\system32\rundll32.exe), do druhého řádku pak shell32.dll,Control_RunDLL c:\aplet.cpl (cestu samozřejmě nastavte k vašemu apletu).&lt;br /&gt;Nyní již můžete programovat aplikaci způsobem, na který jste zvyklí. Na vizuální formulář můžete pochopitelně běžným způsobem přidávat komponenty a doplnit samotný funkční kód daného apletu. Když budete s prací hotovi, stačí výsledný soubor cpl zkopírovat do systémového adresáře Windows a po aktivaci okna Ovládacích panelů například z menu Start byste již váš aplet měli vidět.&lt;br /&gt;Celá problematika programování aplikací Ovládacích panelů je pochopitelně mnohem rozsáhlejší a lze využívat řady dalších pokročilejších funkcí. Proto berte tento dnešní tip jako spíše takový úvod do vašeho vlastního experimentování.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-7864160813665137438?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7864160813665137438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7864160813665137438'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/12/to-u-se-pomalu-blme-k-zvru.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-5873802936242537964</id><published>2007-11-24T02:52:00.001-08:00</published><updated>2007-11-24T02:52:58.595-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'></title><content type='html'>Začněme tedy pěkně od začátku. Možná víte, že tyto speciální aplikace nejsou spustitelné exe soubory, mají koncovku cpl a jedná se v podstatě od knihovny podobě jako dll. Tyto aplety se vytvářejí v Delphi poměrně snadno, i když je postup mírně odlišný od tvorby běžné aplikace. Začneme tím, že založíme nový projekt. Z menu File vybereme klasicky položku New a v zobrazeném dialogu najdeme a vybereme typ Control Panel Application. Hned si můžete všimnout, že nově vytvořené soubory se drobně liší od těch klasických aplikačních. První rozdíl je v tom, že v projektovém souboru nenajdeme klasický termín Program, ale místo toho se zde nalézá označení library. Vytvořená jednotka a její hlavní objekt pak není třídy TForm, ale TAppletModule. Proto se vám také neobjevilo obvyklé okno formuláře, na které lze umisťovat další komponenty, ale místo toho vidíte jiný typ formuláře, který je však nevizuální (tj. po spuštění apletu nebude vidět) a jeho úkolem je "pouze" zprostředkování událostí. Proto je nutné vytvořit ještě běžný typ formuláře typu TForm, který přidáme do projektu a bude vlastně tvořit samotné uživatelské rozhraní apletu. Vytvořte tedy takový formulář a odkaz na jeho jednotku musíte přidat do řádku uses u jednotky apletu. Celý kód pak tedy vypadá kupříkladu takto:&lt;br /&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, &lt;br /&gt;  CtlPanel, unit2;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TAppletModule1 = class(TAppletModule)&lt;br /&gt;    procedure AppletModuleActivate(Sender: TObject; Data: Integer);&lt;br /&gt;  private&lt;br /&gt;  { private declarations }&lt;br /&gt;  protected&lt;br /&gt;  { protected declarations }&lt;br /&gt;  public&lt;br /&gt;  { public declarations }&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  AppletModule1: TAppletModule1;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{$R *.DFM}&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;br /&gt;Nyní je potřeba zajistit, aby se po spuštění apletu tento nově přidaný formulář zobrazil. K tomu použijeme událost OnActivate modulu apletu:&lt;br /&gt;&lt;br /&gt;procedure TAppletModule1.AppletModuleActivate(Sender: TObject;  Data: Integer);&lt;br /&gt;begin&lt;br /&gt;Form2 := TForm2.Create( self );&lt;br /&gt;Form2.ShowModal;&lt;br /&gt;Form2.Free;&lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-5873802936242537964?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5873802936242537964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5873802936242537964'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/11/zanme-tedy-pkn-od-zatku.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-2828177134976008279</id><published>2007-11-13T09:35:00.000-08:00</published><updated>2007-11-13T09:36:38.691-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Ovládací panely</title><content type='html'>Jak jistě dobře víte, Ovládací panely Windows obsahují řadu různých drobných aplikací, jejichž náplní práce je nastavení vlastností všech možných částí systému od myši až po sítě a databáze. Jistě jste si také všimli, že kromě těchto základních "aplikací" (ne vždy se jedná o samostatnou aplikaci v pravém slova smyslu), které jsou nainstalovány společně se systémem, se zde po nainstalování některých dalších aplikací objeví nové ikonky. Typickým zástupcem mohou být třeba přímo Delphi, které sem umístí odkaz na BDE Administrator, ale i řada dalších programů (namátkou třeba známá Sisoft Sandra, programy od Symantecu, Adobe a další). Cokoliv tedy nějakým způsobem souvisí s nastavením systému, má své sídlo zde a pokud vytváříme aplikaci tohoto typu, jistě by bylo vhodné umístit ji rovněž sem právě v podobě aplikace pro Ovládací panely.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-2828177134976008279?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2828177134976008279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2828177134976008279'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/11/ovldac-panely.html' title='Ovládací panely'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-7015167201353139779</id><published>2007-11-12T03:57:00.000-08:00</published><updated>2007-11-12T03:58:24.676-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'></title><content type='html'>Dnešní díl bude poněkud netradiční, protože se trochu ohlédneme zpátky a uděláme si malý přehled toho, o čem jsme si až doposud povídali. Ano, je tomu již skoro přesně na den rok, co vyšel první díl našeho seriálu a tak je na čase udělat malou rekapitulaci. Přehledný obsah celého seriálu, tedy seznam všech tipů, bude náplní dnešního jubilejního dílu.&lt;br /&gt;Doufám, že vám tento přehled pomůže alespoň k částečné orientaci a lépe se vám bude hledat ten tip, který zrovna potřebujete. Mnoho z vás mě žádá, zda by nešel celý seriál zabalit, aby se dal stáhnout ve formě jednoho souboru. Tím vám sice dnes nemohu sloužit, ale uvidíme do budoucna. Zatím se spokojte alespoň s tímto seznamem. Ale dost zbytečných řečí, přehled právě začíná...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-7015167201353139779?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7015167201353139779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7015167201353139779'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/11/dnen-dl-bude-ponkud-netradin-protoe-se.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-8563249733370389820</id><published>2007-11-07T00:44:00.000-08:00</published><updated>2007-11-07T00:45:59.302-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Test rozbaleni Treeview</title><content type='html'>I druhý dnešní tip se bude týkat Treeview, konkrétně stavu jeho rozbalení. Občas se totiž může hodit informace, zda je či není celý strom kompletně rozbalen, a podle toho příslušně reagovat. Postup je tedy poměrně logický. Projdeme postupně celý strom a testujeme rozbalenost jednotlivých podvětví. K tomu nám poslouží následující jednoduchá funkce, jejímž jediným parametrem je Treeview, jehož stav nás zajímá: &lt;br /&gt;function IsExpanded(TView: TTreeview) : boolean;&lt;br /&gt;var&lt;br /&gt;Node: TTreenode;&lt;br /&gt;begin&lt;br /&gt;Assert(Assigned(TView));&lt;br /&gt;if TView.Items.Count &gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;  Node := TView.Items[0];&lt;br /&gt;  Result := True;&lt;br /&gt;  while Result and Assigned(Node) do&lt;br /&gt;    begin&lt;br /&gt;    Result := Node.Expanded or not Node.HasChildren;&lt;br /&gt;    Node := Node.GetNext;&lt;br /&gt;    end;&lt;br /&gt;  end&lt;br /&gt;  else&lt;br /&gt;    Result := False;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;if IsExpanded(TreeView1) then ShowMessage('Strom je rozbalen')&lt;br /&gt;else ShowMessage('Strom není rozbalen');&lt;br /&gt;end; &lt;br /&gt;Zajímavá může být též funkce, která testuje, zda je celý strom kompletně zabalen. Funkce pak vypadá naprosto totožně, liší se pouze v podmínce testování, která může vypadat například takto: &lt;br /&gt;Result := not (Node.Expanded and Node.HasChildren); &lt;br /&gt;O metodách FullExpand a FullCollapse, které slouží k rozbalení a opětovnému zabalení celého stromu (a souvisejí tak s našim příkladem), snad mluvit nemusím, protože je jistě dobře znáte a běžně používáte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-8563249733370389820?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8563249733370389820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8563249733370389820'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/11/test-rozbaleni-treeview.html' title='Test rozbaleni Treeview'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-374919545159066696</id><published>2007-11-03T03:00:00.000-07:00</published><updated>2007-11-03T03:01:04.767-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Blikání ikony u prvků v TreeView</title><content type='html'>TreeView je velmi oblíbeným prvkem aplikací, protože celkem přehledně dokáže zobrazit v podstatě libovolnou hierarchickou strukturu dat. Jednotlivé prvky mohou mít vlastní ikonku a právě této ikonky využijeme v našem příkladu. Často se totiž vyskytne případ, kdy je nutné na určitou položku stromu uživatele nějakým způsobem upozornit, upoutat jeho pozornost a vynutit si tak jeho odezvu. A toho docílíme například tím, že necháme ikonku u příslušného prvku blikat. &lt;br /&gt;Pro někoho to bude možná neohrabané řešení, nicméně pro tuto jednoduchou "animaci" použijeme Timer. Pochopitelně musíte mít rovněž na formuláři TreeView naplněný daty a definované příslušné ikonky pro jednotlivé prvky. Pak již stačí jen doplnit událost OnTimer: &lt;br /&gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;r: TRect;&lt;br /&gt;bNode: TTreeNode;&lt;br /&gt;ImageWidth: Integer;&lt;br /&gt;begin&lt;br /&gt;with Form1.TreeView1 do bNode := Items[Items.count - 1 ];&lt;br /&gt;with bNode do&lt;br /&gt;begin&lt;br /&gt;  ImageIndex := ImageIndex xor MaxInt;&lt;br /&gt;  SelectedIndex := SelectedIndex xor MaxInt;&lt;br /&gt;  if IsVisible then&lt;br /&gt;  begin&lt;br /&gt;    ImageWidth := TTreeView(Treeview).Images.Width;&lt;br /&gt;    r := DisplayRect(True);&lt;br /&gt;    r.Right := r.Left + ImageWidth;&lt;br /&gt;    OffsetRect(r, -ImageWidth - 4 , 0);&lt;br /&gt;    InvalidateRect(GetHandle, @r, True);&lt;br /&gt;  end;&lt;br /&gt;  end; &lt;br /&gt;end; &lt;br /&gt;Blikající prvek, označený jako bNode, je v našem případě ten úplně poslední z celého stromu. Rychlost blikání je pochopitelně ovlivněna nastavením Timeru, takže zvolte vhodný interval.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-374919545159066696?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/374919545159066696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/374919545159066696'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/11/blikn-ikony-u-prvk-v-treeview.html' title='Blikání ikony u prvků v TreeView'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-8410391486971441431</id><published>2007-11-02T07:22:00.000-07:00</published><updated>2007-11-02T07:23:39.348-07:00</updated><title type='text'></title><content type='html'>No a to je vlastně vše. Všimněte si též toho, že kvůli překreslení titulku v případě změny okna formuláře je volání umístěno v událostech OnPaint a OnResize formuláře. &lt;br /&gt;Určitě vás také napadlo, zda by nešlo klasický aplikační titulek nahradit tím naším. V podstatě ano, ale pochopitelně po drobných úpravách. Přidat ikonu či tlačítka na zavření aplikace by snad neměl být takový problém. Rovněž zamezit zobrazení originálního titulkového pruhu není samozřejmě problém. Nesmíme však zapomenout na možnost přesunutí okna, neboť za náš nový titulkový pruh se samozřejmě aplikace uchopit a přesunout nedá. Proto je potřeba "přesměrovat" možnost uchopení a přesunu právě na náš nový titulek. I o tom však již byla kdysi v našem seriálu řeč...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-8410391486971441431?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8410391486971441431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8410391486971441431'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/11/no-to-je-vlastn-ve.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-181554265201834598</id><published>2007-10-29T06:58:00.000-07:00</published><updated>2007-10-29T06:59:16.282-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'></title><content type='html'>Jak vidíte, o vykreslení se stará procedura VerticalTitleBar, která má pouze dva parametry – text zobrazovaného titulku a velikost fontu. Tyto parametry si můžeme podle potřeby celkem snadno rozšířit o další vlastnosti, které zobrazovaný titulek má. Tím je například barva titulku (v našem případě tmavě modrá - Navy), pochopitelně též barva textu i font. Samozřejmě můžete nastavit rovněž šířku (či spíše výšku) titulku, což zajistí proměnná x2, která má v našem případě hodnotu 20 bodů. Tuto šířku je pochopitelně nutné volit vzhledem k použitému fontu či přesněji řečeno velikosti použitého písma.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-181554265201834598?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/181554265201834598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/181554265201834598'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/jak-vidte-o-vykreslen-se-star-procedura.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-1533869223156691749</id><published>2007-10-25T14:26:00.000-07:00</published><updated>2007-10-25T14:27:22.649-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'></title><content type='html'>Tento náš vertikální titulkový pruh bude tedy sloužit spíše jako jakýsi informační minipanel, který může například indikovat různé stavy aplikace a podobně. Pojďme však již k samotnému kódu: &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;private&lt;br /&gt;    { Private declarations }&lt;br /&gt;    procedure VerticalTitleBar(Texto: string; Size: Integer); &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;procedure TForm1.VerticalTitleBar(TexTo: string; Size: Integer);&lt;br /&gt;var&lt;br /&gt;  LogFont: TLogFont;&lt;br /&gt;  tmpCanvas: TCanvas;&lt;br /&gt;  tmpRect: TRect;&lt;br /&gt;  x1, x2, y1, y2: integer;&lt;br /&gt;begin&lt;br /&gt;  tmpCanvas        := TCanvas.Create;&lt;br /&gt;  tmpCanvas.Handle := GetWindowDc(Handle);&lt;br /&gt;  try&lt;br /&gt;    GetObject(Canvas.Font.Handle, SizeOf(LogFont), @LogFont);&lt;br /&gt;    with LogFont do&lt;br /&gt;    begin&lt;br /&gt;      lfEscapement  := 90 * 10;&lt;br /&gt;      lfOrientation  := 90 * 10;&lt;br /&gt;      lfOutPrecision := OUT_TT_ONLY_PRECIS;&lt;br /&gt;      lfFaceName    := 'Arial';&lt;br /&gt;      lfHeight      := Size;&lt;br /&gt;      lfWeight      := FW_BOLD;&lt;br /&gt;      lfQuality      := PROOF_QUALITY;&lt;br /&gt;    end;&lt;br /&gt;    with tmpCanvas do&lt;br /&gt;    begin&lt;br /&gt;      Font.Handle := CreateFontIndirect(LogFont);&lt;br /&gt;      Font.Color  := clWhite;&lt;br /&gt;      Brush.Color := clNavy;&lt;br /&gt;    end;&lt;br /&gt;    x1 := GetSystemMetrics(SM_CXEDGE) + GetSystemMetrics(SM_CXBORDER);&lt;br /&gt;    x2 := 20;&lt;br /&gt;    y1 := GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYEDGE) + GetSystemMetrics(SM_CYBORDER) + 1;&lt;br /&gt;    y2 := Height - GetSystemMetrics(SM_CYEDGE) - GetSystemMetrics(SM_CYBORDER);&lt;br /&gt;    tmpRect := Rect(x1, y1, x2, y2);&lt;br /&gt;    tmpCanvas.FillRect(tmpRect);&lt;br /&gt;    DrawText(tmpCanvas.Handle, PChar(Texto), - 1, tmpRect, DT_BOTTOM or DT_SINGLELINE);&lt;br /&gt;  finally &lt;br /&gt;    tmpCanvas.Free; &lt;br /&gt;  end; &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormResize(Sender: TObject); &lt;br /&gt;begin &lt;br /&gt;  VerticalTitleBar('Titulek vertikálního pruhu', 12); &lt;br /&gt;end; &lt;br /&gt;&lt;br /&gt;procedure TForm1.FormPaint(Sender: TObject); &lt;br /&gt;begin &lt;br /&gt;  VerticalTitleBar('Titulek vertikálního pruhu', 12); &lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-1533869223156691749?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1533869223156691749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1533869223156691749'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/tento-n-vertikln-titulkov-pruh-bude.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-233308834825542443</id><published>2007-10-24T13:44:00.000-07:00</published><updated>2007-10-24T13:45:14.925-07:00</updated><title type='text'>Vertikální titulkový pruh</title><content type='html'>Dnes se naučíme opět trošku vylepšit vzhled našich aplikací přidáním vertikálního titulkového pruhu k levému okraji formuláře. No, vlastně to nebude titulkový pruh v pravém slova smyslu, tedy alespoň ne ten, který má každá (tedy většinou) aplikace na horním okraji formuláře. Náš titulkový pruh nebude obsahovat ikonu aplikace ani ovládací tlačítka, ale ani to by nebyl problém v případě zájmu doplnit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-233308834825542443?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/233308834825542443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/233308834825542443'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/vertikln-titulkov-pruh.html' title='Vertikální titulkový pruh'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-6033771765667059414</id><published>2007-10-23T08:23:00.000-07:00</published><updated>2007-10-23T08:24:48.235-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'></title><content type='html'>Funkce, kterou si teď ukážeme, testuje platnost zadaného ISBN, neboť toto číslo (podobně jako například rodné číslo) musí splňovat jisté parametry. Pokud tedy kupříkladu programujete nějakou databázi knih, může se vám tato funkce hodit jako kontrola vstupních dat. Za správnost algoritmu neručím, neboť nejsem jeho autorem, ale na náhodně vybraném vzorku knih v mojí knihovně vše fungovalo bez problému. Kód ISBN, který je předáván funkci jako parametr, se zadává včetně pomlček, které obsahuje.&lt;br /&gt;function IsISBN(ISBN: String): Boolean;&lt;br /&gt;var&lt;br /&gt;  Number, CheckDigit: String;&lt;br /&gt;  CheckValue, CheckSum, Err: Integer;&lt;br /&gt;  i, Cnt: Word;&lt;br /&gt;begin&lt;br /&gt;Result := False;&lt;br /&gt;CheckDigit := Copy(ISBN, Length(ISBN), 1);&lt;br /&gt;Number := Copy(ISBN, 1, Length(ISBN) - 2);&lt;br /&gt;if (Length(Number) = 11) and (Pos(CheckDigit, '0123456789X') &gt; 0) then&lt;br /&gt;begin&lt;br /&gt;  if (CheckDigit = 'X') then CheckSum := 10&lt;br /&gt;  else Val(CheckDigit, CheckSum, Err);&lt;br /&gt;  Cnt := 1;&lt;br /&gt;  for i := 1 to 12 do&lt;br /&gt;    begin&lt;br /&gt;    if (Pos(Number[i], '0123456789') &gt; 0) then&lt;br /&gt;      begin&lt;br /&gt;      Val(Number[i], CheckValue, Err);&lt;br /&gt;      CheckSum := CheckSum + CheckValue * (11 - Cnt);&lt;br /&gt;      Inc(Cnt);&lt;br /&gt;      end;&lt;br /&gt;    end;&lt;br /&gt;  if (CheckSum mod 11 = 0) then Result := True;&lt;br /&gt;end;&lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-6033771765667059414?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6033771765667059414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6033771765667059414'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/funkce-kterou-si-te-ukeme-testuje.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-6445877109047473613</id><published>2007-10-21T04:05:00.000-07:00</published><updated>2007-10-21T04:06:09.039-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Test platnosti ISBN</title><content type='html'>Tento tip nebude jistě pro každého, spíše pro velmi malou skupinku čtenářů, kteří hned bez přemýšlení vědí, co to zkratka ISBN vůbec znamená. Ne, není to žádná z nepřeberného množství počítačových zkratek. ISBN je zkratka pro mezinárodní unikátní číslo pro knihy, které se tak dají lépe strojově zpracovávat. Pokud sáhnete do své knihovny pro libovolnou knihu měla by na lícové straně vazby (nebo na jiném místě) toto číslo obsahovat. Záměrně píši "měla by obsahovat", protože nejsem žádný knihovník ani odborník na knihy, takže si nejsem jist, jestli neexistují nějaké výjimky. Z oficiálních zdrojů jsem se dozvěděl, že se tato metoda používá již 30 let, takže logicky starší knihy kód neobsahují. Zároveň některé země nemusí tento standard podporovat, takže pokud máte nějaký unikát z velmi cizokrajné a izolované země, zřejmě ani na takové knize kód nenajdete. 159 zemí civilizovaného světa však tento systém již desítky let používají.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-6445877109047473613?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6445877109047473613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6445877109047473613'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/test-platnosti-isbn.html' title='Test platnosti ISBN'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-749449096744036045</id><published>2007-10-19T04:04:00.000-07:00</published><updated>2007-10-19T04:05:22.498-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Celou věc opět řeší systém zpráv Windows.</title><content type='html'>Vytvoříme si vlastní obsluhu volání Application.OnMessage, ve které budeme poté testovat vyvolání kontextového menu a zda byla vybrána námi přidaná položka. Na základě toho bude provedena příslušná akce, což bude v našem případě prostý výpis textu.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;private&lt;br /&gt;    { Private declarations }&lt;br /&gt;    procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;const &lt;br /&gt;  SC_MyMenuItem = WM_USER + 1;&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  Application.OnMessage := OnAppMessage;&lt;br /&gt;  AppendMenu(GetSystemMenu(Application.Handle, FALSE), MF_SEPARATOR, 0, '');&lt;br /&gt;  AppendMenu(GetSystemMenu(Application.Handle, FALSE), MF_STRING, SC_MyMenuItem, '&amp;Naše položka');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);&lt;br /&gt;begin&lt;br /&gt;if (Msg.message = WM_SYSCOMMAND) and (Msg.wParam = SC_MyMenuItem) then&lt;br /&gt;begin&lt;br /&gt;  ShowMessage('Byla vybrána naše položka z menu');&lt;br /&gt;  Handled := True;&lt;br /&gt;end;&lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-749449096744036045?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/749449096744036045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/749449096744036045'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/celou-vc-opt-e-systm-zprv-windows.html' title='Celou věc opět řeší systém zpráv Windows.'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-7826301322540852123</id><published>2007-10-17T00:50:00.001-07:00</published><updated>2007-10-17T00:50:52.668-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Vlastní položky v kontextovém menu aplikace v taskbaru</title><content type='html'>U běžné aplikace je na hlavním panelu (taskbaru) zobrazena její ikona či spíše tlačítko s ikonou. Tím máme přehled o spuštěných programech a pochopitelně tak můžeme i mezi aplikacemi přepínat. Poklepáním pravým tlačítkem na toto "tlačítko" se zobrazí kontextové menu, které obsahuje podle dané aplikace rozličné obvyklé funkce jako je například Zavřít, Minimalizovat, Přesunout atd.. Menu je velmi podobné tomu, které se zobrazí po poklepání na titulkový pruh aplikace (avšak pozor, je pouze podobné, nejedná se o stejné menu). A právě do tohoto systémového menu, které se zobrazuje na hlavním panelu, se naučíme přidat vlastní položky.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-7826301322540852123?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7826301322540852123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7826301322540852123'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/vlastn-poloky-v-kontextovm-menu.html' title='Vlastní položky v kontextovém menu aplikace v taskbaru'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-8690822070200709541</id><published>2007-10-15T23:34:00.000-07:00</published><updated>2007-10-15T23:35:05.555-07:00</updated><title type='text'></title><content type='html'>Jak pojmenovat zmíněné komponenty, zjistíte snadno ze zdrojového kódu. První procedura slouží k "zakódování", druhá ke zpětnému získání textu z obrázku: &lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  x, y, i, j: Integer;&lt;br /&gt;  PixelData: TColor;&lt;br /&gt;  CharMask, CharData: Byte;&lt;br /&gt;begin&lt;br /&gt;  imgTarget.Picture.Assign(imgOrig.Picture);&lt;br /&gt;  imgDelta.Picture.Assign(imgOrig.Picture);&lt;br /&gt;  imgTarget.Picture.Bitmap.PixelFormat := pf32bit;&lt;br /&gt;  imgDelta.Picture.Bitmap.PixelFormat := pf32bit;&lt;br /&gt;  x := 0;&lt;br /&gt;  y := 0;&lt;br /&gt;  with imgTarget.Picture.Bitmap do&lt;br /&gt;    for i := 1 to Length(sourceMessage.Text) do&lt;br /&gt;    begin&lt;br /&gt;      CharMask := $80;&lt;br /&gt;      for j := 1 to 8 do&lt;br /&gt;      begin&lt;br /&gt;        CharData := Byte(sourceMessage.Text[i]) and CharMask;&lt;br /&gt;        if (CharData &lt;&gt; 0) then&lt;br /&gt;        begin&lt;br /&gt;          PixelData := Canvas.Pixels[x, y] xor $1;&lt;br /&gt;          Canvas.Pixels[x, y] := PixelData;&lt;br /&gt;        end;&lt;br /&gt;        x := (x + 1) mod imgTarget.Picture.Bitmap.Width;&lt;br /&gt;        if (x = 0) then&lt;br /&gt;        begin&lt;br /&gt;          Inc(y);&lt;br /&gt;        end;&lt;br /&gt;        CharMask := CharMask shr 1;&lt;br /&gt;      end;&lt;br /&gt;    end;&lt;br /&gt;  for y := 0 to imgOrig.Picture.Bitmap.Height -1 do&lt;br /&gt;    for x := 0 to imgOrig.Picture.Bitmap.Width -1 do&lt;br /&gt;      if (imgOrig.Picture.Bitmap.Canvas.Pixels[x, y] &lt;&gt; imgTarget.Picture.Bitmap.Canvas.Pixels[x, y]) then&lt;br /&gt;        imgDelta.Picture.Bitmap.Canvas.Pixels[x, y] := clYellow;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button2Click(Sender: TObject);&lt;br /&gt;Var&lt;br /&gt;  x, y: integer;&lt;br /&gt;  mask, ch: byte;&lt;br /&gt;begin&lt;br /&gt;  sourceMessage.Clear;&lt;br /&gt;  mask := $80;&lt;br /&gt;  ch := 0;&lt;br /&gt;  for y := 0 to imgOrig.Picture.Bitmap.Height -1 do&lt;br /&gt;  begin&lt;br /&gt;    for x := 0 to imgOrig.Picture.Bitmap.Width -1 do&lt;br /&gt;    begin&lt;br /&gt;      if (imgOrig.Picture.Bitmap.Canvas.Pixels[x, y] &lt;&gt;&lt;br /&gt;      imgTarget.Picture.Bitmap.Canvas.Pixels[x, y]) then ch := ch or mask;&lt;br /&gt;      mask := mask shr 1;&lt;br /&gt;      if mask = 0 Then&lt;br /&gt;      begin&lt;br /&gt;        Edit1.Text := Edit1.Text + char(ch);&lt;br /&gt;        mask := $80;&lt;br /&gt;        ch := 0;&lt;br /&gt;      end;&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;end; &lt;br /&gt;Jak vidíte, výsledný obrázek není uložen na disk. Toho však snadno docílíte přidáním tohoto řádku na konec první procedury: &lt;br /&gt;imgTarget.Picture.SaveToFile('c:\vyslednyobrazek.bmp'); &lt;br /&gt;Celý příklad berte spíše jako ukázkový. Je koncipován tak, abyste přímo viděli, jak daná věc funguje, a mohli experimentovat. V reálné aplikaci bude pochopitelně nutné přidat dialog pro výběr a následné uložení obrázku a také načítání vkládaného textu ze souboru.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-8690822070200709541?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8690822070200709541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8690822070200709541'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/jak-pojmenovat-zmnn-komponenty-zjistte.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3716296448552779927</id><published>2007-10-15T00:45:00.001-07:00</published><updated>2007-10-15T00:45:40.986-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'></title><content type='html'>Pojďme však již k samotné implementaci v Delphi. Příklad jsou vlastně pouze dvě procedury – události stisku dvou tlačítek. První tlačítko zakóduje do obrázku zprávu, druhé tlačítko ji dekóduje. Kromě těchto dvou tlačítek ještě umístěte na formulář 3 komponenty TImage. První bude obsahovat originální obrázek, takže jej prostřednictvím Object Inspectoru můžete rovnou do komponenty načíst. Obrázek musí být ve formátu BMP. Zbylé dvě komponenty TImage slouží k zobrazení výsledného obrázku na tzv. delta snímku, ve kterém jsou žlutou barvou zvýrazněny klíčové změněné pixely. Tento obrázek slouží pouze pro přehled a nemá žádnou praktickou funkci. Poslední věcí, kterou je třeba na formulář přidat, je komponenta, jež bude obsahovat textovou zprávu, kterou chceme do obrázku ukrýt. V našem případě bude tuto funkci plnit komponenta TEdit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3716296448552779927?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3716296448552779927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3716296448552779927'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/pojme-vak-ji-k-samotn-implementaci-v.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-6553823607778295738</id><published>2007-10-12T00:29:00.001-07:00</published><updated>2007-10-12T00:29:46.265-07:00</updated><title type='text'>Ale teď vážně.</title><content type='html'>Ukážeme si jeden jednoduchý způsob, jak tohoto efektu zakomponování textu do obrázku dosáhnout v Delphi. Na originální obrázek je namaskován zadaný text v jeho binární podobě. Při zpětném procesu (dešifrování) jsou porovnány jednotlivé pixely původního a zašifrovaného obrázku a rozdíly jsou opět zpětně "demaskovány", čímž se získají jednotlivé znaky uloženého textu. &lt;br /&gt;V tom je právě menší nevýhoda tohoto jinak velmi jednoduchého postupu – totiž nutnost mít pro dešifrování také původní originální obrázek. V praxi to pak znamená, že pochopitelně nebudete pokaždé posílat oba obrázky (tedy původní originál a obrázek s ukrytým textem), ale originální obrázek si s člověkem, se kterým chcete touto formou komunikovat, vyměníte pouze jednou. Poté už pouze posíláte obrázky s ukrytými texty. Abychom byli opravdu precizní a učinili zadost všem agentským pravidlům, můžete ještě nenápadnost vašeho počínání zvýšit tím, že budete používat obrázků více (v extrémním případě až na každý den v roce jiný obrázek). Jinak by bylo totiž značně podezřelé, kdybyste posílali stejnému člověku stále dokola tentýž obrázek.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-6553823607778295738?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6553823607778295738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6553823607778295738'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/ale-te-vn.html' title='Ale teď vážně.'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-7244627049261097068</id><published>2007-10-10T00:55:00.001-07:00</published><updated>2007-10-10T00:55:29.681-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Ukrytí textové zprávy do obrázku</title><content type='html'>Možná znáte některé programy, které vám umožní schovat do běžného obrázku textová data tak, aby byl takto získaný obrázek k nerozeznání od originálu. K čemu je to dobré? Je to jeden ze zajímavých způsobů, jak bezpečným způsobem přenášet citlivá data například prostřednictvím e-mailu. Jistě namítnete, že mnohem lepší je data šifrovat. Ano, je to jeden z účinných způsobů, ale zašifrovaná data mohou být na první pohled podezřelá a mohou lákat ke zkoušení, jak šifru prolomit. A i když se prolomení nepodaří (tak by tomu tedy alespoň v drtivé většině případů mělo být), přesto samo zjištění jiné osoby, že posíláte nějakou šifrovanou poštu, může být pro vás dostatečně kompromitující. Když ovšem pošlete e-mailem naprosto neškodný obrázek, žádné podezření to nevzbudí a vaše paranoidní duše agenta může být klidná.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-7244627049261097068?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7244627049261097068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7244627049261097068'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/ukryt-textov-zprvy-do-obrzku.html' title='Ukrytí textové zprávy do obrázku'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-5401225743551075858</id><published>2007-10-08T23:22:00.000-07:00</published><updated>2007-10-08T23:23:09.103-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Název a identifikační číslo CD disku</title><content type='html'>Na závěr tu máme jednoduchou funkci na zjišťování základních informací o vloženém CD – název a ID disku. Jako parametr se předává písmenko mechaniky CD (včetně dvojtečky). Pokud bude jako parametr předán disk jiného typu (například pevný disk či disketová mechanika), funkce vrátí prázdný řetězec. &lt;br /&gt;function GetCDInfo(WhichDrive: string): string;&lt;br /&gt;var&lt;br /&gt;  VolumeName: array[0..255] of char;&lt;br /&gt;  FileSystemType: array[0..255] of char;&lt;br /&gt;  SerialNum: DWORD;&lt;br /&gt;  MaxFilenameLength: DWORD;&lt;br /&gt;  Flags: DWORD;&lt;br /&gt;begin&lt;br /&gt;  if (GetVolumeInformation(PChar(WhichDrive), VolumeName, 256, @SerialNum, MaxFilenameLength, Flags, FileSystemType, 256)) then&lt;br /&gt;  Result := (IntToHex(SerialNum shr 16, 3) + IntToHex((SerialNum shl 16) shr 16, 4)) + ' - ' + VolumeName;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;ShowMessage(GetCDinfo('e:'));&lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-5401225743551075858?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5401225743551075858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5401225743551075858'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/nzev-identifikan-slo-cd-disku.html' title='Název a identifikační číslo CD disku'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-697484546795385389</id><published>2007-10-07T01:16:00.000-07:00</published><updated>2007-10-07T01:17:15.185-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Jak zabránit překreslení okna aplikace?</title><content type='html'>Následující tip patří opět k těm velmi krátkým, jednoduchým a velmi málo používaným. Pokud tedy z nějakého důvodu chcete zabránit systému v překreslování okna vaší aplikace, stačí použít následující příkaz: &lt;br /&gt;SendMessage(Handle, WM_SetRedraw, 0, 0); &lt;br /&gt;Pro opětovné zapnutí překreslování použijte tyto parametry: &lt;br /&gt;SendMessage(Handle, WM_SetRedraw, 1, 0); &lt;br /&gt;Až budete tento tip zkoušet, dejte si pozor, aby se vám aplikace "neztratila". Nejenže se okno nebude překreslovat (tj. pokud jej překryjete oknem jiné aplikace a poté znovu odkryjete, bude vidět plocha Windows), ale nebude ani reagovat na klikání myši. Nelze jej tak ani uchopit nebo klikat na objekty na formuláři (nehledě na to, že i kdyby se vám "nějak" podařilo myší okno uchopit, těžko byste jej díky nepřekreslování někam viditelně přenesli). Aplikace však samozřejmě reaguje na klávesnici, takže lze mezi jednotlivými prvky (i když třeba nejsou vidět) přecházet například tabulátorem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-697484546795385389?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/697484546795385389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/697484546795385389'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/jak-zabrnit-pekreslen-okna-aplikace.html' title='Jak zabránit překreslení okna aplikace?'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-1313941163201661978</id><published>2007-10-03T00:42:00.000-07:00</published><updated>2007-10-03T00:43:03.518-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'></title><content type='html'>Jednotlivé "řádky" (položky) ComboBoxu jsou identifikovány svým indexem (parametr Index), který je jako obvykle počítán od nuly. Kvůli zjednodušení příkladu je tentýž index zároveň určující pro to, který obrázek z ImageListu bude pro danou položku použit. V reálných aplikacích si pochopitelně na základě hodnoty daného řádku můžete přiřadit patřičný vhodný obrázek libovolně. &lt;br /&gt;Máte-li k dispozici Delphi verze 6 (stačí i Personal verze zdarma), pak je situace mnohem jednodušší, neboť vše řeší nová komponenta ComboBoxEx.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-1313941163201661978?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1313941163201661978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1313941163201661978'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/jednotliv-dky-poloky-comboboxu-jsou.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-4826456136630777907</id><published>2007-10-02T01:04:00.000-07:00</published><updated>2007-10-02T01:05:09.016-07:00</updated><title type='text'></title><content type='html'>Vlastní obsluha události OnDrawItem pak vypadá takto: &lt;br /&gt;procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;  Rect: TRect; State: TOwnerDrawState);&lt;br /&gt;var&lt;br /&gt;ComboBox : TComboBox;&lt;br /&gt;bitmap : TBitmap;&lt;br /&gt;begin&lt;br /&gt;ComboBox := (Control as TComboBox);&lt;br /&gt;bitmap := TBitmap.Create;&lt;br /&gt;try&lt;br /&gt;  ImageList1.GetBitmap(Index, bitmap);&lt;br /&gt;  with ComboBox.Canvas do&lt;br /&gt;  begin&lt;br /&gt;    FillRect(Rect);&lt;br /&gt;    if Bitmap.Handle &lt;&gt; 0 then Draw(Rect.Left + 2, Rect.Top, Bitmap);&lt;br /&gt;    Rect := Bounds(Rect.Left + ComboBox.ItemHeight + 2, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top);&lt;br /&gt;    DrawText(handle, PChar(ComboBox.Items[Index]), length(ComboBox.Items[index]), Rect, DT_VCENTER+DT_SINGLELINE);&lt;br /&gt;  end;&lt;br /&gt;finally&lt;br /&gt;  bitmap.Free;&lt;br /&gt;end;&lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-4826456136630777907?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4826456136630777907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/4826456136630777907'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/10/vlastn-obsluha-udlosti-ondrawitem-pak.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-2917583982212726908</id><published>2007-09-30T04:36:00.001-07:00</published><updated>2007-09-30T04:36:27.985-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Obrázkový ComboBox</title><content type='html'>Ukážeme si, jak vylepšit klasický ComboBox tím, že k jednotlivým položkám rozbaleného seznamu přiřadíme obrázky (ikonky). Každá položka pak bude mít vlevo vlastní ikonu a vedle ní bude samotný text dané položky. &lt;br /&gt;Jak toho dosáhnout? Poměrně snadno tím, že se o vykreslení budeme starat sami prostřednictvím události OnDrawItem. Nejprve je však třeba nastavit styl ComboBoxu na csOwnerDrawFixed nebo csOwnerDrawVariable (podle toho, zda budou jednotlivé řádky mít fixní či proměnlivou velikost). &lt;br /&gt;Poté naplňte ComboBox nějakými testovacími daty. Prostě několik řádků hodnot. Jednotlivé obrázky budou potom k položkám přiřazeny z ImageListu, který rovněž přidejte na formulář a pochopitelně naplňte několika (vhodně malými) obrázky.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-2917583982212726908?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2917583982212726908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2917583982212726908'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/obrzkov-combobox.html' title='Obrázkový ComboBox'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-1469902389490201157</id><published>2007-09-29T03:46:00.001-07:00</published><updated>2007-09-29T03:46:25.049-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Dále následuje část deklarace:</title><content type='html'>.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;  procedure FormCreate(Sender: TObject); &lt;br /&gt;  procedure WndProc(var Message: TMessage); override; &lt;br /&gt;  procedure Showform1Click(Sender: TObject); &lt;br /&gt;  procedure FormDestroy(Sender: TObject); &lt;br /&gt;  private &lt;br /&gt;  { Private declarations } &lt;br /&gt;  public &lt;br /&gt;  { Public declarations } &lt;br /&gt;  IconNotifyData : TNotifyIconData; &lt;br /&gt;  end; &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;. &lt;br /&gt;Procedura WndProc "odchytává" pokus o minimalizaci aplikace a zařídí její minimalizaci do ikony hlavního panelu. Zároveň se stará o reakce na kliknutí myší na ikonu – buď aplikaci obnoví nebo zobrazí PopupMenu. &lt;br /&gt;procedure TForm1.WndProc(var Message: TMessage); &lt;br /&gt;var &lt;br /&gt;  p : TPoint; &lt;br /&gt;begin &lt;br /&gt;  case Message.Msg of &lt;br /&gt;  WM_SYSCOMMAND: &lt;br /&gt;    case Message.WParam and $FFF0 of &lt;br /&gt;      SC_MINIMIZE:&lt;br /&gt;        begin &lt;br /&gt;        Hide; &lt;br /&gt;        Exit; &lt;br /&gt;        end; &lt;br /&gt;      SC_RESTORE: ; &lt;br /&gt;    end; &lt;br /&gt;  WM_USER + 1: &lt;br /&gt;    case Message.lParam of &lt;br /&gt;      WM_RBUTTONDOWN:&lt;br /&gt;        begin &lt;br /&gt;        GetCursorPos(p); &lt;br /&gt;        PopupMenu1.Popup(p.x, p.y); &lt;br /&gt;        end; &lt;br /&gt;      WM_LBUTTONDOWN:&lt;br /&gt;        begin &lt;br /&gt;        Show; &lt;br /&gt;        end; &lt;br /&gt;    end; &lt;br /&gt;  end; &lt;br /&gt;  inherited ; &lt;br /&gt;end; &lt;br /&gt;&lt;br /&gt;procedure TForm1.FormCreate(Sender: TObject); &lt;br /&gt;begin &lt;br /&gt;with IconNotifyData do&lt;br /&gt;begin &lt;br /&gt;  hIcon := Application.Icon.Handle; &lt;br /&gt;  uCallbackMessage := WM_USER + 1; &lt;br /&gt;  cbSize := sizeof(IconNotifyData); &lt;br /&gt;  Wnd := Handle; &lt;br /&gt;  uID := 100; &lt;br /&gt;  uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP; &lt;br /&gt;  end; &lt;br /&gt;  StrPCopy(IconNotifyData.szTip, Application.Title); &lt;br /&gt;  Shell_NotifyIcon(NIM_ADD, @IconNotifyData); &lt;br /&gt;  Application.ShowMainForm := False; &lt;br /&gt;  SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); &lt;br /&gt;end; &lt;br /&gt;&lt;br /&gt;procedure TForm1.Showform1Click(Sender: TObject); &lt;br /&gt;begin &lt;br /&gt;  Show; &lt;br /&gt;  SetForegroundWindow(Self.handle); &lt;br /&gt;end; &lt;br /&gt;&lt;br /&gt;procedure TForm1.FormDestroy(Sender: TObject); &lt;br /&gt;begin &lt;br /&gt;  Shell_NotifyIcon(NIM_DELETE, @IconNotifyData); &lt;br /&gt;end; &lt;br /&gt;Jako text bublinkové nápovědy u ikony je použit titulek aplikace – viz řádek StrPCopy(IconNotifyData... v události OnCreate hlavního formuláře, ale můžete jej pochopitelně libovolně měnit. &lt;br /&gt;Jak vidíte, přidat si ikonku na hlavní panel není složité ani pracné. I když je tento příklad velmi jednoduchý a má sloužit spíše jako ukázka, základní funkce plní. Přidat některá další vylepšení však není problém. Pokud tedy místo použití hotových komponent dáváte přednost vlastní tvorbě, račte experimentovat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-1469902389490201157?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1469902389490201157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1469902389490201157'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/dle-nsleduje-st-deklarace.html' title='Dále následuje část deklarace:'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-2518222549492566073</id><published>2007-09-28T02:20:00.000-07:00</published><updated>2007-09-28T02:21:05.231-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'></title><content type='html'>Dost ale zbytečných a nudných úvodů a pojďme k našemu příkladu. Po jeho spuštění bude aplikace ihned minimalizována, nebude vidět na hlavním panelu vedle tlačítka Start a zároveň se vedle hodin zobrazí příslušná ikonka. Po kliknutí na ni levým tlačítkem myši bude aplikace opět maximalizována (či přesněji řečeno, bude obnoveno hlavní okno do původního stavu), po kliknutí pravým tlačítkem se zobrazí kontextové menu. &lt;br /&gt;Ještě je třeba upozornit, že budeme potřebovat knihovnu ShellAPI, takže ji nezapomeňte přidat do projektu. Vytvořte tedy nový projekt, přidejte zmíněnou knihovnu a také přidejte PopupMenu, v němž si můžete nadefinovat zcela libovolné položky (slouží pouze pro demonstraci).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-2518222549492566073?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2518222549492566073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2518222549492566073'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/dost-ale-zbytench-nudnch-vod-pojme-k.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-7001605571477549890</id><published>2007-09-26T11:08:00.000-07:00</published><updated>2007-09-26T11:09:06.986-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Ikona aplikace v hlavním panelu - tray icon</title><content type='html'>Jistě dobře víte, že řada aplikací se po svém spuštění "usídlí" v hlavním panelu vedle hodin v podobě malé ikonky. Obvykle se jedná o aplikace, které běží již od startu systému a vykonávají na pozadí nějaké funkce (antivirový program či různé další utility). Nevyžadují žádnou zvláštní pozornost uživatele a jejich hlavní okno by se tedy na ploše jen zbytečně pletlo. Zároveň však musí být jejich funkce občas přístupné a nebo je alespoň třeba indikovat, že daná aplikace běží. K tomu se právě ideálně hodí místo vedle hodin na hlavním panelu – tray. Tolik tedy teorie, ale praxe je bohužel trochu jiná, což sami jistě velmi dobře víte. Ikonu se na toto místo snaží "nacpat" kdejaká aplikace, takže někdy jich tam má uživatel slušnou řádku. Proto mi dovolte, ještě než si ukážeme jak touto ikonkou naše aplikace opatřit, jedno malé doporučení: dávat ikonu do hlavního panelu jen tehdy, když to má smysl (a ne proto, abyste ukázali, že to umíte). Také je dobré, aby o zobrazení či nezobrazení ikony mohl rozhodnout uživatel v nastavení programu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-7001605571477549890?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7001605571477549890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/7001605571477549890'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/ikona-aplikace-v-hlavnm-panelu-tray.html' title='Ikona aplikace v hlavním panelu - tray icon'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-8027299957861623497</id><published>2007-09-24T00:48:00.001-07:00</published><updated>2007-09-24T00:48:36.853-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Spuštění aplikace pouze jednou v rámci dané instance Windows</title><content type='html'>Poněkud krkolomný nadpis, uznávám. Ale hned si vysvětlíme, oč se jedná. Vzpomínáte si, jak jsme si kdysi ukazovali, jak zamezit několikanásobnému spuštění aplikace? Tento příklad zase zajistí, že vaše aplikace bude spustitelná pouze jednou během aktuálního běhu Windows. Pokud bude někdo chtít vaši aplikaci spustit podruhé, bude muset nejprve Windows restartovat. K tomu nám poslouží funkce GlobalAddAtom a GlobalFindAtom. Využití tohoto příkladu ponechám na vás, jistě sami na něco přijdete. &lt;br /&gt;procedure TForm1.FormShow(Sender : TObject); &lt;br /&gt;var &lt;br /&gt;Atom : integer; &lt;br /&gt;begin &lt;br /&gt;if GlobalFindAtom('TEXT_IDENTIFIKUJICI_NASI_APLIKACI') = 0 then Atom := GlobalAddAtom('TEXT_IDENTIFIKUJICI_NASI_APLIKACI')&lt;br /&gt;else&lt;br /&gt;  begin&lt;br /&gt;  ShowMessage('Tato aplikace může být spuštěna pouze jednou za běhu Windows. Pro opětovné spuštění je třeba Windows restartovat'); &lt;br /&gt;  Close; &lt;br /&gt;  end; &lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-8027299957861623497?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8027299957861623497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8027299957861623497'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/sputn-aplikace-pouze-jednou-v-rmci-dan.html' title='Spuštění aplikace pouze jednou v rámci dané instance Windows'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-8052923535355426376</id><published>2007-09-22T12:59:00.000-07:00</published><updated>2007-09-22T13:00:02.511-07:00</updated><title type='text'></title><content type='html'>Jak vidíte, zobrazení nápovědy je kvůli zjednodušení vyvoláno po stisku tlačítka, což není právě praktické, doplnit si zobrazování po najetí myší vám ovšem nechám za domácí úkol. Ale zpět k samotnému zobrazení. Nejprve je třeba u daného tlačítka vyplnit položku Hint, protože odtud je text brán. Také by bylo dobré deaktivovat původní hint (ShowHint := false), aby se nám nezobrazovaly nápovědy dvě. &lt;br /&gt;Samotné parametry "okna" nápovědy si můžete upravit jednak přímo v události OnCreate hlavního formuláře, kde je nastaveno několik základních vizuálních vlastností. Zbytek najdete přímo v proceduře ShowAHint, která má čtyři parametry – souřadnice, kde se má nápověda zobrazit, text nápovědy a dobu, po jakou bude nápověda zobrazena. Velikost okna nápovědy (tedy vlastně Panelu) je upravena podle velikosti zobrazovaného textu, ale nic vám nebrání si velikost přizpůsobit. Rovněž si můžete sami upravit vlastnosti, jako je barva podkladu nápovědy (v našem příkladu zvolena dost kontrastní barva Lime) či barvu a parametry samotného textu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-8052923535355426376?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8052923535355426376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8052923535355426376'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/jak-vidte-zobrazen-npovdy-je-kvli.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-36752668587828837</id><published>2007-09-21T00:39:00.000-07:00</published><updated>2007-09-21T00:50:37.520-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>A ještě jednou bublinková nápověda</title><content type='html'>A znovu tu máme téma bublinkové nápovědy. Tentokrát si vytvoříme přímo vlastní bublinkovou nápovědu (Hint), a to prostřednictvím komponenty Panel. Umístěte ji tedy na formulář. O její vlastnosti se nemusíte starat, budou měněny přímo programově. Dále bude potřeba jeden Timer, abychom náš Hint zobrazili na požadovaný časový interval. Poté si ještě na formulář umístěte jedno tlačítko, na kterém budeme funkčnost příkladu demonstrovat. &lt;br /&gt;A nyní již samotný kód: &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;private&lt;br /&gt;    { Private declarations }&lt;br /&gt;    procedure ShowAHint(x: integer; y: integer; Caption: string; Duration: LongInt);&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormCreate(Sender: TObject); &lt;br /&gt;begin &lt;br /&gt;  Timer1.Enabled := false; &lt;br /&gt;  Panel1.Visible := false; &lt;br /&gt;  Panel1.BevelInner := bvNone; &lt;br /&gt;  Panel1.BevelOuter := bvNone; &lt;br /&gt;  Panel1.BorderStyle := bsSingle;  &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.ShowAHint(x : integer; y : integer; Caption : string; Duration : LongInt);&lt;br /&gt;var&lt;br /&gt;  dc : hdc;&lt;br /&gt;  OldFont : hFont;&lt;br /&gt;  pt : TSize;&lt;br /&gt;  p : pChar;&lt;br /&gt;begin&lt;br /&gt;  if Timer1.Enabled &lt;&gt; false then Timer1.Enabled := false;&lt;br /&gt;  Timer1.Enabled := false;&lt;br /&gt;  if Panel1.Visible &lt;&gt; false then Panel1.Visible := false;&lt;br /&gt;  if Caption = '' then exit;&lt;br /&gt;  Panel1.Caption := caption;&lt;br /&gt;  GetMem(p, Length(Panel1.Caption) + 1);&lt;br /&gt;  StrPCopy(p, Panel1.Caption);&lt;br /&gt;  dc := GetDc(Panel1.Handle);&lt;br /&gt;  OldFont := SelectObject(dc, Panel1.Font.Handle); &lt;br /&gt;  GetTextExtentPoint32(dc, p, Length(Panel1.Caption), pt); &lt;br /&gt;  SelectObject(dc, OldFont); &lt;br /&gt;  ReleaseDc(Panel1.Handle, Dc); &lt;br /&gt;  FreeMem(p, Length(Panel1.Caption) + 1); &lt;br /&gt;  Panel1.Left := x;&lt;br /&gt;  Panel1.Top := y;&lt;br /&gt;  Panel1.Width := pt.cx + 6; &lt;br /&gt;  Panel1.Height := pt.cy + 2;&lt;br /&gt;  Panel1.Color:= clLime; &lt;br /&gt;  Panel1.Font.Color := clBlue;&lt;br /&gt;  Panel1.Visible := true;&lt;br /&gt;  Timer1.Interval := Duration; &lt;br /&gt;  Timer1.Enabled := true; &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Timer1Timer(Sender: TObject);&lt;br /&gt;begin &lt;br /&gt;  if Panel1.Visible &lt;&gt; false then &lt;br /&gt;  Panel1.Visible := false; &lt;br /&gt;  Timer1.Enabled := false; &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;Application.ProcessMessages;&lt;br /&gt;ShowAHint(Button1.Left, Button1.Top + Button1.Height + 6, Button1.Hint, 2000);&lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-36752668587828837?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/36752668587828837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/36752668587828837'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/jet-jednou-bublinkov-npovda.html' title='A ještě jednou bublinková nápověda'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3978833948793002921</id><published>2007-09-11T23:54:00.000-07:00</published><updated>2007-09-11T23:55:58.991-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Proto ji umístěte na formulář</title><content type='html'>a dále vyplňte parametr FileName, který určuje název souboru, jehož první snímek chceme zobrazit. Nyní již stačí přidat tento jednoduchý kód a první snímek se zobrazí v okně MediaPlayeru: &lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject); &lt;br /&gt;begin &lt;br /&gt;Application.ProcessMessages; &lt;br /&gt;MediaPlayer1.Open; &lt;br /&gt;Application.ProcessMessages; &lt;br /&gt;MediaPlayer1.Step; &lt;br /&gt;Application.ProcessMessages;&lt;br /&gt;MediaPlayer1.Previous; &lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3978833948793002921?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3978833948793002921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3978833948793002921'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/proto-ji-umstte-na-formul.html' title='Proto ji umístěte na formulář'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-131397488362100043</id><published>2007-09-11T01:47:00.000-07:00</published><updated>2007-09-11T01:48:30.112-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Zobrazení prvního snímku videa</title><content type='html'>Pokud potřebujete vytvořit pouhý náhled a ne přehrát celé video, obvykle se k tomu používá první snímek, i když zrovna z prvního snímku nemusí být vždy zřejmé, oč se jedná. K jeho zobrazení použijeme komponentu MediaPlayer, čímž nám odpadne starost o všechny záležitosti související s prací se samotným video souborem. Můžeme tak zobrazit první snímek (frame) z téměř libovolného formátu videa, tedy přesněji řečeno z těch formátů, jejichž kodeky máme v systému nainstalovány. A o práci s nimi se právě postará komponenta MediaPlayer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-131397488362100043?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/131397488362100043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/131397488362100043'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/zobrazen-prvnho-snmku-videa.html' title='Zobrazení prvního snímku videa'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-6516540402691034363</id><published>2007-09-09T23:15:00.000-07:00</published><updated>2007-09-09T23:16:10.381-07:00</updated><title type='text'></title><content type='html'>Funkce NewWindowProc se vlastně stará o celé řízení samotného psaní textu, stará se o reakce na focus a na stisknutí kláves. Jako kurzor (či spíše kurzory – viz dále) se používá "obrázek", vytvořený v události OnCreate hlavního formuláře. Ta má dvě části, které jsou pro přehlednost odděleny čárou. První část popisuje vizuální podobu kurzoru při psaní textu, druhá část zase stejným způsobem nastavuje podobu kurzoru při mazání textu klávesou Backspace. &lt;br /&gt;A jak tedy celý výsledek vypadá? Kurzor je jednak vykreslen ve tvaru "kostičky" a jako třešnička na dortu (a spíše z důvodů demonstračních než pro reálné použití) se na něm zobrazuje během psaní smějící se "smajlík" ze znakové sady WingDings. V případě mazání textu klávesou Backspace se smajlík změní na zamračeného. &lt;br /&gt;Myslím, že princip samotné tvorby kurzoru je dostatečně zřejmý, takže se nebojte experimentování.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-6516540402691034363?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6516540402691034363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/6516540402691034363'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/funkce-newwindowproc-se-vlastn-star-o.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-8298939280322781199</id><published>2007-09-09T01:28:00.000-07:00</published><updated>2007-09-09T01:29:08.152-07:00</updated><title type='text'>Další vylepšení komponenty Edit</title><content type='html'>A máme tu další vylepšení komponenty Edit. Abych se přiznal, jako odchovanec osmibitových počítačů a dalších podobných staříků jsem měl moc rád, když kurzor při zadávání textu měl podobu blikajícího čtverečku a ve Windows (a dalších systémech) používaná svislá "čárka" se mi moc nelíbí. Ukážeme si teď, jak u komponenty Edit tento svislý a poněkud nudný kurzor změnit. &lt;br /&gt;Umístěte si tedy na formulář nějaký EditBox a pak přidejte následující kód: &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;public &lt;br /&gt;  { Public declarations } &lt;br /&gt;  CaretBm : TBitmap; &lt;br /&gt;  CaretBmBk : TBitmap; &lt;br /&gt;  OldEditsWindowProc : Pointer;&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;type&lt;br /&gt;  WParameter = LongInt;&lt;br /&gt;  LParameter = LongInt;&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;function NewWindowProc(WindowHandle : hWnd; TheMessage : WParameter; ParamW : WParameter; ParamL : LParameter) : LongInt stdcall;&lt;br /&gt;begin&lt;br /&gt;  NewWindowProc := CallWindowProc(Form1.OldEditsWindowProc, WindowHandle, TheMessage, ParamW, ParamL);&lt;br /&gt;  if TheMessage = WM_SETFOCUS then&lt;br /&gt;  begin&lt;br /&gt;  CreateCaret(WindowHandle, Form1.CaretBm.Handle, 0, 0);&lt;br /&gt;  ShowCaret(WindowHandle);&lt;br /&gt;  end;&lt;br /&gt;  if TheMessage = WM_KILLFOCUS then&lt;br /&gt;  begin&lt;br /&gt;  HideCaret(WindowHandle);&lt;br /&gt;  DestroyCaret;&lt;br /&gt;  end;&lt;br /&gt;  if TheMessage = WM_KEYDOWN then&lt;br /&gt;  begin&lt;br /&gt;  if ParamW = VK_BACK then&lt;br /&gt;    CreateCaret(WindowHandle, Form1.CaretBmBk.Handle, 0, 0) else&lt;br /&gt;    CreateCaret(WindowHandle, Form1.CaretBm.Handle, 0, 0);&lt;br /&gt;  ShowCaret(WindowHandle);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  CaretBm := TBitmap.Create;&lt;br /&gt;  CaretBm.Canvas.Font.Name := 'WingDings';&lt;br /&gt;  CaretBm.Canvas.Font.Height := Edit1.Font.Height;&lt;br /&gt;  CaretBm.Canvas.Font.Color := clWhite;&lt;br /&gt;  CaretBm.Width := CaretBm.Canvas.TextWidth('J') + 2;&lt;br /&gt;  CaretBm.Height := CaretBm.Canvas.TextHeight('J') + 2;&lt;br /&gt;  CaretBm.Canvas.Brush.Color := clBlue;&lt;br /&gt;  CaretBm.Canvas.FillRect(Rect(0, 0, CaretBm.Width, CaretBm.Height));&lt;br /&gt;  CaretBm.Canvas.TextOut(1, 1, 'J');&lt;br /&gt;{-----------------------------------------------------------------}&lt;br /&gt;&lt;br /&gt;  CaretBmBk := TBitmap.Create;&lt;br /&gt;  CaretBmBk.Canvas.Font.Name := 'WingDings';&lt;br /&gt;  CaretBmBk.Canvas.Font.Height := Edit1.Font.Height;&lt;br /&gt;  CaretBmBk.Canvas.Font.Color := clWhite;&lt;br /&gt;  CaretBmBk.Width := CaretBmBk.Canvas.TextWidth('L') + 2;&lt;br /&gt;  CaretBmBk.Height := CaretBmBk.Canvas.TextHeight('L') + 2;&lt;br /&gt;  CaretBmBk.Canvas.Brush.Color := clBlue;&lt;br /&gt;  CaretBmBk.Canvas.FillRect(Rect(0, 0, CaretBmBk.Width, CaretBmBk.Height));&lt;br /&gt;  CaretBmBk.Canvas.TextOut(1, 1, 'L');&lt;br /&gt;  OldEditsWindowProc := Pointer(SetWindowLong(Edit1.Handle, GWL_WNDPROC, LongInt(@NewWindowProc)));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;SetWindowLong(Edit1.Handle, GWL_WNDPROC, LongInt(OldEditsWindowProc));&lt;br /&gt;CaretBm.Free;&lt;br /&gt;CaretBmBk.Free;&lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-8298939280322781199?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8298939280322781199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/8298939280322781199'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/dal-vylepen-komponenty-edit.html' title='Další vylepšení komponenty Edit'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-2038748202223867172</id><published>2007-09-06T13:42:00.000-07:00</published><updated>2007-09-06T13:43:54.533-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Změna obrázku tlačítka Start</title><content type='html'>Už dlouho jsme se nepokoušeli nějak "potrápit" Windows, takže si to tímto tipem zase trošku vynahradíme. Změna obrázku na tlačítku Start sice není dvakrát užitečná záležitost, ale proč se trošku nepobavit. &lt;br /&gt;Nejprve si vytvořte vhodný obrázek patřičných rozměrů (mně se osvědčily rozměry přibližně 48 x 16 pixelů) a pak již stačí jen použít následující kód: &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;private&lt;br /&gt;    { Private declarations }&lt;br /&gt;      StartButton : hWnd;&lt;br /&gt;      OldBitmap : THandle;&lt;br /&gt;      NewImage : TPicture;&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;NewImage := TPicture.Create;&lt;br /&gt;NewImage.LoadFromFile('start.bmp');&lt;br /&gt;StartButton := FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil);&lt;br /&gt;OldBitmap := SendMessage(StartButton, BM_SetImage, 0, NewImage.Bitmap.Handle);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.FormDestroy(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;    try&lt;br /&gt;        SendMessage(StartButton, BM_SetImage, 0, OldBitmap);&lt;br /&gt;        NewImage.Free;&lt;br /&gt;    except end;&lt;br /&gt;end; &lt;br /&gt;Změna obrázku je opět vyvolána jako událost stisku tlačítka, a abychom nebyli na Windows tak zlí, po ukončení příkladu se vše vrátí do původního stavu v události OnDestroy formuláře. &lt;br /&gt;Nutno připomenout, že Windows se brání seč můžou a tento příklad bude fungovat jen na "starší generaci", tj. Windows 9x. Pod Windows NT/2000 se zobrazí pouze prázdné tlačítko.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-2038748202223867172?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2038748202223867172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2038748202223867172'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/zmna-obrzku-tlatka-start.html' title='Změna obrázku tlačítka Start'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-1546685716962269189</id><published>2007-09-05T23:23:00.000-07:00</published><updated>2007-09-05T23:24:05.084-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Úprava fontu bublinkové nápovědy</title><content type='html'>Bublinkovou nápovědou (Hint) jsme se již zabývali mnohokrát. Ukázali jsme si, jak se dá nastavit doba, po jaké se má objevit, barva a další parametry. Nyní si ukážeme vlastně poslední z chybějících nastavení a to je druh písma nápovědy. &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;implementation &lt;br /&gt;&lt;br /&gt;{$R *.DFM} &lt;br /&gt;&lt;br /&gt;Type &lt;br /&gt;  TMyHintWindow = Class (THintWindow) &lt;br /&gt;  Constructor Create (AOwner: TComponent); override; &lt;br /&gt;  end; &lt;br /&gt;&lt;br /&gt;Constructor TMyHintWindow.Create (AOwner: TComponent); &lt;br /&gt;Begin &lt;br /&gt;  Inherited Create (Aowner); &lt;br /&gt;  Canvas.Font.Name := 'Verdana';&lt;br /&gt;  Canvas.Font.Style:= [fsBold]; &lt;br /&gt;  Canvas.Font.Size := 18; &lt;br /&gt;  end; &lt;br /&gt;&lt;br /&gt;procedure TForm1.FormCreate(Sender: TObject); &lt;br /&gt;begin &lt;br /&gt;  Application.ShowHint := False; &lt;br /&gt;  HintWindowClass := TMyHintWindow; &lt;br /&gt;  Application.ShowHint := True; &lt;br /&gt;end; &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;. &lt;br /&gt;Takto dosáhneme velkého a tučného fontu. Pravda, pro použití v reálu je poněkud nevhodný, ale jako ukázka ideální a vy si již určitě najdete vhodnou kombinaci. Někteří uživatelé jistě ocení, pokud jim nabídnete možnost zvolit si i takovýto drobný detail v nastavení aplikace.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-1546685716962269189?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1546685716962269189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1546685716962269189'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/prava-fontu-bublinkov-npovdy.html' title='Úprava fontu bublinkové nápovědy'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-2852238341774121601</id><published>2007-09-02T22:52:00.001-07:00</published><updated>2007-09-02T22:52:40.494-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'></title><content type='html'>Když nyní projekt znovu zkompilujete, komponenta ListView už bude fungovat pod Windows XP bez problémů a většina potenciálních problémů je tak vyřešena. Zkompilovanou knihovnu (soubor comctrls.dcu) můžete poté zkopírovat do složky Lib a přepsat tak originální knihovnu, aby tato upravená verze byla použita i ve všech dalších projektech.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-2852238341774121601?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2852238341774121601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/2852238341774121601'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/kdy-nyn-projekt-znovu-zkompilujete.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3501838325318072082</id><published>2007-09-02T02:32:00.000-07:00</published><updated>2007-09-02T02:33:22.933-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'></title><content type='html'>Soubor si nakopírujte do složky s vaší aplikací, otevřete jej a najděte si proceduru TCustomListView.UpdateColumn, kterou upravte podle tohoto vzoru (stačí, když celou původní proceduru přepíšete tou, která je uvedena níže, neboť je kompletní): &lt;br /&gt;procedure TCustomListView.UpdateColumn(AnIndex: Integer);&lt;br /&gt;const IAlignment: array[Boolean, TAlignment] of LongInt =&lt;br /&gt;  ((LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_CENTER),&lt;br /&gt;  (LVCFMT_RIGHT, LVCFMT_LEFT, LVCFMT_CENTER));&lt;br /&gt;var&lt;br /&gt;  Column: TLVColumn;&lt;br /&gt;  AAlignment: TAlignment;&lt;br /&gt;begin&lt;br /&gt;  if HandleAllocated then&lt;br /&gt;    with Column, Columns.Items[AnIndex] do&lt;br /&gt;    begin&lt;br /&gt;mask := LVCF_TEXT or LVCF_FMT;&lt;br /&gt;if FImageIndex &gt;= 0 then mask := mask or LVCF_IMAGE;&lt;br /&gt;      iImage := FImageIndex;&lt;br /&gt;      pszText := PChar(Caption);&lt;br /&gt;      AAlignment := Alignment;&lt;br /&gt;      if Index &lt;&gt; 0 then&lt;br /&gt;        fmt := IAlignment[UseRightToLeftAlignment, AAlignment]&lt;br /&gt;      else fmt := LVCFMT_LEFT;&lt;br /&gt;      if FImageIndex &lt;&gt; -1 then&lt;br /&gt;        fmt := fmt or LVCFMT_IMAGE or LVCFMT_COL_HAS_IMAGES;&lt;br /&gt;      if WidthType &gt; ColumnTextWidth then&lt;br /&gt;      begin&lt;br /&gt;        mask := mask or LVCF_WIDTH;&lt;br /&gt;        cx := FWidth;&lt;br /&gt;        ListView_SetColumn(Handle, Columns[AnIndex].FOrderTag, Column);&lt;br /&gt;      end&lt;br /&gt;      else begin&lt;br /&gt;        ListView_SetColumn(Handle, Columns[AnIndex].FOrderTag, Column);&lt;br /&gt;      if ViewStyle = vsList then&lt;br /&gt;          ListView_SetColumnWidth(Handle, -1, WidthType)&lt;br /&gt;      else if (ViewStyle = vsReport) and not OwnerData then&lt;br /&gt;          ListView_SetColumnWidth(Handle, Columns[AnIndex].FOrderTag, WidthType);&lt;br /&gt;      end;&lt;br /&gt;    end;&lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3501838325318072082?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3501838325318072082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3501838325318072082'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/09/soubor-si-nakoprujte-do-sloky-s-va.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-5578522566040956860</id><published>2007-08-31T23:18:00.001-07:00</published><updated>2007-08-31T23:18:59.592-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'></title><content type='html'>Za jednu z nejvážnějších jsem tehdy označil chybu v komponentě ListView, kdy při použití stylu vsReport a nedefinování hlavičky jednotlivých sloupců (nebo i jednoho sloupce) se při spuštění aplikace pod Windows XP okamžitě zhroutí. Jak z toho tedy ven? Aktualizace vydané Borlandem bohužel věc neřeší, takže si v tomto konkrétním případě pomůžeme sami úpravou knihovny Comctrls, jejíž zdrojový kód (tedy soubor comctrls.pas) byste měli najít ve složce {Delphi}\Source\Vcl.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-5578522566040956860?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5578522566040956860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/5578522566040956860'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/08/za-jednu-z-nejvnjch-jsem-tehdy-oznail.html' title=''/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3136219013827514061</id><published>2007-08-30T00:05:00.000-07:00</published><updated>2007-08-30T00:06:13.935-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Úprava knihovny Comctrls pro použití ve Windows XP</title><content type='html'>Před časem  jsme se zabývali použitím vizuálních stylů ve Windows XP. Jistě si vzpomenete na jednoduchý postup, kterým jsme použití stylů do aplikace zakomponovali prostřednictvím souboru manifestu. Možná si také vzpomenete, že tato poměrně jednoduchá akce ale nebyla nakonec úplně bez komplikací, protože VCL knihovna Delphi obsahuje několik chyb, které se za určitých okolností projeví pádem aplikace pod Windows XP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3136219013827514061?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3136219013827514061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3136219013827514061'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/08/prava-knihovny-comctrls-pro-pouit-ve.html' title='Úprava knihovny Comctrls pro použití ve Windows XP'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-3631376494229349353</id><published>2007-08-28T00:16:00.001-07:00</published><updated>2007-08-28T00:16:45.215-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>A na závěr</title><content type='html'>nám zůstává mazání jednotlivých položek, což bude asi mnohem častější činnost než mazání celých sekcí. Dá se celkem snadno předpokládat, že funkce bude mít dva parametry – sekci a položku, kterou chceme mazat. Jedná se o funkci DeleteKey a příklad máte zde: &lt;br /&gt;procedure TForm1.Button6Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;INISoubor: TIniFile;&lt;br /&gt;begin&lt;br /&gt;INISoubor := TIniFile.Create('c:\pokus.ini');&lt;br /&gt;INISoubor.DeleteKey('První sekce','Polozka5');&lt;br /&gt;INISoubor.Free;&lt;br /&gt;end; &lt;br /&gt;Jak vidíte, práce s INI soubory je velmi jednoduchá, připravené funkce v Delphi zvládají všechny hlavní činnosti a jejich použití je bezproblémové. Neváhejte tedy a zkuste někdy místo registrů ukládat aplikační data do INI souboru. Uvidíte, že to není zase až tak zastaralá "technologie".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-3631376494229349353?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3631376494229349353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/3631376494229349353'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/08/na-zvr.html' title='A na závěr'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-15451656.post-1909412067318040762</id><published>2007-08-26T02:13:00.000-07:00</published><updated>2007-08-26T02:14:11.502-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Zbývá nám naučit se,</title><content type='html'>jak jednotlivé sekce či položky z INI souboru vymazat. Potřebujete-li hromadně smazat celou jednu sekci včetně všech jejích položek a hodnot, slouží k tomuto účelu funkce EraseSection. Ta danou sekci se souboru vymaže a soubor hezky upraví tak, aby mezi jednotlivými sekcemi byl opět vždy jeden prázdný řádek a nevznikaly nějaké mezery navíc. Pokud se pokusíte smazat neexistující sekci, nic se nestane. Nic se pochopitelně nesmaže, ale tento pokus nevyvolá ani chybu v programu. Obdobně "čistě" se chovají i ostatní již zmíněné funkce. Zde je tedy příklad: &lt;br /&gt;procedure TForm1.Button5Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;INISoubor: TIniFile;&lt;br /&gt;begin&lt;br /&gt;INISoubor := TIniFile.Create('c:\pokus.ini');&lt;br /&gt;INISoubor.EraseSection('První sekce');&lt;br /&gt;INISoubor.Free;&lt;br /&gt;end;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15451656-1909412067318040762?l=html-jazyk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1909412067318040762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15451656/posts/default/1909412067318040762'/><link rel='alternate' type='text/html' href='http://html-jazyk.blogspot.com/2007/08/zbv-nm-nauit-se.html' title='Zbývá nám naučit se,'/><author><name>pantheon</name><uri>http://www.blogger.com/profile/17142884013631004295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
