Gambas: Basic f�r Linux

ArticleCategory:

Software Development

AuthorImage:[Author image]

Jonas Alvarez

TranslationInfo:[Translation info]

original in es Jon�s Alvarez

es to en Miguel Alfageme S�nchez, Samuel Landete Benavente.

en to de J�rgen Pohl

AboutTheAuthor:[]

Jon�s Alvarez hat mehrere Jahre als Entwickler f�r Anwendungen in Unix- und Windowsumgebungen gearbeitet. Unter anderem gab er Kurse �ber Betriebssysteme, Netzwerke und Entwicklung.

Abstract:[Peque�o sumario del art�culo]

Gambas ist eines der heute zur Verf�gung stehenden Basics f�r Linux. In diesem Artikel werden wir anhand eines Beispiels zeigen, wie einfach und wirkungsvoll Gambas f�r die t�gliche Anwendung sein kann.

ArticleIllustration:[Ilustraci�n para la cabecera del art�culo]

Dibujo de una gamba

ArticleBody:[Article content]

Einf�hrung

Basic ist eine der am meisten verbreiteten und einfachsten Programmiersprachen, besonders f�r Anf�nger. Microsoft Visual Basic IDE war bisher die bekannteste Umgebung f�r die Entwicklung von Basicanwendungen. Linux verbreitet sich neuerdings auf den Benutzer-Desktops. Bisher begrenzt auf Severanwendungen und Guru-Benutzer, entwickelt es sich zum Betriebssystem auf Clientmaschinen f�r E-mail, Surfen im Web und Bearbeiten von Texten. Diesem Trend folgend stehen jetzt mehrere Basic-Entwicklungsumgebungen zur Verf�gung. Gambas ist die, die wir in diesem Artikel vorstellen, eine graphische Entwicklungsumgebung f�r Basic. Der Programmierstil �hnelt dem von Visual Basic. Wie wir sp�ter sehen werden gibt es jedoch auch Unterschiede. Ich werde Version 0.64a benutzen, die Teil meiner SuSE 9.0-Distribution ist. Auf der Projektseite von Gambas k�nnen wir feststellen, dass 0.81 die neueste Version ist, unser Artikel wird davon nicht beeinflusst.

Wen k�nnte Gambas interessieren?

Als langzeitiger Entwickler von Basic-Anwendungen war es f�r mich einfach, mit diesem Beispiel zu beginnen. Ich wende Gambas hier zum erstem Mal an, was beweist, dass es f�r Visual Basic-Kenner einfach zu beherrschen ist. F�r andere sollte es eine Demonstration sein, wie einfach Basic f�r viele Dinge n�tzlich sein kann.

Das Beispiel

Weil ich am liebsten durch die Praxis lerne, fangen wir mit einem Beispiel an. Es ist die sehr einfache Anwendung einer laufenden Stoppuhr auf dem Bildschirm. Wir k�nnen die Zeit einstellen, stoppen und starten, ganz nach Wunsch.

Kurz nachdem wir Gambas starten, treffen wir den Assistenten:

startup

Wir w�hlen New Project. Im n�chsten Fenster werden wir nach dem Project Name gefragt. Wir nennen unser Projekt CountDown. Im Zweiten Dialog m�ssen wir unser project directory w�hlen. Wir geben dort unser Arbeitsverzeichnis an. In der Textbox unten geben wir den Namen f�r das neue Verzeichnis ein.

new project

Beim ersten �ffnen von Gambas, oder wenn wir die Option nicht abgestellt haben, erscheint der 'Ratschlag des Tages'. Wir lesen, was uns interessiert und schliessen dann das Fenster. Damit sind wir bereits in der Arbeitsumgebung. Auf unserem Desktop sehen wir mehrere Fenster. Benutzen wir eine Umgebung, wie z.B. KDE, mit mehreren Desktops, w�re es am besten, einen der Desktops Gambas zuzuordnen, um alle seine Fenster unter Kontrolle zu haben. Eine der ersten Optionen, die ich in KDE aktiviere, ist, da� jeder Desktop nur seine eigenen Icons anzeigt.

Wir werden jetzt die Hauptform unserer Applikation erstellen. Daf�r klicken wir mit der rechten Maustaste irgendwo in das Projektfenster und erzeugen eine neue Form.

new form

Im Dialogfenster geben wir der Eingabemaske ('New form') einen Namen, in unserem Fall FCountDown, alle seine Werte lassen wir in der Grundeinstellung.

new form dialog

Damit haben wir unse erste Eingabemaske, die zur Zeit leer ist.

form

Hier werden wir die Bedienelemente f�r unsere Stoppuhr zusammenstellen. Wir klicken auf die Schaltfl�chen der Werkzeugleiste, die wir in unserer Eingabemaske haben wollen. Fahren wir mit dem Mauszeiger �ber eine Schaltfl�che, erscheint deren Name. Mit einem Doppelklick kopieren wir das entsprechende Werkzeug in die obere linke Ecke unserer Eingabemaske. Mit einem einfachen Klick k�nnen wir es in der Eingabemaske an die gew�nschte Stelle bringen und die Gr�sse �ndern. F�r unser Programm ben�tigen wir ein Label, eine Textbox, einen Timer, zwei Schaltfl�chen und einen Tastschalter.

controls

Sobald die Schaltfl�chen an ihrem Platz sind, sieht das ungef�hr so aus (mehr oder weniger, je nach pers�nlichem Geschmack):

controls in place

Nachdem wir die Schaltfl�chen in unserer Eingabemaske haben, �ndern wir deren Namen, so dass sie die gew�nschten Funktionen ausdr�cken. Daf�r bearbeiten wir Name im Property Sheet. Falls wir das Property Sheet nicht auf dem Bildschirm sehen, k�nnen wir es mit der Eigenschaften-Dialogfl�che aktivieren. Diese erscheint, wenn wir mit dem Mauszeiger �ber die entsprechende Schaltfl�che fahren.

Ich nenne die Label1-Schaltfl�che lblContador: Ich klicke auf die Schaltfl�che, �ndere deren Namen im Property Sheet. Das geschieht mit der �nderung der Name-Eigenschaft und der Eingabe von lblContador als Wert. Danach �ndere ich auf einen gr�sseren Fontwert. Daf�r w�hle ich Fonttyp Courier Bold 72 als font-Eigenschaft der Schaltfl�che und klicke OK. Auf die gleiche Weise �ndere ich den ToggleButton1 auf Courier Bold 72 und den Namen auf tglFuncionando. Die TextBox1 Schaltfl�che wird txtSegundos, die Timer1-Schaltfl�che wird clkMiReloj, Button1 wird cmdPonerSegundos und zuletzt �ndere ich Button2 zu cmdSalir. Ausserdem �ndere ich das Alignment von txtSegundos auf Right.

Jetzt beginnen wir mit dem Basiccode. Es ist sehr einfach und nicht sehr strikt mit der Syntax. Zuerst �ndern wir den Text auf der Eingabemaske zu realistischeren Werten. Obwohl viele Optionen mittels Basic ge�ndert werden k�nnen, h�tten wir das auch bei den Eigenschaften der Schaltfl�chen durchf�hren k�nnen, beide Methoden f�hren zum gleichen Ergebnis.

Sobald die Eingabemaske offen ist, geben wir den Titel f�r jede Schaltfl�che ein. Mit dem Ausdruck 'sobald die Eingabemaske offen ist' meinen wir die Ausf�hrung eines Vorgangs: die Eingabemaske �ffnen. Um das auszuf�hren, doppelklicken wir auf einen Teil der Eingabemaske, der keine Schaltfl�chen enth�lt. Ein Bearbeitungsfenster wird ge�ffnet und der Cursor befindet sich innerhalb eines neuen Vorgangs: Public Sub Form_Open() (falls wir schon mal mit Visual Basic programmiert haben, benutzten wir den Form_Load-Vorgang). Wir bezeichnen die lblContador-Schaltfl�che zur Anzeige der verbleibenden Sekunden des Countdowns. Die ersten Zeilen des Codes der Control-Klasse sehen so aus:

' Gambas class file
CONST fSegundosPorDefecto AS Float=120.0
fSegundos AS Float

PRIVATE SUB VerValores()
  DIM nMinutos AS Integer
  
  nMinutos = Int(Int(fSegundos) / 60)
  lblContador.Caption = nMinutos & ":" & Format (fSegundos - 
                                                nMinutos * 60, "00.0")
END

PRIVATE SUB VerActivarDesactivar()
  IF tglFuncionando.Value THEN
    tglFuncionando.Text = ("&Detener")
  ELSE
    tglFuncionando.Text = ("&Arrancar")
  ENDIF
END

PUBLIC SUB Form_Open()
  fSegundos = fSegundosPorDefecto
  VerValores
  tglFuncionando.Value = FALSE
  VerActivarDesactivar
  txtSegundos.Text = fSegundos
  cmdPonerSegundos.Text = ("&Reiniciar")
  cmdSalir.Text = ("&Salir")
END

Direkt nach dem von Gambas generierten Kommentar 'Gambas class file haben wir eine Konstante mit der Grundeinstellung der Anzahl der Sekunden f�r den Countdown fSegundosPorDefecto hinzugef�gt, mit dem Wert 120 Sekunden (zwei Minuten) und eine Variable, fSegundos, die den Countdown durchf�hrt. Wir haben auch zwei Vorg�nge eingef�hrt: VerValores, welcher die Countdownwerte anzeigt und VerActivarDesactivar, der den Text der Start/Stop-Schalter �ndert.

Jetzt haben wir schon eine Eingabemaske, die funktioniert. Sie hatte bis jetzt keinen praktischen Wert, ausser uns zu zeigen, was wir durchgef�hrt haben, probieren wir's also aus. Wir speichern unsere �nderungen vom Hauptfenster unseres Projekts, Project CountDown und starten die Anwendung mit F5 oder mit der Execute-Schaltfl�che im gleichen Fenster. Wir sollten folgendes sehen:

Project CountDown

Ist das nicht der Fall oder wir erhalten eine Fehlermeldung, m�ssen wir unser bisheriges Beispiel �berpr�fen. Selbst, wenn wir Start, Reset oder Exit bet�tigen, passiert nichts. Das wird also unsere n�chste Aufgabe: den Schaltfl�chen derart Funktionen zuteilen, dass etwas geschieht, wenn der Benutzer irgendetwas bet�tigt. Bevor wir weitermachen, sollten wir etwas mit unserer Anwendung spielen, um herauszufinden, was m�glich ist. Um sie zu schliessen bet�tigen wir den X-Schalter oben rechts. Ich bin in KDE mit dem SuSE-Motiv, wie man an den Eingebemasken sehen kann. Es ist m�glich, dass Sie das Fenster (der Anwendung) auf eine andere Weise schliessen m�ssen.

Probieren wir die einfachste Schaltfl�che: was muss geschehen, wenn der Benutzer Exit bet�tigt? Die Anwendung sollte geschlossen werden. Um den Basiccode vorzustellen, der ausgef�hrt wird, wenn der Benutzer diesen Schalter bet�tigt, doppelklicken wir auf den Schalter mit der Aufschrift Exit (cmbExit). Wir stellen fest, dass Gambas einige Zeilen Code erzeugt hat, mit dem Cursor zwischendrin. Hier muss der Code eingef�gt werden. Dieser wird ausgef�hrt, wenn der Benutzer auf diese Schaltfl�che klickt. Um die Anwendung zu schliessen, m�ssen wie Me.close ausf�hren, der Code f�r diesen Vorgang sieht so aus:

PUBLIC SUB cmdSalir_Click()
ME.Close
END

Die n�chste Schaltfl�che, die wir pr�fen wollen, ist Reset. Wie schon gehabt: doppelklicken auf die Schaltfl�che und im Codefenster von Gambas m�ssen wir folgendes einf�gen:

 PUBLIC SUB cmdPonerSegundos_Click()
fSegundos = txtSegundos.Text
VerValores
END

Wie wir feststellen, passiert immer noch nichts. Wir m�ssen unserer Anwendung etwas auf die Beine helfen. Wir werden das Timer-Objekt aktiv machen, es war schon von Anfang an in der Eingabemaske. Das geschieht mit der Einstellung des Intervals der Zeitaufnahme. Wir k�nnen das entweder mit Code - wie im vorangegangenen Ablauf �ber Form_Open - oder �ber die Eingabemaske durchf�hren. In der Eingabemaske klicken wir auf das Objekt Timer und sein Property Sheet, dort �ndern wir den Delay-Wert von 1000ms auf 100, um einen Vorgang alle Zehntel einer Sekunde zu empfangen - das wird die Genauigkeit unserer Stoppuhr sein.

Wir haben immer noch keinen ausf�hrbaren Code und nichts, um ihn zu aktivieren, wenn die Uhr bet�tigt wird. Um den Code f�r die Uhr zu erzeugen, doppelklicken wir ganz einfach auf die Uhr in der Eingabemaske. Das f�hrt uns zum Codefenster. Nachdem wir unseren Code einf�gen, sollte das so aussehen:

PUBLIC SUB clkMiReloj_Timer()
  IF fSegundos < 0.1 THEN
    tglFuncionando.Value = FALSE
    tglFuncionando_Click
  ELSE
    fSegundos = fSegundos - 0.1
    VerValores
  END IF
END

Und zum Schluss aktivieren wir den �briggebliebenen Tastschalter der Stoppuhr. Mit einem Doppelklick auf den Schalter f�gen wir den Code f�r diesen Vorgang ein:

PUBLIC SUB tglFuncionando_Click()
  clkMiReloj.Enabled = tglFuncionando.Value
  VerActivarDesactivar
END

Und jetzt k�nnen wir unser Beispiel testen.

Zu guter Letzt: Gambas ist multilingual, wie es sich geh�rt

Eine weitere Eigenschaft von Gambas ist die Unterst�tzung mehrerer Sprachen. Ein Blick auf den Code zeigt uns, dass die Strings in Klammern eingeschlossen sind. Diese zeigen Gambas an, dass eine �bersetzung erfolgen soll. Der Text f�r die Eintr�ge in der Eingabemaske ben�tigt keine Klammern. Unser Projekt hat sich als etwas sehr Brauchbares herausgestellt und die Anwender m�chten die Dialoge in ihrer Sprache sehen. Nichts ist einfacher. Wir begeben uns zum Project / Properties-Men� des Projektfensters.

project properties

Hier geben wir unserem Projekt einen Title und aktivieren die Project is translatable- Option, welche uns die �bersetzung der Dialoge erm�glicht. Im Men� erscheint eine neue Option: Project/Translate. Wenn wir den Dialog �ffnen, sehen wir, dass die �bersetzung sehr intuitiv erfolgt:

project translation

Im oberen Teil der Combo-Box w�hlen wir zuerst die Zielsprache in der Dropdown-Liste. In der oberen Box, direkt unter der Werkzeugleiste, finden wir eine zweisprachige Liste der �bersetzten Strings. Wir tragen die gew�nschte �bersetzung in die unterste Box ein. Sobald alle �bersetzten Strings dort eingetragen sind, f�hren wir von einen Terminal einen Probelauf mit der Anwendung durch, die Variable LANG muss vorher auf die �bersetzungssprache ge�ndert werden. Wenn ich das in meinem Beispiel mit Englisch durchf�hren will, schliesse ich Gambas und f�hre folgendes aus:

$ LANG=en_US; gambas

Dann starte ich Gambas aus dem KDE-Men�, weil die Variable hier bereits in der gew�nschten Form existiert.

Fazit

Obwohl Gambas eine interpretierte Sprache ist und vollst�ndig installiert sein muss, bietet sie doch eine gute M�glichkeit, um mit der Entwicklung von Anwendungen f�r den Linux-Desktop zu beginnen. Das ist sehr einfach und schnell - wie wir gesehen haben - es ist ausreichend f�r viele der t�glichen Anwendungen.

Die auf den Bildschirm aufrufbare Hilfe ist recht vollst�ndig, daneben haben wir Zugang zu Beispielen �ber das File/Open example -Men�. Wir k�nnen auch zum project web gehen, in der Linksammlung finden wir viele interessante Basicprojekte. Das ist erst der Anfang eines Projekts, dem ich eine gute Zukunft voraussage.