Preview Delphi 2009 (Tiburon)
Dieser Artikel wurde zu einem Zeitpunkt geschrieben, zu dem Delphi 2009 noch nicht veröffentlicht war. Die Inhalte basieren auf den Blog-Einträgen von CodeGear-Mitarbeitern und sollen einen Überblick geben, welche Dinge in der neuen Delphi-Version zu erwarten sind. Natürlich gibt es keine Garantie, dass das Release dann auch alle aufgeführten Neuerungen enthält!
Unicode
Delphi 2009 unterstützt Unicode, wofür die komplette VCL, RTL, IDE und die Sprache selbst umgestellt werden musste. Der Typ „String“, der in Delphi 1 ein Alias für „ShortString“ und in den folgenden Versionen für „AnsiString“ war, wird nun ein „UTF8String“. Der AnsiString richtete sich bislang nach der Codepage, die zur Laufzeit gültig war. CodeGear hat die Implementierung nun so erweitert, dass man bereits zur Compile-Zeit festlegen kann, welche Codepage verwendet werden soll. Der UTF8String ist wie folgt definiert:
type UTF8String = type AnsiString(CP_UTF8);
Wird dieser UTF8String als Parameter einer Methode verwendet, wird sichergestellt, dass der String-Wert automatisch beim Aufruf nach UTF-8 konvertiert wird, auch wenn es sich vorher um einen normalen AnsiString gehandelt hat.
Die Umstellung auf Unicode ermöglicht es nun auch, mit den bekannten Datenbankkomponenten UTF-8-kodierte Texte aus Datenbanken zu lesen, ohne dass es zu Zeichensatzproblemen kommt.
Und auch wer nur einfache Textdateien verwendet, kommt in den Genuss von Unicode: Die Methoden LoadFromFile und SaveToFile von TStrings wurden überladen, so dass sie nun optional mit einem zusätzlichen Parameter namens „Encoding“ aufgerufen werden können. Damit sind z.B. die folgenden Aufrufe möglich:
Listbox1.Items.LoadFromFile(’c:tempMyListBoxItems.txt’,TEncoding.UTF8) ListBox1.Items.SaveToFile(’MyListBoxItems.txt’,TEncoding.UTF8);
Neue VCL-Komponenten
Tiburon enthält einige neue VCL-Komponenten:
- TCategoryPanels: Panels, die verschiedene Gruppierungen anzeigen können
- TLinkLabel: Ein Label, das einen Link wie auf einer Webseite enthält
- TBallonHint: Ein Hint in Form einer Sprechblase, die unter Vista auch Icons enthalten kann
- TButtonedEdit: Ein Eingabefeld, in das ein Button integriert ist (s. Screenshot unten)
Außerdem wurden bestehende Komponenten erweitert. So kann TEdit nun einen Hint anzeigen, wenn ungültige Zeichen eingegeben wurden:
Neues in der IDE
Die Toolpalette enthält nun ein Eingabefeld für die Komponentensuche:
Außerdem gibt es eine neue View zur Anzeige aller verfügbaren Type Libraries.
Der COM/ActiveX-Assistent wurde überarbeitet.
Neues im Debugger
Der Debugger unterstützt nun unter Windows Vista und Windows Servier 2008 die neue API Vista Wait Chain Traversal. Damit kann man detaillierte Informationen über Deadlocks, die im eigenen Programm auftreten, erhalten. Genauere Informationen dazu sind im Blog von Chris Hesik zu finden.
Neue Sprach-Features
Anonyme Methoden
Mit Tiburon unterstützt Delphi nun auch anonyme Methoden. Dabei handelt es sich um Funktionen oder Prozeduren ohne Namen. So kann einer Variablen direkt ein Code-Block zugewiesen werden (Methodenzeiger), ohne dass diese Methode noch einen eigenen Namen benötigt. Beispiel:
Deklaration:
type // method reference TProc = reference to procedure(x: Integer); procedure Call(const proc: TProc); begin proc(42); end;
Verwendung:
var proc: TProc; begin // anonymous method proc := procedure(a: Integer) begin Writeln(a); end; Call(proc); readln end.
Generics
Tiburon wird Generics unterstützen, mit deren Hilfe man z.B. eine Liste erzeugen kann, die nur Elemente eines bestimmten Typs aufnimmt. Die Unit Generics.Collections enthält dabei TList, TQueue, TStack, TDictionary, TObjectList, TObjectQueue, TObjectStack und TObjectDictionary.
TList<T> = class private FItems: array of T; FCount: Integer; procedure Grow(ACapacity: Integer); function GetItem(AIndex: Integer): T; procedure SetItem(AIndex: Integer; AValue: T); public procedure Add(const AItem: T); procedure AddRange(const AItems: array of T); procedure RemoveAt(AIndex: Integer); procedure Clear; property Item[AIndex: Integer]: T read GetItem write SetItem; default; property Count: Integer read FCount; end;
Verwendung:
var ilist: TList<Integer>; slist: TList<String>; procedure PrintListInteger; var i: Integer; begin for i := 0 to ilist.Count - 1 do Write(ilist[i], ' '); Writeln; end; procedure PrintListString; var i: Integer; begin for i := 0 to slist.Count - 1 do Write(slist[i], ' '); Writeln; end; begin ilist := TList.Create; try ilist.AddRange([1, 2, 3]); // ['1', 'second', 'third']); PrintListInteger; ilist.RemoveAt(1); PrintListInteger; ilist.Clear; PrintListInteger; finally ilist.Free; end; slist := TList.Create; try slist.AddRange(['one', 'two', 'three']); // ['first', 'second', 'third']); PrintListString; slist.RemoveAt(1); PrintListString; slist.Clear; PrintListString; finally slist.Free; end; Readln; end.
Methoden beenden
Während „return“ in Java die Ausführung einer Methode sofort beendet und auch einen Rückgabewert zurückgegen kann, musste man in Delphi erst der „result“-Variablen einen Wert zuweisen und dann mit „exit“ beenden. Mit Tiburon gibt es nun eine neue Möglichkeit:
function DoStuff(Value: Boolean): Integer; begin< if Value then Exit(1); Result := 0; end;
TStringBuilder
Die Tiburon-Runtime Library (RTL) enthält eine neue Klasse namens TStringBuilder, die das Zusammensetzen von Strings vereinfacht. Dabei wird das Anhängen, Ersetzen und Einfügen unterstützt. Beispiel:
procedure TForm1.example; var myStringBuilder: TStringBuilder; newVersion: SmallInt; begin myStringBuilder := TStringBuilder.Create; try newVersion := 2009; myStringBuilder.Append('Tiburon - ').Append('The new Delphi ').Append(newVersion); myStringBuilder.Append('and').Append('C++Builder ').Append(newVersion);) MessageDlg(myStringBuilder.ToString, mtInformation, [mbOk], 0); myStringBuilder.Replace('and', ' and '); MessageDlg(myStringBuilder.ToString, mtInformation, [mbOk], 0); finally myStringBuilder.Free; end; end;
Datenbankanbindungen
Tiburon enthält eine neue komponentenbasierte DataSnap-Server-Technologie, die nicht mehr DCOM verwendet, sondern JSON/RPC. Weitere Informationen hierzu sind im Blog von Steve Shaughnessy zu finden.
Danke...
Danke an Seppy Bloom, Andreano Lanusse, Allen Bauer, Anders Ohlsson, Chris Bensen, David I. und Nick Hodges für ihre Blogeinträge, aus denen obige Informationen stammen!
Aktuelles ist unter blogs.codegear.com zu finden.