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

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?

Code folding a regiony
1
2 procedure PerfectCode;
3 begin
4
5 end;
6}
Vytvoří rozbalovací/skrývací část kódu - prostě to všichni znáte. Podpora je od Delphi 2005.

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