10.10.2013 Aufrufe

Morfik-Pascal

Morfik-Pascal

Morfik-Pascal

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!