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