Morfik-Pascal
Morfik-Pascal
Morfik-Pascal
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
mit<br />
_ _<br />
_<br />
1 Januar/ Das Werkzeug für den Softwareentwickler<br />
Febrauar<br />
OOP-Design mit Lazarus<br />
Java Lazarus . net<br />
Perl Delphi <strong>Morfik</strong><br />
_<br />
_ _<br />
2009<br />
OOP-Design mit Lazarus<br />
www.toolbox-mag.de<br />
Java<br />
Der Assembler der Virtual Machine<br />
.net<br />
Formularsteuerelemente<br />
mit Silverlight 2.0<br />
Bildbetrachter mit C#<br />
<strong>Pascal</strong><br />
Verschlüsselte<br />
Speicherstreams<br />
Iterieren mit Patterns<br />
Vista-Dialoge mit Delphi<br />
Perl<br />
Datenbankzugriffe mit DBI<br />
Alle Toolbox-<br />
Ausgaben<br />
1997–2008<br />
Der Datenträger enthält keine<br />
jugendbeeinträchtigenden Inhalte.<br />
Deutschland<br />
¤ 11,90<br />
Österreich<br />
¤ 13,50<br />
Schweiz<br />
sfr 23,80<br />
Bonus:<br />
73<br />
Toolbox-<br />
Ausgaben<br />
gratis auf<br />
Auf der Eclipse JEE Ganymede SR1 für Silverlight<br />
Microsoft Visual Studio 2008 SP1 deutsch<br />
NetBeans 6.5 deutsch IBM Lotus Symphony 1.2<br />
Lazarus 0.9.27 XAMPP 1.6.8 JDK und JRE 6u11<br />
Toolbox-Verlag B 12532 F
Web 2.0<br />
<strong>Morfik</strong>-<strong>Pascal</strong><br />
Timothy Woodward, <strong>Morfik</strong>-Entwickler<br />
Die Programmiersprache <strong>Pascal</strong> ist seit ihrem ersten Entwurf durch Niklaus Wirth an der ETH<br />
Zürich vielen Änderungen und Modernisierungen unterworfen worden. Früher war es Borland,<br />
das <strong>Pascal</strong> erweiterte, heute die Firma <strong>Morfik</strong> aus Tasmanien.<br />
<strong>Morfik</strong> AppsBuilder ist eine Entwicklungsumgebung für<br />
das Schreiben von AJAX-artigen Webanwendungen. Der<br />
Quelltext wird in einer Hochsprache geschrieben, bei der<br />
Version 2 des AppsBuilder wahlweise in <strong>Morfik</strong>-<strong>Pascal</strong><br />
oder <strong>Morfik</strong>-Basic. Dieser Quelltext wird dann – zusammen<br />
mit den Standard-Bibliotheken von <strong>Morfik</strong>, dem <strong>Morfik</strong>-Framework<br />
– als native Binärdatei, die auf dem Server<br />
läuft, kompiliert, der JavaScript-Anteil, der für die interaktiven<br />
AJAX-Anwendungen typisch ist, wird im Webbrowser<br />
ausgeführt.<br />
Obwohl <strong>Morfik</strong>-<strong>Pascal</strong> sehr ähnlich zum Sprachumfang<br />
von Delphi oder Free <strong>Pascal</strong> ist, besitzt es einige Eigenheiten<br />
und Spracherweiterungen, die hier gezeigt werden.<br />
Ausprobiert werden können die Programme mit der Apps-<br />
Builder-Version, die sich auf der CD-ROM zur Ausgabe 6<br />
der Toolbox befand, oder mit der Testversion, die von den<br />
Webseiten von <strong>Morfik</strong> heruntergeladen werden kann.<br />
Ein erstes »Hallo Welt«<br />
Um den Einstieg in die Entwickungsumgebung zu bekommen<br />
und die Grundstrukturen zu verdeutlichen, soll erst<br />
einmal das typische Hallo-Welt-Programm geschrieben<br />
werden.<br />
Es ist hier als <strong>Morfik</strong>-<strong>Pascal</strong>-Form zu sehen, typisch ist die<br />
Zweiteilung in den browser- und den serverseitigen Teil.<br />
Hier zuerst das Listing, dessen Umsetzung nach JavaScript<br />
im Browser ausgeführt wird:<br />
Unit “Hello World”;<br />
Interface<br />
Type<br />
“Hello World”=Class(Form)<br />
Button1: Button;<br />
Procedure Button1Click(Event: TDOMEvent); Message;<br />
Private<br />
{ Private declarations }<br />
Public<br />
End;<br />
{ Public declarations }<br />
Implementation<br />
Procedure “Hello World”.Button1Click(Event: TDOMEvent);<br />
Begin<br />
End;<br />
End.<br />
ShowMessage(‘Hello World!’);<br />
44 TOOLBOX | 1/2009<br />
Der Server-Teil ist sehr kurz:<br />
Unit “Hello World”;<br />
Interface<br />
Type<br />
“Hello World”=Class(Form)<br />
Button1: Button;<br />
Private<br />
{ Private declarations }<br />
Public<br />
End;<br />
{ Public declarations }<br />
Implementation<br />
End.<br />
Bei beiden Versionen wurde die Schreibweise im Original<br />
gelassen und nicht – wie sonst in der Toolbox üblich – die<br />
Großschreibung der Bezeichner bevorzugt. Das spielt aber<br />
für die Funktion keine Rolle, da alle Sprachen in <strong>Morfik</strong><br />
(das gilt auch für die Java- und C#-Variante!) nicht zwischen<br />
Groß- und Kleinschreibung unterscheiden.<br />
Wie die beiden Beispiele zeigen, ist der Unterschied des Programms<br />
zu einem Formular in Delphi oder auch Lazarus<br />
eher gering. Allerdings gibt es schon ein paar Unterschiede.<br />
Der auffälligste wurde bereits erwähnt: das Programm besteht<br />
aus dem browser- und dem serverseitigen Teil. Der<br />
OnClick-Event findet im Webbrowser statt, deshalb ist der<br />
Eventhandler Button1Click dazu im browserseitigen Code<br />
zu finden.<br />
Auch die Deklaration von Button1Click unterscheidet sich<br />
leicht von dem, was man aus Delphi gewohnt ist. Zuerst ist<br />
sie mit der Direktive Message markiert, was dem <strong>Morfik</strong>-<br />
Compiler mitteilt, daß die Methode ein Event-Handler ist.<br />
Zum zweiten besitzt der Event-Handler anstelle des Sender<br />
von Delphi einen Parameter vom Typ TDomEvent. Diese<br />
Klasse, die im Framework von <strong>Morfik</strong> deklariert ist, überträgt<br />
zusätzliche Informationen über den Event wie beispielsweise<br />
X- und Y-Koordinaten und ob Zusatztasten<br />
wie [Shift] oder [Strg] gedrückt sind.<br />
Der letzte wirklich große Unterschied ist im Namen des<br />
Forms zu sehen. <strong>Morfik</strong> hat sehr viel weniger strenge Regeln<br />
als Delphi und Free <strong>Pascal</strong>, wie gültige Bezeichner aussehen<br />
können.
In diesem Fall wurde ein Formularname gewählt, der ein<br />
Leerzeichen enthält (Hello World). Damit der Compiler<br />
diese Angabe als einzelnen Bezeichner wahrnimmt, muß er<br />
in doppelten Anführungszeichen stehen und mit “Hello<br />
World” angegeben werden. Strings sind in <strong>Morfik</strong>-<strong>Pascal</strong>,<br />
wie in <strong>Pascal</strong> allgemein üblich, in einfachen Anführungszeichen<br />
angegeben, an der Art der Anführungszeichen werden<br />
Bezeichner und Zeichenketten also problemlos unterschieden.<br />
Hilfsmethoden<br />
Hilfsmethoden sind eine neue Spracherweiterung in <strong>Morfik</strong><br />
2. Sie können sowohl an primitive Datentypen wie Integer,<br />
als auch an komplexe Datentypen wie Klassen angehängt<br />
werden. Sie bieten eine intuitive Alternative zu den<br />
üblichen prozeduralen Hilfsfunktionen und führen eine<br />
neue Ebene der Objektorientierung ein. Hier ein Beispiel,<br />
wie die Funktion IntToString ersetzt werden kann:<br />
TextLabel1.Caption := IntToStr(n); // Normale Hilfsfunktion<br />
TextLabel1.Caption := n.ToString; // Mit der Hilfsmethode<br />
Ein ganz trivialer Vorteil der Hilfsmethoden – abgesehen<br />
vom programmiertechnischen Aspekt – ist, daß man sie in<br />
der Liste der Quelltextvervollständigung leichter findet.<br />
Das Eingeben beispielsweise einer Stringvariable und eines<br />
anschließenden Punkts läßt sofort die Liste der für den Datentyp<br />
String verfügbaren Hilfsmethoden aufpoppen. Die<br />
Eingabe der ersten Buchstaben der benötigten Funktion<br />
engt die zur Auswahl stehenden Funktionen weiter ein (siehe<br />
Bild 1).<br />
Es ist im <strong>Morfik</strong> AppsBuilder auch möglich, eigene Hilfsmethoden<br />
zu schreiben und sie an beliebige Datentypen zu<br />
hängen – selbst an die primitiven.<br />
Im folgenden Beispiel wird angenommen, daß eine reguläre<br />
dezimale Integerzahl, die von Anwender eingegeben<br />
wird, in eine Oktalzahl umgewandelt werden soll. Dafür<br />
wird in zuerst eine Hilfsmethode geschrieben:<br />
Function Integer.ToOctalString: String;<br />
Var<br />
Bild 1: Das Finden der passenden Hilfsmethoden mit Intellisense<br />
Begin<br />
End;<br />
Value, Remainder: Integer;<br />
Value := Self;<br />
Result := ‘’;<br />
While Value > 0 Do Begin<br />
End;<br />
Remainder := Value Mod 8;<br />
Result := Remainder.ToString + Result;<br />
Value := Value Div 8;<br />
Diese neue Hilfsmethode kann jetzt im normalen Quelltext<br />
als Ergänzung zum Datentyp Integer aufgerufen werden.<br />
Das sieht folgendermaßen aus:<br />
Procedure Content.Button1Click(Event: TDOMEvent);<br />
Begin<br />
End;<br />
TextEdit2.Text := TextEdit1.Text.ToInteger.ToOctalString;<br />
Mit Hilfsmethoden können sehr elegant aber auch die<br />
Klassen des <strong>Morfik</strong> Frameworks erweitert werden. Eine<br />
neue Methode Pack als Ergänzung von TStringList kann<br />
an einer beliebigen Stelle im Projekt eingefügt werden:<br />
Procedure TStringList.Pack;<br />
Var<br />
i : Integer;<br />
Begin<br />
End;<br />
For i := Self.Count – 1 DownTo 0 Do<br />
If Self[i] = ‘’ Then Self.Delete(i);<br />
Web 2.0<br />
Dynalist ist eine Erweitung von <strong>Morfik</strong> für die bereits von<br />
Delphi bekannte Klasse TList. Sie bietet eine elegante Möglichkeit<br />
für das Arbeiten mit Wertelisten von einfachen,<br />
aber auch komplexen Datentypen, ohne daß Typumwandlungen<br />
erforderlich sind. Eine Dynalist wird folgendermaßen<br />
deklariert:<br />
TOOLBOX | 1/2009 45
Web 2.0<br />
Var<br />
X: List Of Y;<br />
Wobei X der Name der Variable ist und Y für den Datentyp<br />
der Elemente der Liste steht. Die Elemente der Dynalist<br />
können über die Default-Eigenschaft Items des Arrays angesprochen<br />
werden.<br />
Der Typ Dynalist<br />
Hier ein Beispielquelltext mit einer Dynalist-Variable. Er<br />
lädt eine Liste mit Integer-Zahlen auf einer Datei in eine<br />
Dynlist und kalkuliert anschließend die Summe der geraden<br />
Einträge in der Liste:<br />
Procedure WebMethod1.Execute;<br />
Var<br />
NumbersFile : File Of Integer;<br />
NumbersList : List Of Integer;<br />
Value : Integer;<br />
EvenTotal : Integer;<br />
i : Integer;<br />
Begin<br />
NumbersList.Init;<br />
AssignFile(NumbersFile, ‘c:\numbers.data’);<br />
Reset(NumbersFile);<br />
While Not EOF(NumbersFile) Do Begin<br />
Read(NumbersFile, Value);<br />
NumbersList.Add(Value);<br />
End;<br />
CloseFile(NumbersFile);<br />
EvenTotal := 0;<br />
For i := 0 To NumbersList.Count – 1 Do Begin<br />
End;<br />
If NumbersList[i] Mod 2 = 0 Then<br />
EvenTotal := EvenTotal + NumbersList[i];<br />
Bild 2: Der Web Action Wizard<br />
46 TOOLBOX | 1/2009<br />
NumbersList.Free;<br />
End;<br />
Das Beispiel zeigt, daß Dynalists mit Init einen besonderen<br />
Konstruktor besitzen.<br />
Kommentare mit <strong>Morfik</strong>Doc<br />
<strong>Morfik</strong> unterstützt wie auch Free <strong>Pascal</strong> einen besonderen<br />
Kommentartyp. <strong>Morfik</strong>Doc dient dazu, dem Entwickler zusätzliche<br />
Informationen in der Liste für die Codevervollständigung<br />
anzuzeigen. Wie das fertig aussieht, zeigt der beschreibende<br />
Text im Tooltip unter der Funktion in Bild 1.<br />
Das <strong>Morfik</strong>-Framework enthält eine große Zahl solcher<br />
<strong>Morfik</strong>Doc-Kommentare, es bietet sich aber auch an, diese<br />
Hilfen im eigenen Quelltext einzufügen.<br />
Ein <strong>Morfik</strong>Doc-Kommentar wird immer direkt vor der Deklaration,<br />
zu der er gehört, geschrieben. Der Hilfetext wird<br />
dann in eine besondere Abwandlung der Syntax von <strong>Pascal</strong>-Kommentaren<br />
eingefaßt. Hier ein Beispiel aus der Datei<br />
SystemUtilities.mmd im <strong>Morfik</strong>-Framework:<br />
(**<br />
* This function returns a Boolean value according to the<br />
* contents of the string parameter.<br />
*)<br />
Function StrToBool(S: StringP>): Boolean;<br />
Eine Web Action in <strong>Morfik</strong> ist eine besondere Art von Prozedur,<br />
Aufrufe an Web Actions werden im AppsBuilder visuell<br />
entworfen oder bearbeitet. Werfen Sie einem Blick auf<br />
die folgende Deklaration, die sich in der Datei SystemActions.mmd<br />
im <strong>Morfik</strong>-Framework befindet:<br />
Procedure OpenWebSite(SiteURL: String);<br />
[‘WebAction=True’,<br />
‘WACategory=form’];
Sie definiert eine Web Action, mit der eine Webseite geöffnet<br />
werden kann. Zu beachten sind insbesondere die Tags<br />
in eckigen Klammern hinter der Deklaration. Sie übermitteln<br />
die folgenden Informationen an den <strong>Morfik</strong>-Compiler:<br />
1. WebAction=True heißt, daß diese Prozedur eine Web<br />
Action ist.<br />
2. WACategory=form bedeutet, daß diese Web Action in<br />
die Kategorie der Forms gehört.<br />
Angenommen, es soll eine externe Webseite geöffnet werden,<br />
wenn der Anwender auf eine Schaltfläche in der Anwendung<br />
klickt. Man könnte dazu einen OnClick-Eventhandler<br />
für den Button schreiben und darin den Quelltext<br />
unterbringen, mit dem die Prozedur OpenWebSite aufgerufen<br />
wird.<br />
Actions im Web<br />
Es gibt aber einen einfacheren Weg: Im Panel Events wird<br />
der elliptische Button neben dem OnClick-Event des Buttons<br />
(»On Click«) betätigt. Das startet den Wizard für Web<br />
Actions (siehe Bild 2). Mit ihm wird eine Web Action ausgewählt<br />
und die Werte deren Parametern (in diesem Fall SiteURL)<br />
zugewiesen.<br />
Das Ergebnis der Arbeit mit dem Web Action Wizard ist<br />
ein Quelltext, wie er in Bild 3 gezeigt ist. Das kleine Symbol<br />
(der Smart Tag) unter der Prozedur ist dabei entscheidend.<br />
Damit wird jederzeit der Editor aufgerufen, mit dem<br />
die Web Actions bearbeitet werden.<br />
Diese Abschnitte zeigten, daß <strong>Morfik</strong>-<strong>Pascal</strong> mit dem Dialekt<br />
von Delphi und Free <strong>Pascal</strong> sehr eng verwandt ist. Wer<br />
also mit den anderen Entwicklungssystemen bereits gearbeitet<br />
hat, fühlt sich in diesem Entwicklungssystem sofort<br />
zuhause.<br />
<strong>Morfik</strong>-<strong>Pascal</strong> besitzt aber einige moderne Zusatzfunktionen<br />
und intelligente Spracherweiterungen, an denen man<br />
sieht, daß die VCL eben doch schon über ein Dutzend Jah-<br />
Bild 3: Das Ergebnis des Startens des Web Action Wizards,<br />
zu beachten ist der »Smart Tag« unter dem Aufruf von<br />
OpenWebSite<br />
Delphi 2009 und TSerial<br />
Web 2.0<br />
Fast jede neue Delphi-Version macht Anpassungen von Komponenten<br />
erforderlich. Wer auf Delphi 2009 von Embarcadero/Codegear<br />
aktualisiert und hier die Komponente TSerial installieren will, erhält<br />
dann auch prompt eine Fehlermeldung. Die Version 4.3 von TSerial<br />
läßt sich jedoch auch mit dem neuen Compiler und seiner wieder<br />
nur leicht veränderten VCL nutzen, es muß nur eine Änderung ab<br />
der Zeile 913 der Datei serial.pas eingepflegt werden. Im Original<br />
steht hier<br />
if j>9 then<br />
FPorts.AddObject(StrPas(@c[4]),TObject(ci))<br />
Für Delphi 2009 muß eine zusätzliche lokale Variable in dieser Prozedur<br />
definiert werden und über sie wird dann iteriert:<br />
if j>9 then begin<br />
for ii := 4 to 63 do c1[i-4] := c[i];<br />
FPorts.AddObject(c1, TObject(ci))<br />
end<br />
Der else-Zweig der Abfrage bleibt unverändert.<br />
Eine von Hans-Josef Mennen an Delphi 2009 angepaßte Version<br />
der Unit befindet sich auf der DVD zu dieser Ausgabe, sie ist durch<br />
die Versionsnummer 4.3.2009 gekennzeichnet und sonst nicht gegenüber<br />
Serial 4.3 geändert. Die angepaßte Routine wird über bedingte<br />
Kompilierung nur in Delphi 2009 angesprungen, die Kennung<br />
dieses Compilers ist inzwischen schon bei VER200 angelangt und<br />
entsprechend im Dateikopf eingetragen. Um die Komponentensammlung<br />
mit dem neuen Delphi-Compiler korrekt zur Funktion zu<br />
bringen, sollte unter Projekt|Optionen|Delphi-Optionen|Unit-Aliase<br />
außerdem der Eintrag WinTypes=Windows;WinProcs=Windows<br />
hinzugefügt werden.<br />
Wer noch mit älteren Versionen von TSerial arbeitet, sollte die<br />
Komponentensammlung dringend aktualisieren, die restlichen Daten<br />
zu TSerial 4.3 befinden sich im Archiv im Verzeichnis bei den<br />
Quellen zur Ausgabe 2’2007.<br />
re alt ist und inzwischen Staub angesetzt hat. Bei Free <strong>Pascal</strong><br />
und Lazarus mit ihrer größtmöglichen Kompatibilität<br />
zu Delphi vermißt man ebenfalls moderne objektorientierte<br />
Funktionen (siehe auch den Beitrag von Graeme Geldenhuys<br />
zu Patterns in dieser Ausgabe), die Sprachen wie<br />
Java längst vorgemacht haben und die man in <strong>Morfik</strong>-<strong>Pascal</strong><br />
findet.<br />
Die hier gezeigten Neuerungen in <strong>Morfik</strong>-<strong>Pascal</strong> steigern<br />
die Produktivität des Software-Entwicklers. Eine der besten<br />
Stellen für weitere Beispiele bietet das Framework<br />
selbst.<br />
■<br />
TOOLBOX | 1/2009 47