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
{$REGION 'Neladit'}
procedure PerfectCode;
begin
// bla bla
end;
{$ENDREGION}
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.
type TT = class abstract(TObject)
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.
type TT = class sealed(TObject)
procedure Print;
end;
type TT2 = class (TT)
end;
[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.
type TT = class (TObject)
procedure Print; virtual; final;
end;
type TT2 = class (TT)
procedure Print; override;
end;
[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.
type TT = class (TObject)
private
class var fiCount:Integer;
class function miGetCount:Integer; static;
public
class procedure Print;
class property piCount:Integer read miGetCount write fiCount;
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.
type TT = class (TObject)
public
type TT2 = class
procedure Print2;
end;
procedure Print;
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ší.
type
TMyObject = class
private
Value: Integer;
Text: string;
public
procedure Increase;
procedure Show;
end;
TMyObjectHelper = class helper for TMyObject
public
procedure Show;
end;
procedure TMyObject.Increase;
begin
Inc (Value);
end;
procedure TMyObject.Show;
begin
writeln ('object show');
end;
{ TMyObjectHelper }
procedure TMyObjectHelper.Show;
begin
WriteLn (Text + ' ' + IntToStr (Value) + ' -- ' +
ClassName + ' -- ' + ToString);
end;
var
Obj: TMyObject;
Obj := TMyObject.Create;
Obj.Text := 'test';
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.
var
o: TObject;
begin
for o in oList do
ListBox1.Items.Add(o.ToString);
end;
nebo
var
s: string;
c: char;
begin
s := 'delphi.cz';
for c in s do
ListBox1.Items.Add(c);
end;
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:
function Min(iA, iB: Integer):Integer ; inline;
begin
if iA < iB then
Result := iA
else
Result := iB;
end;
Rozšíření Record
Deklarace záznamu byla rozšířena o možnost procedur (nebo metod?).
type
TMyRecord = record
private
fiInt: integer;
public
procedure Print;
constructor Create(iInit:Integer);
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
type
TPointRecord = record
public
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.