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.

GExpert

V²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φ:

ge01

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φ:

ge02

Velmi zajφmavß rozÜφ°enφ naleznete nap°φklad na zßlo₧ce "Editor Experts":

ge04

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:

ge03

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:

ge05

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:

ge06

V²Üe uvedenß kombinace vygeneruje p°φkaz:

if not (MessageDlg('Chyba p°i zadßnφ dotazu!!', mtError,
[mbOK,mbCancel], 2) in [mrOk,mrCancel,mrNone]) then . . .
Tak₧e vzh∙ru na strßnky http://www.gexperts.org/ za nejnov∞jÜφ verzφ GEperta!

Algoritmy

Metoda 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]HH;             // konΦφme kdy₧ dojde k "p°evrßcenφ" hranic
  end; 

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à

Odkazy

http://www.drbob42.com

Autorem 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.com

Vynikajφ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∞rem

Nevφ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."
"A kter²ch p∞t?"
"No, to se takhle nedß °φct. Jak je pot°eba. Ale po₧aduju, aby na tom formulß°i v₧dycky byly jenom ty polo₧ky, kterΘ te∩ pot°ebuju a ostatni a¥ tam nejsou."

"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φà

 

Ji°φ Ventluka