Jak jsem slíbil - je tu druhá část ohledně Delphi 2007 (Delphi 2009 a Delphi 2010 budou někdy následovat). Dnes tedy o RTL a VCL. Doporučuji čtení začít nejprve první částí popisující IDE, kompilátor a změny v jazyce zhruba tak od Delphi 7.
Změny v RTL
FastCode a FastMM
Největší změnou bezpochyby bylo zavedení FastMM4 v Delphi 2006. O tomto fantastickém správci paměti jsem již psal, takže se nebudu opakovat.
Zároveň od verze 2005 bylo z projektu FastCode (o něm jsem již také psal) postupně přebráno mnoho optimalizovaných rutin (v každé vyšší verzi další a další),
např. Pos, Move, FillChar, StrLen, UpperCase, LowerCase, CompareStr atd. Evidentně se jedná o často používané funkce a to se projeví prakticky v každém programu.
Podpora GetEnumerator
Minule jsem ukazoval novou jazykovou konstrukci s for in do. Aby to bylo k něčemu, bylo třeba rozšířit některé třídy o podporu GetEnumerator.
Nejdůležitější je podpora v TList a TStringList atd. Z těchto třídy je například poděděn TObjectList tudíž automaticky získal stejné vlastnosti.
Samozřejmě použití generik z Delphi 2009 je mnohem lepší.
Další změny
TStrings má property LineBreak, která umožňuje lépe rozdělovat text do řádků.
Nový unit WideStrUtils, obsahující např. WideQuotedStr, WideStringReplace atd. a funkce pro podporu UTF-8 řetězců (UTF8LowerCase, ConvertStreamFromAnsiToUTF8 …).
Kromě uvedených funkcí obsahuje unit i TWideStrings a TWideStringList (wide varianty pro TStrings a TStringList). Samozřejmě s podporou Unicode v Delphi 2009 to pak má menší význam.
Zajímavou funkcí je SysUtils.IsAssembly, která podle parametru vrací zda DLL je klasická nebo .NET assembly. Zde bych opět rád připomněl existenci JCL, která má mnohem více podobných funkcí.
Změny ve VCL
Margins a Paddings
Modří již vědí - tedy pokud znáte CSS tak určitě.
Třída TControl byla rozšířena (od Delphi 2006) o property Margins:TMargins, která určuje rozestupy mezi dvěma controly (dá se specifikovat top, bottom, left a right a to v pixelech). Nezapomeňte to aktivovat nastavením AlignWithMargins na True.
Dále Padding:TPadding definuje vnitřní odstup od okraje kontrolu a kontrolem uvnitř kontrolu :-). No raději obrázek.
Screenshot je sice z Delphi 2009 s instalovaným CnWizards (to ty číslíčka s tab order), ale to je jedno
Panel má nastaven Margins na 10 pixelů na všechny strany a Align = alTop. Lze pozorovat odstup o formuláře. Dále má nastaven Padding na 5 pixelů na všechny strany. Tlačítko má nastaveno Align = alLeft, tj. normálně by bylo připláclé vlevo, ale nyní ne - odstup 5 pixelů. Aktivace již uvedenou AlignWithMargins.
FlowPanel a GridPanel
Konečně. Vždy jsem chtěl nějakou takovou komponentu (vždy jsem to pak nějak emuloval). TFlowPanel se inspiroval v HTML a je to panel, který automaticky vedle sebe nasázené controls dokáže přeuspořádat podle šířky panelu, tj. třeba při šířce 100px se všechny vejdou na jeden řádek, ale pokud provedete změnšení tak se od konce začnou přesouvat na nový řádek.
V našem CRM systému to používám pro filtry pod gridem, takže při roztažení okna se pěkně vejdou do jednoho řádku.
8 tlačítek na FlowPanelu
Naopak TGridPanel umožňuje definovat mřížku, který do polí umožňuje dát controly. Počet sloupců a řádků je definován pomocí kolekcí ColumnCollection a RowCollection. Při roztahování se control umístěný v poli chová jako by byl na samostatném panelu. A samozřejmě ty čárkované čáry nejdou za běhu vidět.
Pro každý sloupec (řádek) lze definovat, zda je určen procenty, pixely nebo automaticky.
ExplicitTop, ExplicitLeft, ExplicitHeight a ExplicitWidth
TControl definuje čtyři nové uvedené property, ve kterých si IDE pamatuje pozice před nastavením Align nebo Anchor. Po vypnutí se vrátí control tam kde byl.
ButtonGroup a CategoryButton
TButtonGroup je něco jako toolbar s tlačítky, ale s tím že ho můžete dát kdekoliv. Mnohem lepší je TCategoryButton, kde můžete definovat kategorie a pro každou kategorii tlačítka, kategorie se dají schovávat. Navíc se dají se definovat gradienty pro každou kategorii zvláště. Pro obě komponenty se dá specifikovat velikost tlačítek.
Screenshot je také z Delphi 2009
Osobně si myslím, že v JVCL je na podobné věci ještě hezčí komponenta.
MouseActivate
TControl nyní přidává událost OnMouseActivate, která umožňuje při aktivaci okna myší zpracovat kliknutí (třeba ho zpracovat tak, že se nepředá dále), tj. např. pokud
obsloužíme tuto událost na formuláři, můžeme zabezpečit, že pokud uživatel klikne na tlačítko v okně při aktivaci nebude tlačítko poprvé volat OnClick.
No mi to celkem přijde zbytečné, ale někteří uživatelé jsou prostě jiní.
TrayIcon
Od verze Delphi 2006 je součástí VCL i komponenta TTrayIcon. Kromě jiného má TTrayIcon property BalloonHint, BalloonTitle (a další), které umožňují zobrazit již klasickou nápovědu ve tvaru balónu.
object trayicon1: TTrayIcon
BalloonHint = 'To je jen demo pro Delphi.cz'
BalloonTitle = 'Delphi.cz'
BalloonTimeout = 1000
BalloonFlags = bfInfo
Visible = True
OnMouseDown = trayicon1MouseDown
Left = 84
Top = 324
end
procedure TForm1.trayicon1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
trayicon1.ShowBalloonHint;
end;
Jistě už používáte nějakou jinou, ale tato je opravdu dobrá, je ve VCL, a už jen pro možnost bezbolestného upgrade, nebo podporu BallonHint ji doporučuji.
Nezapomeňte, že Application.ShowMainForm := False; schová překvapivě hlavní okno aplikace, a v tom případě je tray ikona rozumná možnost pro ovládání programu.
Ostatní
- TToolBar a TControlBar mají možnost gradientu na pozadí
- lze aktivovat plnou podporu kolečka myši přidáním IMouse unitu
- Změna FormStyle, BorderStyle a BorderIcons nezpůsobí recreate okna
- Defaultní hodnota AutoScroll je nyní false (tj. pro systémy s velkými fonty vše okamžitě funguje)
- Nezkoušel jsem, ale od Delphi 2005 prý lze definovat následníka TMainMenu, u něho předefinovat CreateMenuItem a designer by to měl vzít v potaz
(já jsem vždy kopíroval menus.pas a tam prováděl úpravy, ale to není vůbec korektní způsob)- od Delphi 2005 je podpora pro unit test framework DUnit (škoda, že nepoužívám takže nemohu sloužit)
Vylepšená podpora Windows Vista
Nezapomeňte nastavit Application.MainFormOnTaskBar := True v dpr souboru aby Visty mohly pěkně zobrazit obsah i minimalizovaného okna.
V Delphi 2007 přibyla pro TForm property GlassFrame, právě pro lepší podporu ve Vistách. Ale pozor! Není definována přímo jako property TForm (nebo TCustomForm), ale právě přes minule zmíněnou podporu ClassHelpers.
Podpora pro nové dialogy z Vist (TaskDialog API funkce) je přes komponentu TTaskDialog nebo transparentně přes MessageDlg, kde globální proměnná UseLatestCommonDialog
určuje, který dialog se bude volat (tj. XP nebo Vista).
Zaroveň byla přidána podpora pro nové CommonDialogs jako je TOpenDialog atd. Opět přes UseLatestCommonDialog lze specifikovat zda klasický TOpenDialog bude používat
jakou verzi (doporučené z hlediska kompatibility). Jinak existují speciální komponenty TFileOpenDialog a TFileSaveDialog. Ovšem jejich použití za běhu třeba na XP způsobuje
Project Project1.exe raised exception class EPlatformVersionException with message 'TFileOpenDialog requires Windows Vista or later'.
Při kompilaci je Warning: Unit2.pas(12): W1002 Symbol TFileOpenDialog is specific to a platform.
Podpora Themes alias stylů
IDE v Project Options nabízí volbu Enable runtime themes, což způsobí, že se linker hecne a přilinkuje manifest s povolenými styly a navíc v designeru budou styly pěkně vidět. Kromě toho byla vylepšena podpora některých komponent pro styly (mimochodem podpora stylů je původně od Mike Lischkeho, autora Virtual TreeView).
TreeView se zapnutými styly zobrazuje malé trojúhelníčky místo plus a mínus (jen na Vistách).
SOAP support
Byl vylepšen WSDL importer (v dalších verzích ještě mnohem více včetně konečně SOAP 1.2 v Delphi 2010) a je dostupný i jako samostatná aplikace včetně zdrojových kódů.
(c:\Program Files\CodeGear\RAD Studio\5.0\source\Win32\soap\wsdlimporter, je tam i pro Delphi 2009), popř.
c:\Program Files\CodeGear\RAD Studio\5.0\bin\WSDLImp.exe jako binárka.
Letem databázovým světem
Interně byla přidána podpora pro WideString do datových struktur pro databáze (např. TField má metody typu .AsWideString). A velkou změnou je přidání TWideDataSet = class (TDataSet, IProviderSupport2), kde zmíněný interface (někdy překládáno na Moravě jako meziksicht) používá WideString. Tato třída je bázovou třídou pro ADO, ClientDataset a většinu ostatních datasetů, kromě BDE.
Jen pár poznámek: dbExpress v Delphi 2006 je verze 3.x a podporuje Unicode (třeba pro MS SQL). dbExpress v Delphi 2007 byl kompletně přepsán do Delphi a jedná se o verzi 4.
Část kódu byla otevřena (zbytek byl až v Delphi 2009 nebo Delphi 2010).
Tak to bylo opravdu zjednodušeně Delphi 2007 a předchozí verze. Někdy příště bude Delphi 2009 (pro ty co nechtějí čekat doporučuji stáhnout knihu od Marka Cantu - jak jsem psal minule).