Lektion 21 - Oberflächlich gesehen...

Erstellt von Frithjof Fri, 12 Sep 2008 22:11:00 GMT

Der nächste Block von 7 + 3 Lektionen liegt vor uns. Sie machen dich mit der Programmierung von grafischen Benutzeroberflächen bekannt. Alle bisher mit rubykids.de entwickelten Programme waren rein textbasiert, die Ein- und Ausgabe erfolgte auf der Kommandozeile in einer DOS-Box. Das wird nun anders. Du lernst mit FXRuby eine mächtige Programmbibliothek für Ruby kennen, die dir bei der Entwicklung von Oberflächen hilft.

Das Problem mit Ruby ist, dass es eigentlich selbst überhaupt nicht mit grafischen Oberflächen umgehen kann, denn hierfür ist eine nahe Kommunikation mit der Grafik-Hardware und den Tiefen des Betriebssystems notwendig. Ruby bedient sich daher anderer Bibliotheken, die in den Programmiersprachen C oder C++ entwickelt sind. Ruby verfügt über einen eingebauten Mechanismus, der es erlaubt in diesen Fremdsprachen entwickelten Code zu nutzen und Programmbefehle in Ruby auf diese weiter unten liegende Codeebene weiterzugeben. Mehr noch, die Programmiersprache Ruby, d.h. der Ruby-Interpreter, ist selbst mit Hilfe der Programmiersprache C entwickelt.

Das musst du immer irgendwie im Hinterkopf behalten, denn Rubycode, der grafische Oberflächen erzeugt ist irgendwie anders als normaler Rubycode. Man könnte auch sagen, er ist ein wenig ekelig. Aber nun will ich dir nicht die ganze Vorfreude nehmen, fangen wir an…

Als Auftakt unserer Erkundungstour der neuen schönen grafischen Welt nehmen wir uns mal nicht zu viel vor. Wir teilen uns die Arbeit in kleine Schritte auf:
  • Installation von FXRuby
  • Ausprobieren, ob alles funktioniert mit einem ersten kleinen Hallo Welt! Programm.

FXRuby installieren

Die Installation geht los mit dem Aufruf des GEM Packetmanagers mit dem Befehl gem install fxruby. Aus der Liste der möglichen Installationen wählst du die für deinen PC geeignetste aus, in meinem Falle ist es die Nummer 2 für fxruby 1.6.16 (x86-mswin32-60).

In einer DOS-Box sieht die Installation dann etwa so aus:


[12.09.2008, 21:54]:> gem install fxruby
Bulk updating Gem source index for: http://gems.rubyforge.org
Select which gem to install for your platform (i386-mswin32)
 1. fxruby 1.6.16 (universal-darwin-9)
 2. fxruby 1.6.16 (x86-mswin32-60)
 3. fxruby 1.6.16 (ruby)
 4. fxruby 1.6.15 (x86-mswin32-60)
 5. fxruby 1.6.15 (universal-darwin-9)
 6. fxruby 1.6.15 (ruby)
 7. Skip this gem
 8. Cancel installation
> 2
Successfully installed fxruby-1.6.16-x86-mswin32-60
Installing ri documentation for fxruby-1.6.16-x86-mswin32-60...
Installing RDoc documentation for fxruby-1.6.16-x86-mswin32-60...

[12.09.2008, 22:01]:>

Ausprobieren, ob FXRuby funktioniert

Jedes Rubyprogramm, das FXRuby für die Erzeugung von Oberflächen verwendet, muss die Bibliothek mit dem require Befehl dem Programm bekannt machen. Somit beginnt jedes FXRuby Programm immer so:


# lektion_21.rb

require 'fox16'

Das kannst du bereits versuchen, mit dem Ruby-Interpreter auszuführen:


[12.09.2008, 22:06]:> ruby lektion_21.rb

[12.09.2008, 22:06]:>

Keine Fehlermeldung bedeutet, FXRuby ist ordnungsgemäß installiert. Dem FXRuby Hallo, Welt! Programm steht nun nichts mehr im Wege!


# lektion_21.rb

require 'fox16'

application = Fox::FXApp.new

mainWin = Fox::FXMainWindow.new(application, "Rubykids.de")
Fox::FXLabel.new(mainWin, "Hallo, Welt!")

application.create
mainWin.show(Fox::PLACEMENT_SCREEN)

application.run

Betrachte zunächst nur die Variable application.

Zuerst wird sie mit einem frischen Objekt der Klasse Fox::FXApp angelegt. Dieses Objekt steuert und verwaltet die gesamte Oberfläche.

Mit dem Aufruf von create wird dem Objekt application mitgeteilt, die Oberfläche im Hintergrund, noch unsichtbar aufzubauen. Hier passiert eine Menge, bspw. muss die gesamte Geometrie der Oberfläche berechnet und jedes Element an seinen Platz gemalt werden.

Zum Schluß startet der Aufruf der run Methode schließlich die Anwendung. Nun wartet sie an der Oberfläche auf Eingaben von dir, bspw. ein Klick mit der Maus oder ein Tastendruck. Vom Aufruf dieser run Methode kehrt das Rubyprogramm erst zurück, wenn die Anwendung irgendwo an der Oberfläche beendet wird. Run ist also eine absichtlich programmierte Endlosschleife.

Die Anwendung selbst braucht immer ein Hauptfenster als Objekt der Klasse Fox::FXMainWindow. Die Anwendung selbst ist unsichtbar. Das Hauptfenster macht die eigentliche Oberfläche aus. Es dient dann als Rahmen für alle anderen Dinger, die an der Oberflächengestaltung mitwirken. Man nennt diese Dinger auch Widgets, oder zu deutsch Steuerelemente. Eine Drucktaste ist ein Widget, oder ein Textfeld.

Unser Hauptfenster beinhaltet zunächst nur ein Anzeigetext, ein Label als Objekt der Klasse Fox::FXLabel. Ein Steuerelement wird dem Hauptfenster dadurch hinzugefügt, dass bei der Erzeugung des Elements das Hauptfenster als erster Parameter mitgegeben wird. So weiß unser Label sofort, dass es zum mainWin Fenster gehört.

Sind alle Steuerelemente hinzugefügt und hat die Anwendung (application) die Geometrie berechnet, kann sich das Hauptfenster der Öffentlichkeit mit dem Aufruf der Methode show präsentieren. Mit einem Parameter können wir der show Methode noch mitteilen, wo das Fenster auftauchen soll. Wir legen mit PLACEMENT_SCREEN fest, dass es zentriert auf unserem Bildschirm erscheinen möge.

Du merkst schon, verglichen mit einem Hallo, Welt! auf der Konsole in einer Zeile mit puts ist bei einer grafischen Version schon bedeutend mehr zu tun.

So sieht es dann aus:

Peter und Livia

Peter: Alles prima, aber warum kann man den Text “Rubykids.de” in der Titelleiste des Hauptfensters nicht vollständig lesen? Von einer Software aus dem 21. Jahrhundert müsste man das doch erwarten können und außerdem…

Livia: Schon gut, reg’ dich ab! Das liegt am Layoutmanager, der von der Anwendung intern verwendet wird. Der Manager versucht die Oberfläche geometrisch zu optimieren. Wenn man ihm nicht sagt, wieviel Platz er verwenden soll, versucht er alles so platzsparend wie möglich anzuordnen. Entscheidend dafür sind die Steuerelemente auf dem Hauptfenster, also in diesem Fall nur die Breite des Textes für das Label. Der Text in der Titelleiste ist kein Steuerelement und wird daher auch nicht in der gleichen Weise bei der Geometrie berücksichtigt. Allerdings sorgt Windows noch dafür, dass wenigstens die Standard-Icons zur Bearbeitung des Fensters (Minimieren, Beenden,...) vollständig angezeigt werden. Daher ist das Fenster etwas breiter als das Label, aber nicht breit genug für den Titeltext.