Delphi┌vodem |
|
┌vodem | Soubory ke sta₧enφ |
|
Tak ·vod (tφm mßm na mysli minulΘ Φφslo) mßme za sebou a p°ed nßmi je p°echod na "standardnφ" menu. Tak₧e co bude dnes na jφdelnφΦku. Nejprve se podφvßme letem sv∞tem na jeden velmi kvalitnφ nßstroj pro prost°edφ Delphi. Dßle si povφme o tak trochu podce≥ovanΘm algoritmu, p°idßme op∞t pßr Delphi-odkaz∙ a nakonec n∞co na odlehΦenφ - tentokrßt z praxe. GExpertV²vojovΘ prost°edφ Delphi vßm poskytuje mno₧svφ nßstroj∙ pro v²voj aplikacφ. NicmΘn∞ nic nenφ dokonalΘ a v₧dy se najde n∞jak² koumßk, kter² si °ekne tohle by Ülo ud∞lat lΘpe takhle, tohle bych ud∞lal jinak atd. Pro tyto osoby nabφzφ IDE mo₧nost zßsahu do sv²ch mo₧nostφ prost°ednictvφm nßstroj∙ "Open Tools API". Ne₧ se ale rozhodnete sami n∞co podobnΘho vytvß°et, vyzkouÜejte nejprve nßstroj GExpert, t°eba v n∞m naleznete to, co hledßte. Nßstroj je urΦen pro prakticky vÜechny aktußlnφ verze Delphi (Φφseln∞ i "·rovnostn∞"). Instalace je bezproblΘmovß a umφstφ vßm do menu mezi Tools a Window polo₧ku GExperts, kterß vßm po rozkliknutφ nabφdne bohat² v²b∞r mo₧nostφ: V nabφdce je asi dvacet p∞t expert∙ a °adu dalÜφch mo₧nostφ objevφte v konfiguraci. Zde m∙₧ete jednak nastavit detailnφ vlastnosti jednotliv²ch expert∙ (vΦetn∞ volby kombinace klßves pro vyvolßnφ) a jednak mnoha zp∙soby vylepÜit prost°edφ co do vzhledu i ovlßdßnφ: Velmi zajφmavß rozÜφ°enφ naleznete nap°φklad na zßlo₧ce "Editor Experts": Kolikrßt se vßm t°eba stalo, ₧e program p°i p°ekladu hlßsφ chybu, kterß nastala v d∙sledku n∞jakΘho chyb∞jφcφho end, nebo jste napsali slo₧it² zßvorkovan² v²raz a pon∞kud jste se ztratili v lev²ch a prav²ch zßvorkßch? S tφmto expertem byste m∞li problΘm lehce vy°eÜit. ╚asto jsem si vzpom∞l p°i programovßnφ v Delphi na IDE Visual Basicu, kde lze oznaΦen² blok snadno zm∞nit na komentß° a zp∞t. Zde si m∙₧ete dokonce vybrat i zp∙sob, jak bude komentß° realizovßn (// na ka₧dΘm °ßdku, dvnebo dvojiceni { }, Φi (* *)). Probφrat vÜechny mo₧nosti je nad mΘ sφly a tak jeÜt∞ t°i zajφmavosti a ostatnφ nechßm na vaÜe pr∙zkumnΘ schopnosti. Paleta komponent v IDE nemß moc mo₧nostφ ke konfigurovßnφ. Pokud Φasem vzroste poΦet nainstalovan²ch komponent a prodlou₧φ se poΦet zßlo₧ek nad urΦitou mφru, stßvß se hledßnφ a v²b∞r komponent nep°ehledn²m. Pak vßm p°ijde vhod mo₧nost zobrazit paletu jako vφce°ßdkovou: SouΦßstφ instalace je i rozsßhlß knihovna ·sek∙ k≤du, kter² si m∙₧ete sami dopl≥ovat do hierarchickΘ struktury. P°i programovßnφ lze z tΘto knihovny ·seky k≤d∙ vyu₧φvat a p°etahovat do programu: No a nakonec expert pro pomoc p°i vytvß°enφ dialog∙. Kurzor umφstφte na mφsto v k≤du, kde chcete napsat vyvolßnφ dialogu a spustφte experta "Message Dialog". Na formulß°i pak napφÜete jen text zprßvy a zatrhnete volby, specifikujφcφ formu dialogu. VÜe ostatnφ ud∞lß expert za vßs a na mφste kurzoru se vygeneruje p°φsluÜn² p°φkaz: V²Üe uvedenß kombinace vygeneruje p°φkaz: if not (MessageDlg('Chyba p°i zadßnφ dotazu!!', mtError,Tak₧e vzh∙ru na strßnky http://www.gexperts.org/ za nejnov∞jÜφ verzφ GEperta! AlgoritmyMetoda p∙lenφ intervalu (dßle jen PI) je algoritmus, kter² umo₧≥uje rychlΘ vyhledßnφ klφΦe v set°φd∞nΘm seznamu a poskytuje nßm i nßstroj k jeho p°φpadnΘmu set°φd∞nφ. N∞kte°φ z vßs asi v tuto chvφli ohrnete nad PI nos a pomyslφte si, ₧e nevφte proΦ byste se m∞li s n∞Φφm tak trivißlnφm zab²vat, kdy₧ existujφ r∙znΘ quick-sorty a mnohem lΘpe "vymakanΘ" a (mnoha strßnkami v²poΦt∙ dokßzanΘ) rychlejÜφ a lepÜφ metody hledßnφ a t°φd∞nφ. Mßte zajistΘ pravdu. Ale napiÜte mi na mφst∞ jen tak z hlavy, bez vyhledßvßnφ v r∙zn²ch knihßch a pßtrßnφ v knihovnßch algoritm∙, progrßmek na set°φd∞nφ tabulky pomocφ quick-sortu, Φi vyhledßvßnφ pomocφ Boyer-Mooreova algoritmu. Myslφm si (a to vßs nechci v∙bec podce≥ovat), ₧e vßs t∞ch, kte°φ to dokß₧ete jen tak z hlavy, asi moc nebude. Dovoluji si tvrdit, ₧e PI-algoritmus je s hlediska pom∞ru v²kon/slo₧itost asi ten ·pln∞ nejlepÜφ algoritmus z tΘto oblasti. V₧dy¥ na cel² algoritmus vystaΦφte jen s asi deseti snadno zapamatovateln²mi °ßdky programu!! P°itom oproti sekvenΦnφmu vyhledßvßnφ urychlφte v pr∙m∞ru vyhledßvßnφ v pom∞ru (n/2) ku log2n. Srozumiteln∞ji °eΦeno pro tabulku o 1000 °ßdcφch urychlφte vyhledßnφ z 500 krok∙ na 10 pr∙chod∙ algoritmem a Φφm rozsßhlejÜφ tabulka je, tφm v²razn∞jÜφ je ·spora. Tak₧e jak to vypadß v praxi. P°edpoklßdejme, ₧e mßme deklarovßnu tabulku o 1000 °ßdcφch se znakov²mi °et∞zci, obsah tabulky je set°φd∞n: var Tab: array[1..1000] of String[10];Nßsledujφcφ funkce nßm vrßtφ Φφslo °ßdu tabulky s hledan²m °et∞zcem nebo nulu, pokud °et∞zec v tabulce nenφ. Function Hledej(Klic: String): Integer; {=====================================} DH : Integer; //dolnφ hranice HH : Integer; //hornφ hranice ST : Integer; //st°ed intervalu begin DH:=1; HH:=1000; Result:=0; repeat ST:=(DH+HH) div 2; //vypoΦteme st°ed intervalu If Tab[ST]=Klic then begin //nalezli jsme prvek Result:=ST; exit; End; If Tab[ST] P°edpokladem funkΦnosti v²Üe uvedenΘho algoritmu je, jak jsem se zmφnil, set°φd∞nost tabulky. Pokud nemßme tabulku set°φd∞nu, m∙₧eme vyu₧φt jednΘ zajφmavΘ vlastnosti algoritmu, kterou lze s v²hodou k set°φd∞nφ tabulky vyu₧φt. Jde o to, ₧e pokud nenφ hledan² klφΦ v tabulce nalezen, algoritmus konΦφ v okam₧iku, kdy se "p°evrßtφ" hodnoty prom∞nn²ch DH a HH, Φili DH > HH. V tuto chvφli ale ukazuje prom∞nnß DH na °ßdek tabulky, kam by s hlediska set°φd∞nφ m∞l hledan² klφΦ pat°it. Pokud k takovΘ situaci dojde, staΦφ posunout obsah set°φd∞nΘ Φßsti od °ßdku DH do konce tabulky o jeden °ßdek sm∞rem nahoru a vyhledßvan² klφΦ vlo₧it na uvoln∞n² °ßdek. Nßsledujφcφ p°φklad ukazuje vyu₧itφ malΘ ·pravy v²Üe uvedenΘho algoritmu k set°φd∞nφ tabulky "inplace", Φili p°φmo na mφst∞, kde je tabulka ulo₧ena. Function Hledej(Setrideno: Integer; Klic: String): Integer; {=========================================================} DH : Integer; //dolnφ hranice HH : Integer; //hornφ hranice ST : Integer; //st°ed intervalu begin DH:=1; HH:=Setrideno; repeat ST:=(DH+HH) div 2; //vypoΦteme st°ed intervalu If Tab[ST]<=Klic then DH:=ST+1 // platnou se stßvß hornφ polovina intervalu else HH:=ST-1; // platnou se stßvß dolnφ polovina intervalu until DH>HH; // konΦφme kdy₧ dojde k "p°evrßcenφ" hranic Result:=DH; end; Procedure SortujPI; {=================} var i: Integer; S: String; j: Integer; begin for i:=2 to 1000 do begin if Tab[i]>=Tab[i-1] then Continue; //je-li prvek, kter² mßme zat°φdit v∞tÜφ ne₧ //nejv∞tÜφ z ji₧ set°φd∞n²ch j:=Hledej(i-1,Tab[i]); // 1 a₧ i-1 je set°φd∞no, hledßme kam pat°φ // prvek T[i] S:=Tab[i]; for k:=i-1 downto j do Tab[k+1]:=Tab[k]; //posuneme prvky od rßdku j do rßdku i-1 Tab[j]:=S; // na uvoln∞n² j-t² vlo₧φme Tab[i] end; end; JednoduÜÜφ je snad ji₧ jen bublesort, ale zkuste si pom∞°it Φas set°φd∞nφ t°eba 5000 prvk∙ pomocφ bublesortu a pomocφ uvedenΘho PI a sami uvidφte co jsem m∞l na mysli, kdy₧ jsem se naho°e zmφnil o pom∞ru v²kon/slo₧itostà Odkazyhttp://www.drbob42.comAutorem strßnek je holan∩an Bob Swart (alias Dr. Bob) - spolupracovnφk a p°isp∞vatel mnoha Φasopis∙ o Delphi, autor °ady knih o Delphi, Kylixu a C++ Builderu, je konzultat a vede mno₧stvφ kurz∙, je stßl² p°isp∞vatel mnoha seminß°∙ o Delphi. Na sv²ch strßnkßch mß informace o novinkßch, kopie n∞kter²ch sv²ch Φlßnk∙ v Φasopisech a odkazy na strßnky s Φasopisy s dalÜφmi Φlßnky (bohu₧el je prohlφ₧enφ t∞chto Φasopis∙ v∞tÜinou podmφn∞no zaplacenφm poplatku). Oblφben²mi tΘmaty jsou internet a SOAP a XML. http://www.matlus.comVynikajφcφ strßnky, vytvß°enΘ dynamicky v Delphi a jak sßm autor na svΘ ·vodnφ strßnce pφÜe: This site is 100% Delphi built and 100% dynamic. All the content you see here is "database driven" and a number of Delphi ISAPI applications drive this site. I want this site to be a Delphi "showcase" for those curious to see - What Delphi can do, how beautifully it does it and how to do it. Hlavnφ tΘmata, kter²mi se strßnky zab²vajφ jsou ISAPI, HTTP, SOAP/XML/WebServices a vφcevrstvΘ aplikace a tencφ klienti. Obsahuje spustu Φlßnk∙ a tutorial∙ ke zmφn∞n²m tΘmat∙m. http://www.marcocantu.com/Marco Cant· je programßtorskΘ obci znßm dφky sΘrii publikacφ "Mistrovstvφ v Delphi", kterß se u nßs vydßvß ji₧ od prvnφch verzφ Dekphi. Ze strßnek autora si m∙₧ete stßhnout jednak p°φklady urΦenΘ pro tyto publikace, naleznete tam dv∞ elektronickΘ publikace Essential Pascal a Essential Delphi, n∞kolik velmi pou₧iteln²ch nßstroj∙ a komponent autora a takΘ celou °adu tΘmaticky rozd∞len²ch odkaz∙ na dalÜφ strßnky. Zßv∞remNevφm, kolik z nßsledujφcφch v²rok∙ u₧ivatel∙ je skuteΦn²ch a kolik je um∞le vymyÜlen²ch, ale urΦit∞ se pobavφte: "To, co nßm tu ukazujete ale nenφ to, co jsme sice ne°ekli, ale ve skuteΦnosti cht∞li." "Tak jo, tak jste nßm to ukßzali, moc se nßm to lφbφ, ale doufßm, ₧e to nebudeme muset pou₧φvat." "To tlaΦφtko na tom formulß°i nesmφ b²t naho°e, musφte ho dßt dol∙, vφte kolikrßt za den bych musela s tou myÜφ do kopce?" "A a₧ to budete programovat doopravdy, tak vßm °eknu, jak to mß sprßvn∞ vypadat." "Vφte, jak nßs straÜn∞ zdr₧uje poka₧d² se p°ihlaÜovat do programu a psßt jeÜt∞ to heslo? Nemohl by ten poΦφtaΦ, kdy₧ je tak chytrej, podle n∞Φeho sßm poznat, ₧e u n∞j sedφm jß?" "No jß vφm, ₧e jsem tu anal²zu podepsal, ale to bylo jenom jako, ale jß jsem netuÜil, ₧e to podle toho doopravdy ud∞lßte." "Jß v₧dycky maΦkßm tlaΦφtko OK. Jß nemßm Φas Φφst, co je tam napsßno." "Na tom formulß°i je asi 20 polo₧ek a je to straÜn∞ nep°ehledn². Jß jich v₧dycky vypl≥uju nejvejÜ p∞t." "Ten program musφte ud∞lat tak, abych nemusel pou₧φvat myÜ. Mn∞ se sem na st∙l myÜ nevejde. Tady myÜ bejt nem∙₧e, tady musφ stßt kafe!" "Ten program se mi furt na n∞co ptß. A¥ se mi na nic neptß, jß jsem introvert!" "A nemohli byste tam tu chybu, co jste opravili, zase vrßtit, my jsme si na nφ u₧ zvykli, ₧e to musφme odklepßvat a te∩ kdy₧ to odklepneme, jak jsme zvyklφ, tak tφm entrem potvrdφme n∞co, co jsme necht∞li!" "To mi nezajφmß, ₧e to jsou ≥ßk² Windows a tamto byl DOS. Jß mßm nacviΦenej prstochvat, tak mi ten prstochvat musφ fungovat i na t∞ch Windows!" P°idßm jednu perliΦku z vlastnφ zkuÜenosti. Zßkladnφ vojenskou slu₧bu jsem p°ed mnoha lety trßvil programovßnφm (sßlovΘho) poΦφtaΦe ·lohou pro velitelstvφ zßsobovßnφ PHM. Jednalo se o sledovßnφ pohyb∙ r∙zn²ch typ∙ cisteren po republice. Kdy₧ byl program hotov, p°iÜla prvnφ skuteΦnß data (na d∞rn²ch Ütφtcφch - pokud jeÜt∞ vφte co to je!!). Program pßr Ütφtk∙ spolykal a pak se zhroutil na nesprßvn²ch vstupnφch datech s typy cisteren, kterΘ neodpovφdaly zadßnφ. Kdy₧ jsem se obrßtil s dotazem na zadavatele, starÜφ panφ mi dobromysln∞ sd∞lila, ₧e je pßr typ∙ cisteren, kter²ch jezdφ jen velmi mßlo, a tak mi s jejich "anal²zou" necht∞la komplikovat zadßnφà
|
|