Mini recenze Delphi 2007 (část 1 / 2)

vložil Radek Červinka 8. prosince 2009 23:57

Hodně lidí stále používají starší verze Delphi (nejčastěji 5-7) a nemají přehled o novinkách v novějších Delphi (a změn je hodně, hlavně ohledně jazyka), takže si je rychle prosvištíme. A to samé pak udělám s Delphi 2009 a snad i s Delphi 2010 (kde se pak budu jen odkazovat na tento článek).

Delphi 2007 je první verzí, která vznikla po oddělení vývojových nástrojů od Borlandu a je znát, že to programátorům dalo novou chuť pracovat a odstraňovat chyby (je pravdou, že Delphi 8 bylo neodladěné). IDE je interně nazýváno Galileo, první verze byla pro neštastné Delphi 8, pro Delphi 2007 se jedná již o 5 verzi IDE a proti předchozím verzím je opravdu stabilní. Delphi 2007 je poslední ne unicode verze a jedná se o nonbreaking verzi, tj. je binárně kompatibilní s Delphi 2006 (tj. dcu z Delphi 2006 lze používat ve 2007).

Instalace

Box Delphi 2007

IDE je sice Win32 aplikace psaná převážně v Delphi, ale přesto potřebuje pro svůj běh .NET 2.0 a pro instalaci je tedy nutné mít framework instalován (resp. v rámci preinstalace je nainstalován). Ve skutečnosti IDE .NET potřebuje jen pro takové věci jako refaktoring atd. a existují způsoby jak se závislosti zbavit.

Standartní adresář pro instalaci je "c:\Program Files\CodeGear\RAD Studio\5.0", dema jsou v "c:\Documents and Settings\All Users\Dokumenty\RAD Studio\5.0\Demos" atd.

Spouštění

Program se spouští pomocí bds.exe, tj. "c:\Program Files\CodeGear\RAD Studio\5.0\bin\bds.exe", kdy existuje několik parametrů, např.:

  • -rMoje (spustí IDE s jinou sadou registrů)
  • -ns (NoSplash - bez splash screenu)
  • -np (NoPage - bez Welcome page)

Největší změnou pro uživatele Delphi 7 je jiné rozložení pracovní plochy (nejsou jednotlivá okna, ale vše je v jednom okně). To lze přepnout v nastavení na Undocked.

Druhá velká změna je neexistence palety komponent s ikonami, místo ní je okno s komponentami. Původní paletu lze získat instalací rozšíření DDevExtensions od známého Andrease Hausladena. Jinak ale nový toolbar podporuje vyhledávání a je fakt prima.

Třetí změna je, že IDE podporuje témata XP, Vista a spol. Pokud do adresáře Delphi nahrajete bds.exe.manifest kde zakážete styly a restartuje IDE budete mít IDE jako ve Windows 2000, ale proč že?

Delphi 2007

Code folding a regiony

    1{$REGION 'Neladit'}
    2    procedure PerfectCode;
    3    begin
    4      // bla bla
    5    end;
    6{$ENDREGION}}

Vytvoří rozbalovací/skrývací část kódu - prostě to všichni znáte. Podpora je od Delphi 2005.

Code Folding

Code folding - animace Nick Hodges

Editor podporuje SyncEdit (editace na více místech zároveň - CTRL+SHIFT+J), refactoring (pokud odstraníte .NET část IDE tak nebude dostupný), šablony kódu (Live Templates) a vícenásobnou historii souborů.

Sync Edit

Sync Edit - animace Nick Hodges

Designer

Změněn byl i designer. Každý control nyní má v rozích tečku pro lepší uchopení a při přesouvaní zobrazuje vodící čáry pro přesnější zarovnání.

Help insight

Nápověda při psaní kódu je vylepšena, zobrazuje parametry a jednotku ve které je deklarace. Zároveň byl kompilátor rozšířen o generování XML dokumentace, kterou tato funkce používá, tj. Help insight zobrazuje i vaše poznámky.

Poznámky pro kompilátor začínají /// nebo {! a !}

Vlastní nápověda byla změněna z hlp formátu (není dále podporován ze strany MS) na Microsoft Document Explorer formát. Hodně uživatelů si stěžovalo, že některé části původního helpu jak byl v Delphi 7 nejsou dostupné, situace se zlepšila až v Delphi 2009 a Delphi 2010, kdy se na helpu opravdu hodně zapracovalo.

MSBuild

Velká změna přichází při build projektu. Starý nástroj ještě od Borlandu byl nahrazen MSBuild (tj. kompilátor a linker je Delphi, ale pro více projektů jsou volány právě MSBuild).

Myslím, že je dobrý krok. Výsledkem je .dproj soubor, který obsahuje XML jako zdroj pro MSBuild. Tento soubor je automaticky udržován Delphi IDE, ale máte možnost ho upravit, ať už přes IDE (editace pre-build a post-build příkazů v Project Options) nebo ručně. Konverze ze starších Delphi je podporována.

Debugger

Přiznám se, že nevím v které verzi Delphi přibyla možnost nastavit breakpoint, který nezastaví program, ale jen pošle text (nebo výsledek výrazu) do okna Events panel.

Ale co je určitě nové jsou breakpointy Stack breakpoints. Otevřete okno Call stack a tam uvidíte historii zanoření volání metod a vlevo tečky. Pokud kliknete na tečku tak tím nastavíte breakpoint a program se zastaví až tam vyskáče zpět. Velmi užitečné při ladění do hloubky.

Další pěknou vlastností je Debug Insight. Program se zastaví na breakpointu a v hintu myši se zobrazují informace o libovolné proměnné. V každé verzi Delphi je to vylepšováno a tak v Delphi 2007 se zobrazí malé plus a po jeho rozkliknutí se zobrazí seznam předků. To samé třeba watch listu atd. Byl jsem upozorněn, že stiskem CTRL se hint dočasně zprůhlední aby byl vidět kód v pozadí.

Debug insight

Debug insight

Další: CPU okna nyní podporuje Copy&Paste, při výjimce lze výjimku přidat do seznamu ignorovaných výjimek.

Rozšíření jazyka Object Pascal

Když je private opravdu private

Myslím, že všichni vědí, že private je private jen mimo unit kde je třída definována, tj. jakákoliv jiná třída nebo procedura ve stejné jednotce může přistupovat na private a protected členy třídy.

Od Delphi 2006 je jazyk rozšířen o strict private a strict protected členy a fungují očekávaným způsobem, tj. můžete přistupovat jen k strict protected a to jen z následníka inkriminované třídy.

Rozšíření definice třídy

Nyní jde definovat nejen abstraktní metoda, ale i abstraktní třída.

    1type TT =  class abstract(TObject)
    2  end;

Nějak se mi nezdá, že by to mělo nějaký efekt, i když v dokumentaci píší, že taková třída nelze přímo vytvořit přes Create.

Naopak pokud je třída deklarovaná jako sealed nelze od ní dědit.

    1type TT =  class sealed(TObject)
    2    procedure Print;
    3  end;
    4
    5  type TT2 = class (TT)
    6
    7  end;
    8
    9[DCC Error] Unit1.pas(25): E2353 Cannot extend sealed class 'TT'

Osobně sealed moc neuznávám, ale někomu se to může hodit (speciálně tvůrcům komponent atd.).

Podobné je taky rozšíření deklarace metody final. Prostě taková metoda nejde předefinovat.

    1type TT =  class (TObject)
    2    procedure Print; virtual; final;
    3  end;
    4
    5  type TT2 = class (TT)
    6    procedure Print; override;
    7  end;
    8[DCC Error] Unit1.pas(24): E2352 Cannot override a final method

Class data, class property atd.

Pěkným rozšířením jazyka je přidání proměnných třídy (neplést s proměnnou objektu). Už dlouho Delphi umožňuje definovat class metodu a tak teď i class proměnnou. No a vezmu to rovnou i s class property. V příkladu je fiCount class proměnná, která je sdílena všemi instancemi TT.

    1type TT =  class (TObject)
    2  private
    3    class var fiCount:Integer;
    4    class function miGetCount:Integer; static;
    5  public
    6    class procedure Print;
    7    class property piCount:Integer read miGetCount write fiCount;
    8  end;

V příkladu je také vidět něco co Delphi získalo z .NET. Normální class procedure může být virtuální (velmi cool a užitečná vlastnost), což .NET nejde.

Na druhou stranu taková (static) metoda může být použita pro Win32 API callback funkce (to nemám ze své hlavy) nebo jako přístupová metoda pro class property (viz příklad).

Vnořené (nested) typy

Často používám vnořené procedury (má to v jistých případech jisté výhody) a nyní Delphi podporuje i vnořené typy.

    1type TT =  class (TObject)
    2  public
    3    type TT2 = class
    4      procedure Print2;
    5    end;
    6    procedure Print;
    7  end;

V metodě Print můžete vytvořit instanci TT2 a volat třeba Print2.

Class Helpers

Class helpers je velmi silný nástroj, který vám umožní rozšířit funkcionalitu existující třídy aniž máte přístup k jejímu kódu. Samozřejmě je to nebezpečné, ale o to mocnější.

    1type
    2  TMyObject = class
    3  private
    4    Value: Integer;
    5    Text: string;
    6  public
    7    procedure Increase;
    8    procedure Show;
    9  end;
   10
   11  TMyObjectHelper = class helper for TMyObject
   12  public
   13    procedure Show;
   14  end;
   15
   16procedure TMyObject.Increase;
   17begin
   18  Inc (Value);
   19end;
   20
   21procedure TMyObject.Show;
   22begin
   23  writeln ('object show');
   24end;
   25
   26{ TMyObjectHelper }
   27
   28procedure TMyObjectHelper.Show;
   29begin
   30  WriteLn (Text + ' ' + IntToStr (Value) + ' -- ' +
   31    ClassName + ' -- ' + ToString);
   32end;
   33
   34
   35var
   36  Obj: TMyObject;
   37
   38  Obj := TMyObject.Create;
   39  Obj.Text := 'test';
   40  Obj.Show;

Tento kód je převzat od Marca Cantu a jednoduše demonstruje o co mi jde. Ve výsledku se samozřejmě zavolá implementace TMyObjectHelper.Show.

Tímto způsobem můžete krásně rozšiřovat funkci a vlastnosti třeba i VCL. Class helpery mohou být metody, class metody atd. jen ne data objektu. Class helpery jsou dostupné jakmile je určena jejich viditelnost přes uses, tj. pro jejich použití musíte dát uses tam kde je používáte.

For..in cyklus

Tento cyklus existuje i v jiných jazycích a znamená cyklus pro všechny prvky.

    1var
    2  o: TObject;
    3begin
    4for o in oList do
    5  ListBox1.Items.Add(o.ToString);
    6end;
    7
    8nebo
    9
   10var
   11  s: string;
   12  c: char;
   13begin
   14  s := 'delphi.cz';
   15  for c in s do
   16    ListBox1.Items.Add(c);
   17end;

Kromě uvedených lze toto provádět i s polem nebo s třídami, které podporují GetEnumerator (např. TList).

Inline procedury a metody

Jak je Vám jistě známo, každé volání metody něco stojí i když Delphi až tři parametry (pozor: objekt je u metod první parametr a obsahuje Self) dokáže předat v registrech procesoru. A jelikož máme své uživatele rádi tak píšeme rychlé programy. V tom nám Delphi nabízí direktivu inline, která řekne kompilátoru, že programátor by si přál zařadit tuto metodu (proceduru) přímo a ne jako metodu. Důležité je, že o tom zda se to opravdu tak stane rozhodne kompilátor až když uzná, že to má smysl. Velmi užitečné hlavně pro časté volání v rámci cyklu atd.

Stupidní příklad:

    1function Min(iA, iB: Integer):Integer ; inline;
    2  begin
    3    if iA < iB then
    4      Result := iA
    5    else
    6      Result := iB;
    7  end;

Rozšíření Record

Deklarace záznamu byla rozšířena o možnost procedur (nebo metod?).

    1type
    2  TMyRecord = record
    3  private
    4    fiInt: integer;
    5  public
    6    procedure Print;
    7    constructor Create(iInit:Integer);
    8  end;

Hlavní rozdíly mezi objektem a záznamem: záznam není alokován z dynamické paměti, při předávání je standartně předáván hodnotou (objekt odkazem) a při přiřazení je kopírován (objekt kopíruje referenci).

Operátory pro Record

    1type
    2    TPointRecord = record
    3    public
    4      class operator Add(a,b: TPointRecord):TPointRecord;

Operátor Add je volán při operaci +, ostatní operátory si nejděte v helpu.

Kompilátor

Delphi 2007 definuje symbol VER180 (stejně jako Delphi 2006 - viz začátek o binární kompatibilitě), ale zároveň VER185.

Někdy příště si řekneme něco o změnách v RTL a VCL.


Nabízíme Delphi školení a konzultace na různá témata, primárně ve Vaší firmě.

Tagy: , , , , , ,

Jazyk | Recenze

Komentáře

9.12.2009 8:28:32 #

pepak

Moc pěkný a pro mě velmi relevantní článek (příští rok mě čeká přechod z Delphi 5 na Delphi 2009). Už se těším na druhý díl. Mimochodem, neškodilo by, kdyby u toho druhého dílu byl seznam materiálů, kde se případně dají dohledat další změny (název novinkové sekce v Helpu, nebo tak něco).

pepak

9.12.2009 19:05:42 #

Karel Janeček

Dobrý den, díky moc za to, že portál Delphi vznikl. Sleduji jej od počátku a musím konstatovat, že dosavadní informace a články pro mě byly velmi užitečné. Chválím zejména CnWizards a speciálně možnost hromadného nahrazování v projektových souborech - užitečná, rychlá a elegantní věcička.
Rovněž se těším na druhý díl recenze D2007/2010. Již cca dva roky používám D2007 a v lednu hodlám upgradovat na D2010. Před časem jsem si u LULU objednal knihu Delphi2009 Handbook a i přesto bych uvítal, kdyby v recenzi byly zmíněny nejpodstatnější momenty, týkající se migrace do prostředí Unicode.
Díky za zajímavé čtení !

Karel Janeček

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS