Zum Inhalt springen

Gambas: Druckversion: Beispielprogramme

Aus Wikibooks


Einleitung

[Bearbeiten]

Wenn man ein bisschen mathematisch interessiert ist, kann man eine Programmiersprache wie Gambas sehr gut nutzen, um die Mathematik noch besser zu verstehen.

Umgekehrt kann man durch die Programmierung kleiner mathematischer Programme sehr viel über eine Programmiersprache lernen. Der Vorteil mathematischer Programme ist, dass sie meistens gut überschaubar sind und die Fehlerbeseitigung in kurzer Zeit vollzogen ist.

Außerdem kann man anfangs auch völlig auf eine Grafik verzichten und nur mit dem Direktfenster arbeiten, auch wenn die Grafik ja gerade den Reiz von KDE Programmen ausmacht.

Rechenausdrücke

[Bearbeiten]

Um längere Rechenausdrücke in Gambas korrekt zu berechnen, sollte man einige Vereinbarungen für mathematische Zeichen kennen, die in fast allen Basicdialekten gültig sind. Für die Multiplikation, die Division und die Potenzierung werden dabei andere Zeichen gebraucht, als die im Deutschen üblichen.

  • Die Addition (Zusammenzählen) erfolgt mit +
    • z.B. Print 8 + 8
  • Die Subtraktion (Abziehen) erfolgt mit -
    • z.B. Print 9 - 5
  • Die Multiplikation (Malnehmen) erfolgt mit dem Sternchen *
    • z.B. Print 5 * 5
  • Die Division (Teilen) erfolgt mit dem Schrägstrich /
    • z.B. Print 10 / 5
    • ergibt 2
    • Vorsicht bei Teilung mit oder ohne Rest
  • Die Potenzierung (Hochzahlen) berechnet man mit dem ^ Zeichen.
    • z.B. Print 8 ^ 2
    • ergibt 64
  • Die Klammern legen den Vorrang beim Rechnen fest 5 * (5 + 5)
    • Falsch ist 5(5+5), Richtig ist 5 * (5 + 5)

Für die Berechnung gelten folgende Regeln der Vorrangigkeit:

  • Zuerst werden die Klammern berechnet. Die innersten Klammern zuerst.
  • Bei den Operationen gilt die Rangfolge: Erst Potenzieren, dann multiplizieren oder dividieren, dann addieren oder subtrahieren.
  • Gleichrangige Ausdrücke werden von links nach rechts abgearbeitet.

Es gibt in Gambas nur ein Rechenzeichen für die Quadratwurzel SQR. Die höheren Wurzeln muss man anders berechnen: Hier gilt x-te Wurzel aus a ist gleich a^(1/x) (a hoch 1 durch x) Beispielsweise wird die 3-te Wurzel aus 27 so berechnet: 27^(1/3) = 3

Statt

schreibt man in Gambas: 36/2/3/6 oder 36/(2*3*6) = 1

Beachten Sie, dass das Minuszeichen einmal als Vorzeichen und einmal als Subtraktionszeichen gebraucht wird. Folgende Rechnungen sind gültig:

5 + -2 = 3
-5 * 3 = -15
5*-3 = -15
5/4 = 1,25 oder 1.25 je nach Ländereinstellung
20/2*5 = 50
20/2/5 = 2
20/(2*5)= 2
5*(2+3) = 25
2*(2+3)/(4+6) = 1
((2+3)*2)^2 = 100

Addy der Summierer

[Bearbeiten]

Wenn man eine Kolonne von Zahlen zusammenzählen will, verliert man schnell den Überblick, welche Zahl man schon eingegeben hat und welche nicht. Man kann dazu natürlich eine große Tabellenkalkulation anwerfen. Diese ist aber etwas kompliziert zu bedienen.

Einfacher soll diese Aufgabe Addy, ein kleines Summierprogramm erledigen. Auch eine nachträgliche Korrektur der Eingabe soll möglich sein.

Die Eingabe der Zahlen soll schnell erfolgen, am besten durch ein Return ohne Mausaktion.

Bei dem Programm können auch negative Zahlen summiert werden. Sie werden dann korrekt abgezogen. Auch das Zusammenzählen von Kommazahlen ist möglich.

Außerdem kann man Zahlenkolonnen via Zwischenspeicher übertragen.

Sehr hilfreich bei der Erstellung dieses Programms ist der Splitbefehl. CHR(10) als Trennzeichen ist in diesem Fall der Zeilenwechsel.

Was brauchen Sie? Holen Sie sich eine neue Form und nennen Sie diese wie Sie wollen. Holen Sie sich eine TextArea, eine TextBox und einen Commandbutton aus der Werkzeugkiste. Löschen Sie den Text aus den Textboxen bei den Eigenschaften (= Properties) Text.

So schaut das Ganze aus:

Der Programmcode dazu. Er steht hinter dem Befehlsbutton Summe:

PUBLIC SUB Button1_Click()
  DIM text AS String
  DIM summe AS Float
  DIM Elt AS String[]
  DIM Sb AS String

  text = TextArea1.Text
  Elt = Split(text, Chr(10))
  FOR EACH Sb IN Elt
    summe = summe + Val(sb)
  NEXT
  TextBox1.Text = summe
END

Das Programm ist doch ganz praktisch, oder was meinen Sie? Bei Kommazahlen erfolgt die Ergebnisausgabe noch inkorrekt mit dem englischen Punkt als Komma. Versuchen Sie diesen Fehler zu beheben.

In dem Programm bekommt man eine Fehlermeldung Type mismatch: Wanted Number, got Null instead wenn Sie z.B. versuchen Buchstaben statt Zahlen einzugeben.

Der Computer kann hier nur etwas mit Zahlen anfangen, nicht mit Buchstaben. Sie können den Fehler vermeiden, wenn Sie die Eingabe auf Ziffern, Kommas und Minuszeichen begrenzen. Auch ein Abfangen des Fehlers mit Catch ist sicher möglich.

Wollen Sie die Eingaben in Addy speichern. Dann schauen Sie sich doch folgende Erweiterung an: Gambas: Dateien#Datei laden und speichern mit Addyplus

Das Programm Addy regt an, um über einen kleinen Mittelwert- und Standardabweichungsrechner nachzudenken.

Potenzen

[Bearbeiten]

Folgendes Beispielprogramm zeigt den Umgang mit Potenzen. Es zeigt auch die dabei möglichen Fehler auf. Es arbeitet im Terminalmodus.

STATIC PUBLIC SUB Main()
  PRINT 4^3
  PRINT 3^4
  PRINT 4^1/2
  PRINT 4^(1/2)
  PRINT 8^0.333
  PRINT 8^(1/3)
  PRINT 8^1/3
  PRINT 2^(-2)
  PRINT 1/2^2
END

Die Ausgabe schaut so aus:

64
81
2
2
1,998614185981
2
2,666666666667
0,25
0,25

Frage dazu: Wozu wird hier der Befehl Static verwendet? Geht es auch ohne ihn?

Der Befehl Static wird im Terminalmodus automatisch von der GUI vergeben. Löscht man ihn weg, funktioniert das Programm nicht mehr und es erscheint eine Fehlermeldung: ERROR: #24: No startup method

Modulo oder Modulus (Rest beim Teilen)

[Bearbeiten]

Der MOD Befehl entspricht – einfach erklärt – dem Rest beim Teilen. Geht die Division auf, bleibt kein Rest (also 0).

Ein paar Beispiele sind (besonders für Programmieranfänger) sinnvoll für das Verständnis:

  • 10 MOD 5 ergibt 0 (Oft gemachter Fehler: Es kommt nicht 2 heraus. MOD ist nicht das selbe wie /)
  • 2 MOD 3 ergibt 2
  • 6 MOD 4 ergibt auch 2
  • 8 MOD 3 ergibt 2

Ein weiteres Beispiel zeigt folgendes Programm im Terminalbetrieb:

 STATIC PUBLIC SUB Main()
   DIM a AS Integer
   DIM b AS Integer
 
   b = 2
   FOR a = 10 TO 2 STEP - 1
     PRINT a MOD b
   NEXT
 END

Setzen Sie verschiedene Werte für b ein und schauen Sie sich die Ausgabe an. Falls Sie b = 0 setzen, dann erfolgt eine Fehlermeldung: Divsion by zero.

Lernprogramm Modus

[Bearbeiten]

Waybackmaschine aufrufen und dann unter www.madeasy.de/7/prgmodus.htm suchen.

Quersumme berechnen

[Bearbeiten]

Im folgenden Programm wird der Modus Befehl zur Berechnung der Quersumme einer mehrstelligen Zahl benutzt: Holen Sie sich eine neue Form und nennen Sie diese wie Sie wollen. Holen Sie zwei Textboxen aus der Werkzeugkiste.

Löschen Sie den Text aus den Textboxen bei den Eigenschaften (= Properties) Text.

Holen Sie sich einen Commandbutton dazu und benennen Sie diesen um.

Siehe http://www.madeasy.de/7/prgquer.htm

Hinter dem Befehlsfeld Quersumme steht folgender Code: Beachten Sie das hier das Divisionszeichen / nicht verwendet wird, sondern das Teilenzeichen ohne Rest \.

 PUBLIC SUB Button1_Click()
   DIM zahl AS Integer
   DIM Quersumme AS Integer
 
   zahl = Val(TextBox1.Text)
   DO WHILE zahl <> 0
     Quersumme = Quersumme + zahl MOD 10
     zahl = zahl \ 10
   LOOP
   TextBox2.Text = Str$(Quersumme)
 END

Gerade oder Ungerade

[Bearbeiten]

Den Modulus Befehl kann man nutzen, um zu überprüfen ob eine ganze Zahl gerade (teilbar durch 2) oder ungerade (nicht teilbar durch 2) ist.

Programm: Sie brauchen 2 Befehlsbuttons und 2 Textboxen auf der Form, um das Programm in Gang zu bekommen.

Benutzen Sie folgenden Code um die Eigenschaften der Steuerelemente automatisch einzurichten:

PUBLIC SUB Form_Open()
  Button1.Text = "Zufallszahl erzeugen"
  Button1.Move(16, 8, 176, 32)
  Button2.Text = "Gerade-Ungerade Testen"
  Button2.Move(16, 48, 176, 32)
  Textbox1.Text = ""
  Textbox1.Move(192, 8, 88, 32)
  Textbox2.Text = ""
  Textbox2.Move(192, 48, 88, 32)
END

Sie können die Eigenschaften natürlich auch mit der Hand über das Eigenschaftsfenster festlegen. Der eigentliche Code beginnt hier:

 PUBLIC SUB Button1_Click()
   Randomize()
   textbox1.Text = Str(Int(Rnd(1,101)))
 END
 
 PUBLIC SUB Button2_Click()
   DIM n AS Integer

   n = Val(textbox1.text)

   IF textbox1.Text = "" THEN textbox1.Text = Str(Int(Rnd(1,101)))

   IF n MOD 2 THEN
     textbox2.Text = "Ungerade"
   ELSE
     textbox2.Text = "Gerade"
   ENDIF
 END

Mit dem ersten Befehl wird eine ganze Zufallszahl zwischen 1 und 100 erzeugt. Mit dem zweiten Befehl wird die Teilbarkeit durch 2 überprüft.

Falls n eine ungerade Zahl ist, dann ist n MOD 2 gleich 1, denn es bleibt ein Rest von 1 übrig. Der Wahrheitswert ist true. Wenn kein Rest übrig bleibt ist der Wahrheitswert false.

Ausführlicher kann man auch schreiben:

IF n MOD 2 = true Then

Versuchen Sie es zu verstehen und probieren sie das Programm aus.

Übersicht der mathematischen Zeichen in Gambas

[Bearbeiten]

siehe Mathematische Zeichen in Gambas

Zahlendarstellung

[Bearbeiten]

Einfache Rechnungen mit ganzen Zahlen

[Bearbeiten]

Zahlen werden in Gambas zunächst ganz normal wie gewohnt gehandhabt. So ergibt der Ausdruck PRINT 8 + 8 in der Ausgabe 16.

PUBLIC SUB Form_Open()
  PRINT 8 + 8
END

Will man mit Zahlen im Programm länger arbeiten, muss man sie als Variable definieren. Die einfachste Form dafür ist die Variable Integer. Die Deklaration einer Zahlenvariable erfolgt dann z.B. mit Dim zahl AS Integer.

Im folgenden einfachen Beispielprogramm für die Addition aller Ziffern von 1 bis 10 werden 2 Zahlenvariablen i und k definiert. Sie durchlaufen beide eine Schleife von 1 bis 10 und werden addiert. Kopieren Sie das Programm in Gambas und lassen Sie es laufen. Ersetzen Sie das Pluszeichen durch andere mathematische Zeichen und prüfen Sie was passiert.

 PUBLIC SUB Form_Open()
   DIM i AS Integer
   DIM k AS Integer
   
   FOR i = 1 TO 10
     FOR k = 1 TO 10
       PRINT i + k & " ";
     NEXT
     PRINT
   NEXT
 END

Durch die erste Zeile mit dem Befehl Form_Open() startet das Programm sofort beim Aufrufen der Form. Mit den Befehlen DIM werden die Variablen i und k als ganze Zahlen (= Integer) festgelegt. Dann folgen 2 FOR - TO Schleifen, die verschachtelt sind. In der ersten Schleife wird die Variable i von 1 bis 10 hochgezählt. Bevor aber i zu einem höheren Wert springt, muss die innere Schleife für k immer wieder von 1 bis 10 abgearbeitet werden. In der Ausgabe mit dem Printbefehl werden dann i und k mathematisch verknüpft und im Direktfenster mit PRINT ausgegeben. Der Teil & " " fügt immer ein Leerzeichen zwischen die errechneten Zahlen i + k ein. Der Strichpunkt am Ende der Zeile verhindert einen Zeilenwechsel. So wird die Ausgabe in eine Zeile geschrieben.

Erst in der äußeren Schleife für i steht ein einsamer Printbefehl. Dieser bewirkt einen Zeilenvorschub jedesmal wenn ein neuer Wert für i angesagt ist. Der Zeilenwechsel erfolgt also immer nach 10 Zahlen in der Querausgabe. Beachten Sie bitte, dass die Schleifen mit dem Nextbefehl geschlossen werden. Beim Nextbefehl wird in Gambas auf die Angabe Next i oder Next k verzichtet. Der Computer weiß das selbst.

Wenn Sie die 2 Schleifen nicht verstehen, dann ersetzen sie einfach das Pluszeichen durch ein Komma oder einen Strichpunkt. Daraufhin starten Sie das Programm. Jetzt können Sie erkennen wie die Werte von i und k hochgezählt werden. Wenn Sie es immer noch verstehen, empfehle ich Ihnen den Einzelschrittmodus im Programmablauf.

Versuchen Sie das Programm zu vereinfachen und halten einen der Werte z.B. i konstant. Fügen Sie dazu z.B. eine Zeile i = 5 nach den DIM Befehlen ein und streichen Sie die äußere Schleife für den i Wert inklusive des Next Befehles.

Ihr Programm sollte dann so ausschauen:

 PUBLIC SUB Form_Open()
   DIM i AS Integer
   DIM k AS Integer
   
   i = 5
   FOR k = 1 TO 10
     PRINT i + k & " ";
   NEXT
   PRINT
 END

Die Variable i ist hier eigentlich überflüssig und kann auch noch herausgeworfen werden. Resultat:

 PUBLIC SUB Form_Open()
   DIM k AS Integer
   
   FOR k = 1 TO 10
     PRINT 5 + k & " ";
   NEXT
 END

Auch die Multiplikation ist einfach und wie gewohnt. Sie müssen dazu nur im obigen Additionsprogramm das Pluszeichen mit dem englischen Multiplikationszeichen, dem Sternchen "*" ersetzen.

Die Multiplikation zeigt z.B. ein einfaches Einmaleinsprogramm: Siehe auch http://www.madeasy.de/7/prgschleife2.htm

 PUBLIC SUB Form_Open()
   DIM i AS Integer
   DIM k AS Integer
   
   FOR i = 1 TO 10
     FOR k = 1 TO 10
       PRINT i * k & " ";
     NEXT
     PRINT
   NEXT
 END

Exponential Darstellung mit E

[Bearbeiten]

Wenn Sie folgendes Programm laufen lassen, dann erscheint in der Ausgabe nicht wie erwartet 10 100 1000 etc sondern ab der Zahl eine Million werden die großen Zahlen mit 1.E+8 und 1.E+10 abgekürzt. Der Buchstabe E heißt in diesem Zusammenhang 10 hoch. Die danach folgende Zahl mit einem Plus oder Minuszeichen davor ist die Zahl mit der die Zehn hochgenommen wird, also die Potenz.

1.E+8 heißt also genauer 1,0 *10^8 oder 1,0 * 10 hoch 8 oder 1,0 *108

 PUBLIC SUB Form_Open()
   DIM i AS Integer
   DIM k AS Integer
   
   i = 10
   FOR k = 1 TO 10
     PRINT k ^ i & " ";
   NEXT
 END

Noch einmal zur Wiederholung: Das große "E" bedeutet "Mal 10 hoch". Die Ganzzahl, die folgt gibt die Potenz von Zehn an mit der die Zahl zu multiplizieren ist. Eine andere Möglichkeit die Ganzzahl, die dem "E" folgt, zu betrachten ist, dass sie die Richtung und die Anzahl der Stellen angibt, in der der Dezimalpunkt zu verschieben ist. Positive Ganzzahlen bedeuten eine Rechtsverschiebung; negative Ganzzahlen bedeuten eine Linksverschiebung.

Rechenfehler

[Bearbeiten]

Übrigens ergibt das folgende Programm einen Rechenfehler.

PUBLIC SUB Form_Open()
  PRINT 1000000 * 1000000
END

Rechnen Sie alle Ihre Gambas Programme mehrfach nach, da öfter unerwartete Ergebnisse durch Variablenumwandlung und durch die im Englischen und Deutschen verschiedene Verwendung des Punktes und des Kommas in Dezimalbrüchen auftreten.

Beispiel: Deutsch 1/2 = 0,5 Englisch 1/2 = 0.5

Dieses Problem tritt aber in den meisten anderen Programmiersprachen auch auf und ist nicht Gambas spezifisch.

Die deutschen Mathematiker sollten sich bald möglichst an die englische Notation anpassen und auch gleich die Zeichen für die Multiplikation, Division und Potenzierung an die Computernotierung ändern.

Eine Länderliste mit ihren Dezimaltrennzeichen findet sich hier: http://www.f-i-t.net/dezimalTrennz/

Hochzählen, Runterzählen, Abschneiden, Runden etc INC, DEC, INT, FRAC

[Bearbeiten]

INC Hochzählen, 1 dazuzählen

[Bearbeiten]

Der Befehl INC zählt zu jeder numerischen Variable eins dazu. INC steht für Increment, d.h. heraufzählen.

Beispiel im Terminalmodus (d.h ohne Grafik)

STATIC PUBLIC SUB Main()
  DIM X AS Integer
  X = 7
  INC X
  PRINT X
END

Die Ausgabe erfolgt im Direktfenster und lautet: 8

Zweites Beispiel mit einem Array

 STATIC PUBLIC SUB Main()
   DIM A[3, 3] AS Float
   DIM X AS Integer
   DIM Y AS Integer
   
   X = 2
   Y = 1
   A[X, Y] = Pi
   INC A[X, Y]
   PRINT A[X, Y]
 END

Ausgabe: 4.14159265359

Man kann natürlich statt des INC Befehls auch einfach eins dazuzählen

INC X

Ist dasselbe wie

X = X + 1

Folgendes ist falsch und funktioniert nicht:

X = INC X

DEC Herunterzählen

[Bearbeiten]

Das Gegenteil von INC macht der Befehl DEC. Er zieht von der Zahl die 1 ab. DEC heißt auf englisch Decrement, d.h. herunterzählen.

Beispiel im Terminalmodus (d.h. ohne Grafik)

STATIC PUBLIC SUB Main()
  DIM X AS Integer
  X = 7
  DEC X
  PRINT X
END

Die Ausgabe erfolgt im Direktfenster und lautet: 6

 STATIC PUBLIC SUB Main()
   DIM A[3, 3] AS Float
   DIM X AS Integer
   DIM Y AS Integer
   
   X = 2
   Y = 1
   A[X, Y] = Pi
   DEC A[X, Y]
   PRINT A[X, Y]
 END

Ausgabe: 2,14159265359

Vorzeichen und Absolutwert Sgn, Abs

[Bearbeiten]

Sgn (Signum) Vorzeichen einer Zahl

[Bearbeiten]

Der Befehl Sgn liefert einen Wert, der für das Vorzeichen einer Zahl steht. Das Argument Zahl kann ein beliebiger zulässiger numerischer Ausdruck sein. Dessen Vorzeichen bestimmt den von der Sgn-Funktion ausgegebenen Wert:

  • Ist die Zahl > 0 liefert Sgn(Zahl) den Wert 1.
  • Ist die Zahl = 0 liefert Sgn(Zahl) den Wert 0.
  • Ist die Zahl < 0 liefert Sgn(Zahl) den Wert -1.

Einfache Beispiele:

PRINT Sgn(Pi)

Ergebnis: 1

PRINT Sgn(-Pi)

Ergebnis: -1

PRINT Sgn(0)

Ergebnis: 0

Beispiel:

 PUBLIC SUB Form_Open()
   DIM x AS Integer
   DIM y AS Float
  
   FOR x = 1 TO 100
     y = Rnd(-5, 5)
     'Es werden 100 Zufallszahlen zwischen -5 und +5 erzeugt.
  
     SELECT CASE Sgn(y) '...auswerten.
       CASE 0 ' Wenn Zahl Null.
         PRINT y & " " & Sgn(y) & " Signum = Null."
       CASE 1 ' Wenn Zahl positiv.
         PRINT y & " " & Sgn(y) & " Signum = positive Zahl."
       CASE -1 ' Wenn Zahl negativ.
         PRINT y & " " & Sgn(y) & " Signum = negative Zahl."
     END SELECT
   NEXT
 END

Oder etwas anders:

 PUBLIC SUB Form_Open()
   DIM x AS Integer
   DIM y AS Float
   DIM pos AS Integer
   DIM neg AS Integer
   DIM nul AS Integer
  
   pos = 0
   neg = 0
   nul = 0
  
   FOR x = 1 TO 100
     y = Rnd(-5, 5)
     'Es werden 100 Zufallszahlen zwischen -5 und +5 erzeugt.
  
     SELECT CASE Sgn(y) '...auswerten.
       CASE 0 ' Wenn Zahl null.
         INC nul
       CASE 1 ' Wenn Zahl positiv.
         INC pos
       CASE -1 ' Wenn Zahl negativ.
         INC neg
     END SELECT
   NEXT
   PRINT nul,pos,neg
 END

Es geht natürlich auch ohne den INC Befehl:

 STATIC PUBLIC SUB Main()
   DIM x AS Integer
   DIM y AS Float
   DIM pos AS Integer
   DIM neg AS Integer
   DIM nul AS Integer
  
   pos = 0
   neg = 0
   nul = 0
  
   FOR x = 1 TO 100
     y = Rnd(-5, 5)
     'Es werden 100 Zufallszahlen zwischen -5 und +5 erzeugt.
  
     SELECT CASE Sgn(y) '...auswerten.
       CASE 0 ' Wenn Zahl null.
         nul = nul + 1
       CASE 1 ' Wenn Zahl positiv.
         pos = pos + 1
       CASE -1 ' Wenn Zahl negativ.
         neg = neg + 1
     END SELECT
   NEXT
   PRINT nul,pos,neg
 END

Wie zu erwarten gibt es fast keine Treffer auf der Null, Erhöhen Sie die Zahl x und schauen Sie nach, ob irgendwann auch einmal die Null getroffen wird.

Absolutwert einer Zahl ABS

[Bearbeiten]

Der Befehl ABS liefert den Absoluten Betrag einer Zahl, d.h das Vorzeichen wird weggestrichen, wenn es negativ ist. In der Mathematik verwendet man dafür 2 senkrechte Striche |-2| = 2.

Kleine Beispiele dazu:

Print abs(-2)

Ergebnis: 2

Print abs(2)

Ergebnis: 2

Print abs(0)

Ergebnis: 0

Siehe auch: http://www.madeasy.de/7/prgabs.htm

Ein etwas längeres Beispiel im Terminalmodus:

STATIC PUBLIC SUB Main()
  DIM i AS Integer
  FOR i = -10 TO 10
    PRINT i & " => Abs(i) => " & Abs(i)
  NEXT
END

Der Val Befehl - Aus einem Text etwas Sinnvolles machen

[Bearbeiten]

Val() wandelt einen String (= Folge von Asciizeichen) in einen Datentyp um, der dem Inhalt des Strings entspricht. Wenn der String ausschaut wie eine Fließkommazahl, dann macht Val() eine Fließkommazahl daraus. Val() benutzt die lokale Sprache ihrer Maschine (hier also deutsch), die in "locales" festgelegt wurde.

Sie können Ihre Einstellung mit folgendem Konsolenbefehl überprüfen: "locales" oder "echo $LANG".

Auf einer deutschen Maschine erhält man: de_DE@euro

Vorsicht: Mit Kommazahlen und der Ländereinstellung! Der Val Befehl ist fehlerträchtig!

Steht in einer Textbox1 6,6 mit deutscher Ländereinstellung, dann liefert Val(textbox1.text) eine Floatvariable mit dem Wert 6,6.

Steht in der Textbox 6.6 dann liefert Val(textbox1.text) ein Datum 06.06.04

Wollen Sie die Zahl wieder in einen deutschen Text verwandeln, dann nutzen Sie Str(zahl) zur Umwandlung.

Probieren Sie die Ländereinstellungen Ihres PCs mit folgendem Programm einfach einmal aus. Die Ausgabe erfolgt im Direktfenster:

PUBLIC SUB Form_Open()
  PRINT Val("6.6.99")
  PRINT Val("09/06/72 01:00")
  PRINT Val("3.1415")
  PRINT Val("3,1415")
  PRINT Val("-25")
  PRINT Val("True")
  PRINT Val("False")
  PRINT IsNull(Val("Gambas"))
END

Bei deutscher Ländereinstellung ergibt sich:

06.06.99

31415
3,1415
-25
True
False
True

Weiteres Beispielprogramm

Siehe auch: https://web.archive.org und Suchen nach www.madeasy.de/7/prgval.htm

Wenn Sie einen Textstring eingeben, dann wandelt das Programm den String mit Val um und die Art der umgewandelten Variable wird überprüft.

Das Ergebnis wird ausgegeben.

 PUBLIC SUB _new()
   TextLabel1.Text = "Tippen Sie etwas ein, das wie ein Datum, eine Zahl, eine Kommazahl oder eine Boolesche Variable ausschaut"
 END

 PUBLIC SUB Button1_Click()
   x AS Variant
   x = Val(TextBox1.Text)
  
   IF IsDate(x) THEN Label1.Text="Das ist eine Datumsangabe!"
   IF IsBoolean(x) THEN Label1.Text="Das ist eine Boolesche Variable!"
   IF IsInteger(x) THEN Label1.Text="Das ist eine Zahl!"
   IF IsFloat(x) THEN Label1.Text="Das ist eine Kommazahl!"
   IF IsString(x) THEN Label1.Text="Das ist ein String!"
 END

Vorsicht: Bei der Eingabe von True, wird zwar eine Boolesche Variable erkannt, der Wert wird aber in einer zweiten Textbox nicht ausgegeben. Bei der Eingabe von False, wird zwar eine Boolesche Variable erkannt, der Wert wird aber in einer zweiten Textbox nicht ausgegeben.

Theorie

[Bearbeiten]

Ausdruck = Val(String)

Konvertiert einen String in einen booleschen Wert, eine Zahl oder ein Datum, abhängig vom Inhalt des Strings. Bei der Umwandlung von Zahlen und Datumsangaben werden die gegenwärtigen local-Einstellungen berücksichtigt.

Die Umwandlung geschieht folgendermaßen:

  • Wenn der String als Datum und Zeit (mit Datums- und Zeit-Trennzeichen) interpretiert werden kann, dann wird Datum und Zeit zurückgegeben.
  • Andernfalls, wenn der String als Fließkommazahl interpretiert werden kann, dann wird eine Fließkommazahl zurückgegeben.
  • Andernfalls, wenn der String als Ganzzahl interpretiert werden kann, dann wird eine Ganzzahl zurückgegeben.
  • Andernfalls, wenn der String TRUE oder FALSE ist, dann wird der entsprechende boolesche Wert zurückgegeben.
  • Ansonsten wird NULL zurückgegeben.

Eulersche Zahl berechnen

[Bearbeiten]

Siehe auch http://www.madeasy.de/7/prge.htm und http://www.madeasy.de/2/e.htm

Mit der folgenden Formel kann man die Eulersche Zahl berechnen.

e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + ... + 1/n!

Die Formel wird in ein einfaches Programm eingebaut. Die unendlich Folge wird im Beispiel nach 15 Schleifendurchgängen abgebrochen. Man kann die Zahl aber auch noch genauer berechnen.

Das Programm ist als Terminal Programm ohne Grafik codiert.

 STATIC PUBLIC SUB Main()
   E AS Float
   QF AS Float
   F AS Integer
   K AS Integer
  
   E = 1
   F = 1
   FOR K = 1 TO 15
     F = F * K
     QF = CFloat(1)/F
     E = E + QF
     PRINT E
   NEXT
 END

Fibonaccifolge berechnen

[Bearbeiten]

Siehe auch: http://www.madeasy.de/7/prgfibo.htm

Mit dem folgenden Programm kann man die Fibonaccifolge berechnen.

Es ist als Terminal Programm ohne Grafik codiert.

 STATIC PUBLIC SUB Main()
   a AS Integer
   b AS Integer
   x AS Integer
  
   a = 1
   b = 1
   FOR x = 1 TO 23
     PRINT 2*x-1, a
     PRINT 2*x, b
     a = a + b
     b = a + b
   NEXT
 END

Ausgabe:

1	1
2	1
3	2
4	3
5	5
6	8
7	13
8	21
9	34
10	55
11	89
12	144
13	233
14	377
15	610
16	987
17	1597
18	2584
19	4181
20	6765
21	10946

Versuchen Sie an Hand des obigen Codes, das Ganze als Funktion zu programmieren:

Eingabe der Funktion soll sein fibo(n). Herauskommen soll die Fibonaccizahl, die zu dem entsprechenden N-Wert gehört. Allerdings muss man sicher sehr bald eine Größenbegrenzung einführen, da die Zahlen sehr schnell sehr groß werden.

Lucasfolge berechnen

[Bearbeiten]

Die Lucasfolge hat die gleiche Bildungsregel wie die Fibonacci-Folge. Sie unterscheidet sich allerdings in den beiden Anfangsgliedern. Statt 0 und 1 lauten die beiden Anfangsglieder 2 und 1.

Mit dem folgenden Programm kann man die Lucasfolge berechnen.

Es ist als Terminal Programm ohne Grafik codiert.

 STATIC PUBLIC SUB Main()
   a AS Integer
   b AS Integer
   x AS Integer
  
   a = 2
   b = 1
   FOR x = 1 TO 23
     PRINT 2*x-1, a
     PRINT 2*x, b
     a = a + b
     b = a + b
   NEXT
 END

Ausgabe

1	2
2	1
3	3
4	4
5	7
6	11
7	18
8	29
9	47
10	76
11	123
12	199
13	322
14	521
15	843
16	1364
17	2207
18	3571
19	5778
20	9349
21	15127
22	24476
23	39603

Das Summenzeichen programmieren

[Bearbeiten]

Die Mathematik bereitet dem Anfänger schon deswegen erhebliche Schwierigkeiten, weil sie dazu neigt, neue komplizierte Zeichen zu benutzen. Ein Beispiel ist das Summenzeichen. Wenn man es verstehen will, sollte man es einfach programmieren. Programmiertechnisch ist es eine For Next Schleife mit Aufsummierung des Ergebnisses aus jedem Schleifendurchlauf.

Wie kann man das Zeichen programmieren?

Dazu benutzen wir 2 Beispiele:

Beispiel 1

[Bearbeiten]

Das Programm dazu schaut so aus: Sie brauchen eine Textbox und einen Commandbutton, um es in Gang zu bringen.

Code:

 PUBLIC SUB Form_Open()
   Button1.Text = "Berechne die Summe"
   Textbox1.Text = ""
 END
 
 PUBLIC SUB Button1_Click()
   i AS Integer
   'i ist die Laufvariable von -2 bis 3
   s AS Variant
   's ist die Summe
   s = 0
   FOR i = -2 TO 3
     s = s + i
     'PRINT i, s
   NEXT
   textbox1.Text = Str(s)
 END

Verändern Sie das Programm so, dass Sie den Anfangswert und den Endwert der Laufvariablen i in eine Textbox eingeben können. Fügen Sie dazu in das Programm 2 neue Variablen ein

a as integer
' a = Anfangswert
e as integer
' e = Endwert

Ändern Sie die Schleife in

For i = a to e

Vorher müssen Sie noch a und e Werte zuweisen:

a = 0
e = 6

Oder:

a = val(Textbox2.Text)
e = val(Textbox3.Text)

Beispiel 1a

[Bearbeiten]

Das Programm dazu schaut so aus: Sie brauchen eine Textbox und einen Commandbutton, um es in Gang zu bringen.

Code:

 PUBLIC SUB Form_Open()
   Button1.Text = "Berechne die Summe"
   Textbox1.Text = ""
 END
  
 PUBLIC SUB Button1_Click()
   i AS Integer
   'i ist die Laufvariable von 1 bis 10
   s AS Variant
   s = 0
   FOR i = 1 TO 10
     s = s + i*i
     'PRINT i, s
   NEXT
   textbox1.Text = Str(s)
 END

Verändern Sie das Programm so, dass Sie den Anfangswert und den Endwert der Laufvariablen i in eine Textbox eingeben können. Fügen Sie dazu in das Programm 2 neue Variablen ein

a as integer
' a = Anfangswert
e as integer
' e = Endwert

Ändern Sie die Schleife in

For i = a to e

Vorher müssen Sie noch a und e Werte zuweisen:

a = 1
e = 10

Oder:

a = val(Textbox2.Text)
e = val(Textbox3.Text)

Beispiel 2

[Bearbeiten]

Berechnet werden soll

Das Programm dazu schaut so aus:

Die Zwischenwerte wurden dabei im Direktfenster mit Print ausgegeben. Sie brauchen eine Textbox und einen Commandbutton, um es in Gang zu bringen.

 PUBLIC SUB Form_Open()
   Button1.Text = "Berechne Summe"
   Textbox1.Text = ""
 END

 PUBLIC SUB Button1_Click()
   i AS Integer
   'i ist die Laufvariable von 0 bis 6
   s AS Variant
   s = 0
   FOR i = 0 TO 6
     s = s + i / (i + 1)
     PRINT i, (i / (i + 1)), s
     '0 + 1/2 + 2/3 + 3/4 + 4/5 + 5/6 + 6/7 = 210/420 + 280/420 + 315/420 + 336/420 +  350/420 + 360/420
     NEXT
   textbox1.Text = Str(s)
 END

Man erkennt den Unterschied der Computerberechnung und der eigenen Berechnung auf dem Papier. 0 + 1/2 + 2/3 + 3/4 + 4/5 + 5/6 + 6/7 = 210/420 + 280/420 + 315/420 + 336/420 + 350/420 + 360/420 Auf dem Papier sucht man den kleinsten gemeinsamen Nenner. Dann erweitert man die Brüche entsprechend. Die Zähler kann man dann addieren. Ergebnis 1851/420 = 617/140 = 4.407142857142857

Der entscheidende Vorteil des Computerprogrammes ist die leichte Erweiterbarkeit. Man kann den Anfangswert 0 für i als Variable allgemein lassen. Man kann den Endwert für i = 6 allgemein lassen. Dann eignet sich das Programm nicht nur für eine spezielle Summe, sondern gleich für beliebige Summen derselben Art.

 PUBLIC SUB Form_Open()
   Button1.Text = "Berechne Summe"
   Textbox1.Text = ""
 END

 PUBLIC SUB Button1_Click()
   i AS Integer
   'i ist die Laufvariable von 0 bis 6
   a as integer
   'a ist der Anfangswert für i
   z as integer
   'z ist der Endwert für i
   s AS Variant
  
   s = 0
   a = 0
   z = 6
   FOR i = a TO z
     s = s + i / (i + 1)
     'PRINT i, (i / (i + 1)), s
   NEXT
   textbox1.Text = Str(s)
 END

Zahlen zählen

[Bearbeiten]

Dieses Programm zählt aus einer langen Schlange von Dezimalzahlen die Häufigkeit von 1,2,3,4,5,6,7,8,9,0. Es ist in typischer Anfängermanier programmiert. Das ist keine Schande, denn es erfüllt seinen Zweck. Mit einem Array könnte man das Programm wahrscheinlich deutlich verkürzen.

Die Ergebnisausgabe erfolgt wie üblich im Direktfenster.

Um das Programm in Gang zu bringen brauchen Sie eine Textarea und 2 Commandbuttons auf ihrer Form.

Screenshot
 PUBLIC SUB Form_Open()
   Button1.Text = "Zahlen zählen"
   Button2.Text = "Beispiel"
   Textarea1.Text = ""
   ME.Text = "Zahlen zählen"
 END
 
 PUBLIC SUB Button1_Click()
   s AS String
   n AS Integer
   Tempo AS String
   char AS String
   z0 AS Integer
   z1 AS Integer
   z2 AS Integer
   z3 AS Integer
   z4 AS Integer
   z5 AS Integer
   z6 AS Integer
   z7 AS Integer
   z8 AS Integer
   z9 AS Integer
  
   s = textarea1.Text
   z0 = 0
   z1 = 0
   z2 = 0
   z3 = 0
   z4 = 0
   z5 = 0
   z6 = 0
   z7 = 0
   z8 = 0
   z9 = 0

   Tempo = RTrim$(s)
   Tempo = LTrim$(Tempo)
   FOR n = 1 TO Len(Tempo)
     char = Mid$(Tempo, n, 1)
     SELECT CASE char
       CASE "0"
         z0 = z0 + 1
       CASE "1"
         z1 = z1 + 1
       CASE "2"
         z2 = z2 + 1
       CASE "3"
         z3 = z3 + 1
       CASE "4"
         z4 = z4 + 1
       CASE "5"
         z5 = z5 + 1
       CASE "6"
         z6 = z6 + 1
       CASE "7"
         z7 = z7 + 1
       CASE "8"
         z8 = z8 + 1
       CASE "9"
         z9 = z9 + 1
     END SELECT
   NEXT
   PRINT z0, z1, z2, z3, z4
   PRINT z5, z6, z7, z8, z9
 END
  
 PUBLIC SUB Button2_Click()
   textarea1.Text = "1234567893523652314232723742734247247899990001223445"
 END

Funktionsdarstellung

[Bearbeiten]

Leider funktioniert der VB Befehl Scale in Gambas noch nicht. Trotzdem gibt es schon ein paar brauchbare Funktionsdarstellungen: http://www.madeasy.de/7/prgkoord.htm http://www.madeasy.de/7/prgfunkt.htm

Trigonometrische Funktionen in Gambas

[Bearbeiten]

Acsh / ACosh, Acs / ACos, Asn / ASin, Asnh / ASinh, Atn / ATan, Atnh / ATanh, Cos, Cosh, Deg, Rad, Pi, Sin, Sinh

Beispiel Programm für den sin und cos ohne Grafik

[Bearbeiten]
STATIC PUBLIC SUB Main()
  DIM a AS Float
  FOR a = - 10 TO 10 STEP 0.1
    PRINT a," Sin ",Sin(a),"       Cos ",Cos(a)
  NEXT
END

In der Ausgabe stecken noch einige Fehler. Der Wert a = 0 wird beispielsweise nicht korrekt ausgegeben. Auch die Werte a = 0,1 und a = 10 machen Schwierigkeiten.

Grafische Ausgabe der Sinusfunktion

[Bearbeiten]

Siehe http://www.madeasy.de/7/prgsinohne.htm

Dieses Grafikprogramm zeigt die Programmierung der Sinusfunktion: Sie brauchen einen Befehlsknopf und ein Zeichenfeld. Stellen Sie die Höhe des Zeichenfeldes bei den Eigenschaften auf 100 ein (Height).

Hinter dem Befehl Sinuskurve steht folgender Code:

 PUBLIC SUB Button1_Click()
   DIM dymax AS Integer
   ' maximaler gezeichneter y - Wert = Height drawymax
   DIM dymin AS Integer
   ' minimaler gezeichneter y - Wert = 0 drawymin
   DIM ymax AS Integer
   DIM ymin AS Integer
   'gewünschtes Koordinatensystem mit ymax und ymin
   DIM y AS Float
   'wechselnder Orginalwert von y
   DIM dy AS Float
   'gezeichneter Wert von y
   DIM dyi AS Integer
   'Ganzzahlwert von dy
   DIM x AS Float
   DIM dxi AS Integer
   'Ganzzahlwert von dx
  
   ' Beispiel dymax = 100 und dymin = 0
   dymax = 100
   dymin = 0
   ymax = 1
   ymin = -1
  
   FOR x = 0 TO 12 STEP 0.1
     y = Sin(x)
     'Formel
     'Verhältnis Teilstrecke / Gesamtstrecke in beiden Maßstäben sind gleich
     '(dy - dymin) / (dymax - dymin) = (y - ymin) / (ymax - ymin)
     '==> dy - dymin = (y - ymin) / (ymax - ymin) * (dymax - dymin)
     '==> dy = (y - ymin) / (ymax - ymin) * (dymax - dymin) + dymin
     dy = CFloat(y - ymin) / (ymax - ymin) * (dymax - dymin) + dymin
     'PRINT x,y,dy
     dyi = Fix(dy)
     dxi = Fix(x *30)
     Draw.Begin(DrawingArea1)
     Draw.Point(dxi,dyi)
     Draw.End
   NEXT
 END

Spielen Sie mit den einzelnen Größen etwas herum und beobachten Sie wie sich die Grafik ändert. Verändern Sie das Programm so, dass der Sinus korrekt mit 0 anfängt und erst ins positive wächst. Was ist hier noch falsch? (dy Werte werden noch von oben nach unten aufgetragen und nicht umgekehrt.) Versuchen Sie die Umrechnungen für dyi alle in eine Formel zu bekommen.

Logik

[Bearbeiten]

Siehe Gambas: Logische Operatoren

Primzahlen berechnen

[Bearbeiten]

Das folgende Programm zeigt die Suche nach Primzahlen mit Hilfe des Siebs von Eratosthenes. Die Ergebnisausgabe erfolgt im Direktfenster.

Um es in Gang zu bringen brauchen Sie 2 Commandbuttons und 1 Textbox auf Ihrer Form.

 PUBLIC SUB Form_Open()
   ME.Text = "Primzahlberechnung"
 END
 
 PUBLIC SUB Button1_Click()
   m AS Integer
   f AS Integer
   n AS Integer
   A$ AS String

   if textbox1.Text = "" Then textbox1.text = "1"
   m = Val(textbox1.Text)
   'holt sich aus dem Textfeld1 die erste Zahl zum Testen

   IF m / 2 = Int(m / 2) THEN m = m - 1
   'Falls diese Zahl ohne Rest durch 2 teilbar ist, also eine gerade Zahl ist
   'geht das Programm noch eine Zahl rückwärts um eine ungerade Zahl zu bekommen
  
   IF textbox1.Text = "" THEN m = 6
   'Falls keine Startzahl eingegeben wurde wird die Startzahl m = 6 vergeben.
  
   FOR m = m TO m + 1000 STEP 2
     'Hauptschleife
     'Die nächsten 1000 ungeraden Zahlen in einer Schleife durchlaufen lassen
     'm ist die Variable für die ungeraden Zahlen

     f = 1
     'f ist die Variable für die Faktorentestung,
     'm teilbar durch f oder nicht

     n = m
     'n = ist die Testzahl, bei der noch nicht klar ist ob sie eine Primzahl ist

     DO WHILE f < Sqr(n)
       'solange der Teiler f kleiner als die Wurzel
       'aus der Testzahl n ist, muss getestet werden
       f = f + 2
       'Teiler von f = 1 beginnend um jeweils 2 vermehren, 3,5,7,9 etc erster Test also mit f = 3
       DO WHILE n / f = Int(n / f)
         'Teiler f testen solange bis n / f ohne Rest teilbar
         'PRINT "m = "; m; " n = "; n; " f = "; f
         n = Int(n / f)
         'Die Testzahl n verkleinern auf die Zahl n/f
       LOOP
     LOOP

     A$ = " 1" & Chr(13) & " 2" & Chr(13) & " 3"
     IF m < 7 THEN PRINT A$
     'Chr(13) = Zeilenwechsel
     'Am Anfang zwischen 1 und 5 gibt es Probleme mit der Ausgabe
     'deswegen werden die ersten drei Zeilen ersetzt durch A$

     IF n = m THEN PRINT n
     'Wenn die Testzahl n nicht teilbar war durch f
     'ist es eine Primzahl und kann ausgedruckt werden
   NEXT
   CATCH
     message.Info("Bitte eine Zahl eingeben")
 END

Logarithmus

[Bearbeiten]

Mit dem Logarithmus kann man sehr große Zahlen übersichtlich und klein machen. Aus 1 000 000 wird beispielsweise 10^6 (Sprich 10 hoch 6 = 10 * 10 * 10 * 10 *10 *10). Dabei ist die Hochzahl 6 der Logarithmus von 1 000 000 zur hier gewählten Basiszahl 10. Der Begriff Hochzahl und Exponent sind identisch.

Die Logarithmusfunktion y = logb (x) liefert für jede beliebige positive Zahl x einen Wert. So ist der Logarithmus der Zahl 1 234 567 zur Basis 10 gleich log10 (1234567) = 6.09151466408626 Insbesondere für Werte, die sehr klein oder sehr groß sind oder die einen sehr großen Wertebereich einnehmen können, haben sich Logarithmen sehr bewährt. Da die Logarithmusfunktion mit größer werden x Werten stetig wächst, bleiben logische Zusammenhänge, die für den x Wert gelten meist auch für den Logarithmus von x erhalten.

Anwendung von Logarithmen:

[Bearbeiten]
  • pH = Säurewert von chemischen Lösungen
  • dB = Dezibel = Messung der Lautstärke
  • bit = Informationseinheit = Messung der Informationsmenge
  • Logarithmuspapier in der Statistik

Siehe auch:

Beispielprogramm Log Befehl

[Bearbeiten]

Um den Befehl Log zu verstehen, kann man ihn einfach für verschiedene Werte berechnen: L = log(x) L ist der natürliche Logarithmus von x zur Basis e,der Eulerschen Zahl

e = 2,718281828459

Man schreibt sich ein Miniprogramm mit einer Form und einem Befehlsbutton:

Der Code dazu lautet:

 PUBLIC SUB Form_Open()
   Button1.Text = "log"
 END
 
 PUBLIC SUB Button1_Click()
   x AS Integer
   FOR x = 1 TO 10
   PRINT x, Log(x)
   NEXT
 END

Die Ausgabe erfolgt im Direktfenster. Sie lautet:

1	0
2	0,69314718056
3	1,098612288668
4	1,38629436112
5	1,609437912434
6	1,791759469228
7	1,945910149055
8	2,07944154168
9	2,197224577336
10	2,302585092994

Wenn Sie Ihre Schleife für x mit einer negativen Zahl anfangen lassen, erhalten Sie eine Fehlermeldung:

Mathematic Error

Denn Logarithmus einer negativen Zahl gibt es nicht.

Genauere Version

[Bearbeiten]

Wenn man die Schleife in genaueren Schritten laufen lassen will, benutzt man folgende Codevariante:

 PUBLIC SUB Form_Open()
   Button1.Text = "log"
 END
 
 PUBLIC SUB Button1_Click()
   x AS Float
   FOR x = 0.1 TO 10 STEP 0.1
     PRINT x, Log(x)
   NEXT
 END

Ausgabe im Direktfenster:

0,1	-2,302585092994
0,2	-1,609437912434
0,3	-1,203972804326
0,4	-0,916290731874
0,5	-0,69314718056
0,6	-0,510825623766
0,7	-0,356674943939
0,8	-0,223143551314
0,9	-0,105360515658
1	-1,110223024625E-16
1,1	0,095310179804
1,2	0,182321556794
1,3	0,262364264467
1,4	0,336472236621

etc...

Beispielprogramm Logbefehl mit beliebiger Eingabe

[Bearbeiten]

Wenn man den Log Befehl mit einer beliebigen positiven Zahl testen will, kann man folgendes Programm nutzen.

Sie brauchen 2 Textboxen und 1 Befehlsknopf (Commandbutton) auf Ihrer Form. Machen Sie die Textbox2 groß genug, damit alle Nachkommastellen Platz haben.

Code:

 PUBLIC SUB Form_Open()
   ME.Text = "Was macht der Log Befehl"
   Textbox1.Text = ""
   Textbox2.Text = ""
   Button1.Text = "Log"
 END
 
 PUBLIC SUB Button1_Click()
   x AS Float
   L AS Float

   IF Textbox1.Text = "" THEN textbox1.text = "1"
   IF Val(textbox1.Text) <= 0 THEN 
     message.info = "Unzulässige Eingabe"
     RETURN
   ENDIF
 
   'Umformen der Texteingabe 1 in eine genaue Zahl
   x = Val(textbox1.Text)
   L = Log(x)
   'Ausgabe des Ergebnises als String im Textfeld 2
   textbox2.Text = Str(L)
 END

Im Code dieses Programms steckt noch ein Fehler. Die Messagebox (Meldung) wurde falsch programmiert:

Statt:

 IF Val(textbox1.Text) <= 0 THEN message.info = "Unzulässige Eingabe"

Sollten Sie schreiben:

IF Val(textbox1.Text) <= 0 THEN Message.info("Unzulässige Eingabe Zahl kleiner Null", "OK")

Wie kann man noch Fehleingaben von Buchstaben verhindern?

Beispielprogramm Dualer Logarithmus

[Bearbeiten]

Der Duale Logarithmus nutzt als Basis die Zahl 2. Um ihn mit dem Befehl log zu erhalten, muss man den natürlichen in den dualen umrechnen. dazu nutzt man folgende Formel:

L = log2x = logex / loge2

Code:

 PUBLIC SUB Form_Open()
   ME.Text = "Dualer Logarithmus"
   Textbox1.Text = ""
   Textbox2.Text = ""
   Button1.Text = "Log2"
 END
 
 PUBLIC SUB Button1_Click()
   x AS Float
   L AS Float
 
   x = Val(textbox1.Text)
   L = Log(x)/Log(2)
   'Ausgabe des Ergebnises als String im Textfeld 2
   textbox2.Text = Str(L)
 END

Beispielprogramm Dekadischer Logarithmus

[Bearbeiten]

Der dekadische Logarithmus nutzt als Basis die Zahl 10. Um ihn mit dem Befehl log zu erhalten, muss man den natürlichen in den dekadischen umrechnen. dazu nutzt man folgende Formel:

L = log10x = logex / loge10

Code:

 PUBLIC SUB Form_Open()
   ME.Text = "Dualer Logarithmus"
   Textbox1.Text = ""
   Textbox2.Text = ""
   Button1.Text = "Log2"
 END
 
 PUBLIC SUB Button1_Click()
   x AS Float
   L AS Float
 
   x = Val(textbox1.Text)
   L = Log(x)/Log(10)
   'Ausgabe des Ergebnises als String im Textfeld 2
   textbox2.Text = Str(L)
 END

Beispielprogramm Logarithmusrechner

[Bearbeiten]

Zum Berechnen von Logarithmen kann man folgendes kleine Programm nutzen. Um es in Gang zu bringen braucht man:

  • 5 Commandbuttons
  • 4 Textboxen
  • 3 Textlabelfelder

Der Code:

 PUBLIC SUB Form_Open()
   'automatisches Benennen der Steuerelemente beim Programmstart
   Textbox1.Text = ""
   Textbox2.Text = ""
   Textbox3.Text = ""
   textbox4.Text = ""
   Button1.Text = "Basis 2"
   Button2.Text = "Basis e"
   Button3.Text = "Basis 10"
   Button4.Text = "Berechnen"
   Button5.Text = "Ende"
   Textlabel1.Text = "Der Logarithmus der Zahl"
   Textlabel2.Text = "zur Basis "
   Textlabel3.Text = "beträgt: "
   Textlabel1.Alignment = 66
   Textlabel2.Alignment = 66
   Textlabel3.Alignment = 66
   Textlabel1.BackColor = &Hffffff&
   Textlabel2.BackColor = &HFFFFFF&
   Textlabel3.BackColor = &HFFFFFF&
   Textlabel1.Border = 1
   Textlabel2.Border = 1
   Textlabel3.Border = 1
   Form1.Move(174,455,393,242)
   Form1.Border = Window.Fixed
   Button1.Move(80,64,64,32)
   Button2.Move(160,64,64,32)
   Button3.Move(240,64,64,32)
   Button4.Move(272,112,112,32)
   Button5.Move(272,192,112,32)
   TextBox1.Move(240,16,144,40)
   TextBox2.Move(120,112,144,32)
   TextBox3.Move(120,152,144,32)
   TextBox4.Move(24,192,240,32)
   TextLabel1.Move(8,16,216,40)
   TextLabel2.Move(24,112,96,32)
   TextLabel3.Move(24,152,96,32)
 END

 PUBLIC SUB Button4_Click()
   x AS Float
   y AS Float
   L AS Float

   textbox4.Text = ""
   'Fehleingaben abfangen
   IF Textbox1.Text = "" OR textbox2.Text = "" THEN textbox4.text = "Eingabe fehlt!"
   IF Textbox1.Text = "" OR textbox2.Text = "" THEN RETURN
   IF Val(textbox1.Text) <= 0 THEN textbox4.Text = "Unzulässige Eingabe"
   IF Val(textbox1.Text) <= 0 THEN RETURN
   IF Val(textbox2.Text) <= 1 THEN textbox4.Text = "Unzulässige Eingabe"
   IF Val(textbox2.Text) <= 1 THEN RETURN

   'Umformen der Texteingabe 1 und 2 in eine genaue Zahl
   x = Val(textbox1.Text)
   y = Val(textbox2.Text)

   'allgemeine Logarithmusformel
   L = Log(x) / Log(y)

   'Ausgabe des Ergebnises im Textfeld 3
   textbox3.Text = Str(L)
 END

 PUBLIC SUB Button1_Click()
   textbox2.Text = 2
 END

 PUBLIC SUB Button3_Click()
   textbox2.Text = 10
 END

 PUBLIC SUB Button2_Click()
   textbox2.Text = "2,718282"
 END

 PUBLIC SUB Button5_Click()
   ME.Close
 END

Zinsrechnung

[Bearbeiten]

Die im Folgenden aufgeführten Formeln für die Zinsrechnung verwenden Symbole wie folgt:

  • Anfangskapital: K0 (Kapital nach 0 Jahren)
  • Endkapital: Kn (Kapital nach n Jahren)
  • Laufzeit (ganze Jahre): n Eingabe in Jahren
  • Laufzeit (Tage)  : t Eingabe in Tagen
  • Zinssatz als Dezimalangabe: (pro Zinsperiode)

Beispielprogramm Einfache Zinsen ohne Zinseszinsen (lineare Verzinsung)

[Bearbeiten]

Um einfache Zinsen auszurechnen verwenden wir die folgende Formel:


Für das Beispielprogramm braucht sie :

  • 4 Valueboxen
  • 1 Befehlsknopf (Commandbutton)

oder verwenden sie den folgenden .form Code

# Gambas Form File 2.0
{ Form Form
  MoveScaled(0,0,53,31)
  Text = ("")
  { Label1 Label
    MoveScaled(45,8,6,3)
    Text = ("Jahre")
  }
  { Label2 Label
    MoveScaled(45,13,4,3)
    Text = ("%")
  }
  { Label3 Label
    MoveScaled(1,3,14,3)
    Text = ("Anfangskapital")
  }
  { Label4 Label
    MoveScaled(4,8,11,3)
    Text = ("Laufzeit")
  }
  { Label5 Label
    MoveScaled(4,13,11,3)
    Text = ("Zinssatz")
  }
  { Label6 Label
    MoveScaled(1,25,14,4)
    Text = ("Endkapital")
  }
  { Button1 Button
    MoveScaled(7,18,38,5)
    Text = ("Berechnen")
  }
  { ValueBox1 ValueBox
    MoveScaled(16,3,28,3)
  }
  { Label7 Label
    MoveScaled(45,3,6,3)
    Text = ("Euro")
  }
  { ValueBox2 ValueBox
    MoveScaled(16,8,28,3)
  }
  { ValueBox3 ValueBox
    MoveScaled(16,13,28,3)
  }
  { ValueBox4 ValueBox
    MoveScaled(16,25,28,4)
  }
  { Label8 Label
    MoveScaled(45,25,6,3)
    Text = ("Euro")
  }
}

Der .class Code

' Gambas class file

'K (Anfangskapital)      = ValueBox1.Value
'n (Laufzeit in Jahren)  = ValueBox2.Value
'i (Zinssatz)            = ValueBox3.Value / 100
'Kn (Endkapital)         = ValueBox4.Value

PUBLIC SUB Button1_Click()

  'Endkapital berechnen mit der Formel:
  ' Kn = K*(i*n+1)
  ValueBox4.Value = (ValueBox1.Value * (ValueBox3.Value / 100 * ValueBox2.Value + 1))

END


Beispielprogramm Zinseszinsrechnung (exponentielle Verzinsung)

[Bearbeiten]

Um Zinsen mit Zinseszins auszurechnen verwenden, wir die folgende Formel:

Für das Beispielprogramm brauchen Sie:

  • 5 Valueboxen
  • 1 Checkbox
  • 1 Befehlsknopf (Commandbutton)

oder verwenden Sie den folgenden .form-Code

# Gambas Form File 2.0

{ Form Form
  MoveScaled(0,0,53,39)
  Text = ("")
  { Label1 Label
    MoveScaled(45,8,6,3)
    Text = ("Jahre")
  }
  { Label2 Label
    MoveScaled(45,13,4,3)
    Text = ("%")
  }
  { Label3 Label
    MoveScaled(1,3,14,3)
    Text = ("Anfangskapital")
  }
  { Label4 Label
    MoveScaled(4,8,11,3)
    Text = ("Laufzeit")
  }
  { Label5 Label
    MoveScaled(4,13,11,3)
    Text = ("Zinssatz")
  }
  { Label6 Label
    MoveScaled(1,28,14,4)
    Text = ("Endkapital")
  }
  { Button1 Button
    MoveScaled(7,22,38,5)
    Text = ("Berechnen")
  }
  { ValueBox1 ValueBox
    MoveScaled(16,3,28,3)
  }
  { Label7 Label
    MoveScaled(45,3,6,3)
    Text = ("Euro")
  }
  { ValueBox2 ValueBox
    MoveScaled(16,8,28,3)
  }
  { ValueBox3 ValueBox
    MoveScaled(16,13,28,3)
  }
  { ValueBox4 ValueBox
    MoveScaled(16,28,28,4)
  }
  { Label8 Label
    MoveScaled(45,28,6,3)
    Text = ("Euro")
  }
  { Label9 Label
    MoveScaled(1,34,14,3)
    Text = ("Zinsen")
  }
  { ValueBox5 ValueBox
    MoveScaled(16,34,28,3)
  }
  { Label10 Label
    MoveScaled(45,34,6,3)
    Text = ("Euro")
  }
  { CheckBox1 CheckBox
    MoveScaled(16,18,27,2)
    Text = ("Mit Zinseszins")
  }
}

Der .class-Code

' Gambas class file

'K (Anfangskapital)      = ValueBox1.Value
'n (Laufzeit in Jahren)  = ValueBox2.Value
'i (Zinssatz)            = ValueBox3.Value / 100
'Kn (Endkapital)         = ValueBox4.Value
'Z (Zinsen/Zinswert)     = ValueBox5.Value

PUBLIC SUB Button1_Click()

  IF CheckBox1.Value = FALSE THEN 
  'Normale Zinsen berechnen
    
    'Endkapital berechnen, mit der Formel:
    ' Kn = K*(i*n+1)
    ValueBox4.Value = Round(ValueBox1.Value * (ValueBox3.Value / 100 * ValueBox2.Value + 1), -2)
    'Zinsen/Zinswert berechnen, mit der Formel:
    ' Z = K*(i*n+1)-K = Kn-K
    ValueBox5.Value = Round(ValueBox4.Value - ValueBox1.Value, -2)
    
  ELSE 
  'Zinseszins berechnen
    
    'Endkapital berechnen, mit der Formel:
    ' Kn = K*(i+1)^n
    ValueBox4.Value = Round(ValueBox1.Value * (ValueBox3.Value / 100 + 1) ^ ValueBox2.Value, -2)
    'Zinsen/Zinswert berechnen, mit der Formel:
    ' Z = K*(i+1)^n-K = Kn-K
    ValueBox5.Value = Round(ValueBox4.Value - ValueBox1.Value, -2)
    
  ENDIF 

END


Beschreibende Statistik

[Bearbeiten]

Mittelwert

[Bearbeiten]

Das arithmetische Mittel (auch Durchschnitt) ist der am häufigsten benutzte Mittelwert und wird deshalb auch als Standardmittelwert bezeichnet.

Den arithmetischen Mittelwert einer Zahlenreihe können Sie berechnen , wenn Sie alle Elemente der Reihe zusammenzählen und die erhaltene Summe durch die Zahl der Elemente teilen.

Mittelwert = Summe der Werte / Anzahl der Werte   

Beispiel für das arithmetische Mittel von 3,4 und 5:

Mittelwert  = (3 + 4 + 5) / 3 = 4 

Im folgenden Programmbeispiel wird dies umgesetzt.

Holen Sie sich aus der Werkzeugkiste eine Textarea , eine Textbox und einen Commandbutton. Diese ordnen Sie wie unten auf der Form an: Die Zahlen sind nur als Beispiel gedacht.

Textarea1
********************
* 5                *
* 5                *
* 4                *
* 5                *
*                  *
*                  *
********************
Befehlsbutton1:
************
*Mittelwert*
************
Textbox1
********************
*4.75              *
********************

Der Code hinter dem Commandbutton Mittelwert schaut so aus und erinnert stark an ADDY, den Summierer:

PUBLIC SUB Button1_Click()
DIM text AS String
DIM summe AS Float
DIM mw AS Float
 DIM Elt AS String[]
DIM Sb AS String
text = textarea1.Text
Elt = Split(text,Chr(10))
FOR EACH Sb IN Elt
 summe = summe + Val(sb)
NEXT
mw = summe / elt.Length
textbox1.Text = mw
END

Das Programm nutzt als wesentliche Tricks einen Stringarray, den Befehl Split und das Zeichen CHR(10) um die einzelnen Zahlenglieder zu trennen.

Varianz und Standardabweichung

[Bearbeiten]

Das Programm zur Berechnung des Mittelwertes kann man erweitern, so daß auch die Varianz und die Standardabweichung errechnet werden. Ein Testdatensatz ist auch dabei.

Bei der Gaußschen Normalverteilung ergibt sich, dass die Wahrscheinlichkeit etwa 2/3 dafür beträgt, dass die Messwerte innerhalb von +/– einer Standardabweichung vom Erwartungswert liegen und damit jeweils etwa 1/6 dafür, dass sie unterhalb bzw. oberhalb dieses Intervalls liegt.

Sie brauchen 3 Commandbuttons , eine Textarea und 2 Textboxen um es in Gang zu bringen.

Screenshot Mittelwert, Varianz und Standardabweichung berechnen

Der Code schaut so aus:

PUBLIC SUB Button1_Click()
DIM text AS String
DIM summe AS Float
DIM mw AS Float
DIM varianz AS Float
DIM sigma AS Float
DIM Liste AS String[]
DIM Einzelwert AS String
text = textarea1.Text
Liste = Split(text,Chr(10))
FOR EACH Einzelwert IN Liste
 summe = summe + Val(Einzelwert)
NEXT
mw = summe / Liste.Length
textbox1.Text = mw
varianz = 0
FOR EACH Einzelwert IN Liste
 varianz = varianz + ((Val(Einzelwert) - mw)^2)
 'PRINT Einzelwert,mw,((Val(Einzelwert) - mw)^2)
 'PRINT varianz
NEXT
varianz = varianz / (Liste.Length - 1)
'PRINT varianz
sigma = Sqr(varianz)
textbox2.Text = sigma
END
--------------------------
PUBLIC SUB Button2_Click()
 'Testdatensatz in die Textarea füllen.
 textarea1.Text = "114,3"
 textarea1.Text = textarea1.Text & Chr(10) & "135,7"
 textarea1.Text = textarea1.Text & Chr(10) & "104,8"
 textarea1.Text = textarea1.Text & Chr(10) & "118,5"
 textarea1.Text = textarea1.Text & Chr(10) & "125,7"
 textarea1.Text = textarea1.Text & Chr(10) & "121,4"
 textarea1.Text = textarea1.Text & Chr(10) & "122,4"
 textarea1.Text = textarea1.Text & Chr(10) & "96,8"
 textarea1.Text = textarea1.Text & Chr(10) & "118,9"
 textarea1.Text = textarea1.Text & Chr(10) & "120"
 textarea1.Text = textarea1.Text & Chr(10) & "112,2"
 textarea1.Text = textarea1.Text & Chr(10) & "127,9"
 textarea1.Text = textarea1.Text & Chr(10) & "122,8"
 textarea1.Text = textarea1.Text & Chr(10) & "128,9"
 textarea1.Text = textarea1.Text & Chr(10) & "120,3"
'mw = 119,373
'varianz = 92,6016
'sigma = 9,62297
END
----------------------------
PUBLIC SUB Button3_Click()
 ME.Close
END

Einem Profiprogrammierer dreht es den Magen um, wenn er sieht, wie der Testdatensatz geladen wird. Aber es funktioniert. Und als kleine programmiertechnische Herausforderung kann man das Laden des Testdatensatzes mit dem Array Befehl deutlich verkürzen.

Siehe Gambas: Arrays

Der Median

[Bearbeiten]

Der Medianwert oder Zentralwert einer Werteliste liegt zwischen zwei gleich großen Hälften der Liste. 50 % der Werte sind größer/gleich als der Median, 50 % sind kleiner/gleich als der Median. Im Gegensatz zum arithmetischen Mittelwert ist er durch Extremwerte (Ausreißer) in der Werteliste kaum beeinflußbar.

Will man den Median programmieren muß man:

  • 1.Die Werteliste sortieren
  • 2.Überprüfen ob es sich um eine gerade Anzahl oder eine ungerade Anzahl von Werten handelt.
  • 3.Die entsprechenden Formeln anwenden, um den Median zu berechnen.
    • Bei ungerader Zahl an Werten
xmedian = x[(n+1)/2]
    • Bei gerader Zahl an Werten
xmedian = 1/2*(x[n/2] + x[n/2+1])

Beispiel 1:

sortierte Werteliste:

11
12
13
14
15    

Die Zahl der Werte ist ungerade , n = 5

(n+1)/2 =  6/2 = 3 

xmedian = x[3] = 13

Beispiel 2.

sortierte Werteliste:

11
12
13
14
15
16

Die Zahl der Werte ist gerade , n = 6

n/2 =  6/2 = 3 
x[3] = 13
x[4] = 14
xmedian = 1/2*(13+14) = 13,5

Sie können obige Werteliste direkt in Ihr Beispielprogramm übernehmen: Nutzen Sie dazu den Zwischenspeicher: Markieren, Strg+C drücken. In Ihrem Programm mit Strg+V wieder abladen. Sortieren und Median ausrechnen. Klappt es ?

Beispielprogramm: Sie brauchen 2 Textareas , 3 Commandbuttons und eine Textbox, um das Programm zu starten:

' Gambas CLASS file
liste AS String[]
PUBLIC SUB Form_Open()
  ME.Text = "Zentralwert berechnen"
END
PUBLIC SUB Button1_Click()
'umsortieren
c AS Integer 
j AS Integer 
n AS Integer 
y AS Variant
liste AS String[]
element AS String 
txt AS String 
text AS String 
text = Textarea1.Text
liste = Split(text,Chr(10))
y = 0
n = liste.length
REPEAT 
c = 0
 FOR j = 0 TO n - 2
   'PRINT j,y,liste[0],ar[1],ar[2],ar[3],ar[4]
   IF Val(liste[j]) > Val(liste[j + 1]) THEN 
     y = Val(liste[j]) 
     liste[j] = liste[j + 1]
     liste[j + 1] = Str(y) 
     c = 1
   ENDIF 
 NEXT 
UNTIL c = 0 
FOR EACH element IN liste 
txt = txt & Str(element) & Chr(10) 
NEXT
PRINT txt
textarea2.Text = ""
txt = Mid$(txt,1,-1)
'Der letzte Zeilenumbruch chr(10) muß weg 
textarea2.Text = txt
END
PUBLIC SUB Button2_Click()
'median berechnen, vorher umsortieren notwendig !!
 text AS String
 median AS Float
 liste AS String[]
 posten AS String
 text = Textarea2.Text
 liste = Split(text,Chr(10))
 'Länge bestimmen und richtige Formel verwenden,
 'je nachdem ob die Länge gerade oder ungerade ist.
  IF liste.Length MOD 2 THEN 
  'PRINT liste.Length MOD 2 & " Ungerade"
  'PRINT (liste.length + 1)/2
  'PRINT liste[(liste.length + 1)/2 - 1]
  median = Val(liste[(liste.length + 1)/2 - 1])
  'Der Array beginnt mit dem Element 0 nicht mit 1 !
  ELSE
  'PRINT liste.Length MOD 2 & " Gerade"
  median = (Val(liste[liste.length/2 - 1]) + Val(liste[liste.length/2]))/2
  'Der Array beginnt mit dem Element 0 nicht mit 1 !
  ENDIF 
 textbox1.Text = Str(median)
 END
 PUBLIC SUB Button3_Click()
 'Ungerade Werteliste als Beispiel
 textarea1.Text = "114,3"
 textarea1.Text = textarea1.Text & Chr(10) & "135,7"
 textarea1.Text = textarea1.Text & Chr(10) & "104,8"
 textarea1.Text = textarea1.Text & Chr(10) & "118,5"
 textarea1.Text = textarea1.Text & Chr(10) & "125,7"
 textarea1.Text = textarea1.Text & Chr(10) & "121,4"
 textarea1.Text = textarea1.Text & Chr(10) & "122,4"
 textarea1.Text = textarea1.Text & Chr(10) & "96,8"
 textarea1.Text = textarea1.Text & Chr(10) & "118,9"
 textarea1.Text = textarea1.Text & Chr(10) & "120"
 textarea1.Text = textarea1.Text & Chr(10) & "112,2"
 textarea1.Text = textarea1.Text & Chr(10) & "127,9"
 textarea1.Text = textarea1.Text & Chr(10) & "122,8"
 textarea1.Text = textarea1.Text & Chr(10) & "128,9"
 textarea1.Text = textarea1.Text & Chr(10) & "120,3"
'median = 120,3
END

Gausssche Normalverteilung

[Bearbeiten]

Das folgende Programm berechnet die Werte der Gaussschen Normalverteilung zwischen -5 und 5. Siehe auch: http://www.madeasy.de/2/gauss.htm

PUBLIC SUB Form_Open()
DIM x AS Float
DIM y AS Float
DIM t AS String
FOR x = -5 TO 5 STEP 0.1 
 y = 2.718 ^ (-x * x) 
 t = t & Str(x) & " " & Str(y) & Chr(13) & Chr(10) 
NEXT
PRINT t
END

Tests

[Bearbeiten]

Vierfeldertest

[Bearbeiten]

Der Vierfeldertest ist einfaches, aber sehr wichtiges Werkzeug zur statistischen Bewertung von Merkmalen in 2 Gruppen.

Zur Ausführung des Programmes brauchen Sie:

  • 4 Labelfelder
  • 4 Textboxen
  • 1 Textarea
  • 3 Commandbuttons.

Der Code lautet:

PUBLIC SUB Form_Open()
 ME.Text = "Vierfeldertest"
END
PUBLIC SUB Button1_Click()
 ME.Close
END
PUBLIC SUB Button2_Click()
textbox1.Text = ""
textbox2.Text = ""
textbox3.Text = ""
textbox4.Text = ""
textarea1.Text = ""
END
PUBLIC SUB Button3_Click()
' Rem Fehlerroutine bei leeren Feldern einbauen
DIM N1  AS Float
DIM N2  AS Float
DIM M1  AS Float
DIM M2 AS Float
DIM R1  AS Float
DIM NN  AS Float
DIM N  AS Float
DIM E1  AS Float
DIM MM  AS Float
DIM E2  AS Float
DIM R2  AS Float
DIM E3  AS Float
DIM E4 AS Float
DIM D1  AS Float
DIM C1  AS Float
DIM D2  AS Float
DIM C2  AS Float
DIM D3  AS Float
DIM C3  AS Float
DIM D4  AS Float
DIM C4  AS Float
DIM C  AS Float 
DIM S  AS Float
DIM P AS Float
textarea1.Text = ""
N1 = Val(textbox1.Text)
N2 = Val(textbox2.Text)
M1 = Val(textbox3.Text)
M2 = Val(textbox4.Text)
'ERWARTUNGSWERT EN1
R1 = N1 + M1
NN = N1 + N2
N = N1 + N2 + M1 + M2
E1 = R1 * NN / N
textarea1.Text = textarea1.Text & "Erwartungswert E1 =" & Str(E1) & Chr(13) & Chr(10)
'Rem ERWARTUNGSWERT EN2
MM = M1 + M2
E2 = R1 * MM / N
textarea1.Text = textarea1.Text & "Erwartungswert E2 =" & Str(E2) & Chr(10) & Chr(13)
'Rem ERWARTUNGSWERT EN3
R2 = N2 + M2
E3 = R2 * NN / N
textarea1.Text = textarea1.Text & "Erwartungswert E3 =" & Str(E3) & Chr(13) & Chr(10)
'Rem ERWARTUNGSWERT EN4
E4 = R2 * MM / N
textarea1.Text = textarea1.Text & "Erwartungswert E4 =" & Str(E4) & Chr(13) & Chr(10)
' Rem PROBE=0?
S = E1 + E2 + E3 + E4
P = S - N
textarea1.Text = textarea1.Text & "Probe" & Str(S) & "-" & Str(N) & "=" & Str(P) & "=0?" & Chr(13) & Chr(10)
' Rem CHI^2
D1 = (N1 - E1) ^ 2
C1 = D1 / E1
D2 = (M1 - E2) ^ 2
C2 = D2 / E2
D3 = (N2 - E3) ^ 2
C3 = D3 / E3
D4 = (M2 - E4) ^ 2
C4 = D4 / E4
C = C1 + C2 + C3 + C4
textarea1.Text = textarea1.Text & "CHI-QUADRAT=" & Str(C) & Chr(13) & Chr(10)
IF C - 3.841 > 0 THEN textarea1.Text = textarea1.Text & "Bei P=0.05 besteht ein signifikanter Unterschied"
IF C - 3.841 <= 0 THEN textarea1.Text = textarea1.Text & "Bei P=0.05 besteht kein signifikanter Unterschied "
END

Runtest

[Bearbeiten]

Wenn man eine Messung aus Sicherheitsgründen mehrfach durchführt, kann man mit dem Runtest überprüfen, ob die erhaltenen einzelnen Messwerte rein zufällig um den wahren Wert streuen oder ob die Messung nichtzufällige Werte liefert. Allgemein kann man mit dem Runtest auch gut Zufallsgeneratoren wie z.B. einen Würfel oder eine Münze durch mehrfache Wiederholung auf ihre wirkliche Zufälligkeit überprüfen.

Siehe dazu auch: http://de.wikipedia.org/wiki/Run-Test

Überprüfung einer Münze auf Zufälligkeit

[Bearbeiten]

Durch mehrfachen Münzwurf wurde folgende Ergebnisreihe gewonnen.

0100100101110111010001001101100101101

Dabei steht die 0 für Wappen und 1 für Zahl der Münze.

Ein Run ist dann eine Folge von Würfen mit demselben Ergebnis.

Folgende Runs sind in der Folge

0
1
00
1
00
1
0
111
0
1
000
1
00
11
0
11
00
1
0
11
0
1

Insgesamt sind es 24 Runs, d.h. Folgen mit demselben Zeichen 0 oder 1.

Wie kann man diese Serie jetzt auf Ihre Zufälligkeit überprüfen ?

Dazu braucht man einige Formeln und Parameter für den Runtest.

  • Man braucht die Gesamtzahl der Würfe n.
  • Man braucht die Gesamtzahl der Runs R.
  • Man braucht die Zahl der 1er Würfe n1.
  • Man braucht die Zahl der 0er Würfe n2.
  • Man braucht den Erwartungswert ER für die statistisch erwartete Zahl der Runs.
ER = 2 * n1 * n2 / n + 1
  • Man braucht die Varianz varR und die Wurzel der Varianz.
varR = 2*n1*n2*(2*n1*n2-n)/(n*n*(n1+n2-1)
  • Man braucht ein Signifikanzniveau p = 0,05
  • Man braucht eine Prüfgröße z. Diese muß zwischen -1,96 und +1,96 liegen , dann kann man von einer zufälligen Folge ausgehen.
z = (R - ER) / sqrt(varR)

Wie kann man das alles Programmieren ?

[Bearbeiten]

Beispiel: Sie brauchen

  • 4 Textareas,
  • 13 Befehlsbuttons
  • 10 Textboxen

auf Ihrer Form, um das Programm in Gang zu bringen.

Die Bedienung des Programmes ist gewöhnungsbedürftig. Sie verläuft so ziemlich im Uhrzeigersinn. Man kann die Bedienerführung verbessern, wenn man ein paar Errorroutinen mit CATCH einbaut und auf die richtige Bedienung hinweist. Außerdem ist der SETFOCUS Befehl hilfreich, der den nächsten Befehlsknopf markiert, den man drücken muß. Mit ein paar vernünftigen Unterprogrammen und einem Start des Programmes mit einem Knopfdruck wird alles einfacher und weniger fehlerträchtig. Das kommt dann in die verbesserte Version 2.

Layout

[Bearbeiten]

Der Code

[Bearbeiten]
 PUBLIC SUB Form_Open()
  ME.Text = "Runtest durchführen"
'Der Run-Test ist ein nichtparametrischer Test 
'auf Stationarität bzw. Nicht-Korrelation 
'IN einer Zeitreihe oder anderen Sequenz. 
'Die abzulehnende Nullhypothese ist hier, 
'dass aufeinanderfolgende Werte unkorreliert sind. 
'Ein run oder "Lauf" ist definiert als eine Folge 
'von gleichen Symbolen IN einer Symbolsequenz 
'mit endlichem Alphabet.
'Aus einer Symbolsequenz muss zunächst eine numerische Reihe 
'erzeugt werden
'Zunächst wird der Median der Reihe berechnet 
'und von allen Werten abgezogen. 
'IN der resultierenden Reihe werden negative Zahlen 
'durch ein '-' und positive durch ein '+' ersetzt. 
'Für Stichprobenumfänge n1,n2 > 10 ist 
'(mit n1,n2 gleich der Anzahl der "plus" und der "minus") 
'die Wahrscheinlichkeitsverteilung der runs ungefähr normal 
'mit dem Mittelwert UM = 2 * n1*n2 /(n1+n2) + 1
'und Varianz
'varianz = 2*n1*n2*(2*n1*n2 – n1 – n2) / (n1 + n2) / (n1 + n2) / (n1 + n2 – 1)
'Die Testgröße z berechnet sich nun nach:
'z = ( U – UM ) / Wurzel aus Varianz 
'wobei U die gemessene Anzahl der "runs" von '-' 
'und '+' in der Reihe ist. 
'z ist ungefähr standardnormalverteilt.
'Beispiel 
'13 3 14 14 1 14 3 8 14 17 9 14 13 2 16 1 3 12 13 14
' 13
' 3
' 14
' 14
' 1
' 14
' 3
' 8
' 14
' 17
' 9
' 14
' 13
' 2
' 16
' 1
' 3
' 12
' 13
' 14
'Median 13    Abzug von der Orginalreihe 
'0 -10 1 1 -12 1 -10 -5 1 4 -4 1 0 -11 3 -12 -10 -1 0 1
'Umwandlung in + und -
'+ - + + - + - - + + - + + - + - - - + +
'1 2 3   4 5 6   7   8 9   101112    13
'U ist die Zahl der Runs 
'U = 13 runs bzw U: 13
'n1 = Pluszeichen '+': 11
'n2 = Minuszeichen '-': 9
'UM = (2*11*9)/(11+9) + 1 = 10,9
'varianz '= ... = 4,6 ????
'σU = 2,1
'z = (13 - 10,9) / 2,1 = 1.0
'Entscheidung: Die Hypothese wird nicht abgelehnt. 
'Die Elemente der Stichprobe sind vermutlich zufällig entnommen worden. 
'Bei einem Signifikanzniveau von 0,05 wird H0 abgelehnt, wenn |z| > 1,96. Dies ist nicht der Fall.
'Entscheidung: Die Hypothese wird nicht abgelehnt. Die Elemente der Stichprobe sind vermutlich zufällig    
'entnommen worden.
'that most of the z-scores for run lengths 1, 2, and 3 
'have an absolute value greater than 1.96. 
'This IS strong evidence that these data are 
'IN fact NOT random. 
'Siehe auch: http://www.itl.nist.gov/div898/handbook/eda/section3/eda35d.htm
'http://www.wu-wien.ac.at/usr/stat2/melichar/spsspu1/spssk3-9.htm 
'Bradley, (1968). Distribution-Free Statistical Tests, Chapter 12.
'
END
liste AS String[]
PUBLIC SUB Button1_Click()
 DIM text AS String
 DIM median AS Float
 DIM liste AS String[]
 DIM posten AS String
 text = Textarea2.Text
 liste = Split(text,Chr(10))
 'umsortieren
 'Länge bestimmen und richtige Formel verwenden,
 'je nachdem ob die Länge gerade oder ungerade ist.
  IF liste.Length MOD 2 THEN 
  PRINT liste.Length MOD 2 & " Ungerade"
  PRINT (liste.length + 1)/2
  PRINT liste[(liste.length + 1)/2 - 1]
  median = Val(liste[(liste.length + 1)/2 - 1])
  'Der Array beginnt mit dem Element 0 nicht mit 1 !
  ELSE
  PRINT liste.Length MOD 2 & " Gerade"
  median = (Val(liste[liste.length/2 - 1]) + Val(liste[liste.length/2]))/2
  'Der Array beginnt mit dem Element 0 nicht mit 1 !
  ENDIF 
 textbox1.Text = Str(median)
  Button4.setfocus
  CATCH 
  IF textarea1.Text = ""  THEN message.info("Sie müssen im Textfeld 1 eine Werteliste eingeben")
  IF textarea2.Text = ""  THEN message.info("Sie müssen erst umsortieren drücken")
  RETURN
 END
 PUBLIC SUB Button2_Click()
'umsortieren
c AS Integer 
j AS Integer 
n AS Integer 
y AS Variant
DIM Liste AS String[]
element AS String 
txt AS String 
text AS String 
text = Textarea1.Text
liste = Split(text,Chr(10))
y = 0
n = liste.length
REPEAT 
c = 0
 FOR j = 0 TO n - 2
   'PRINT j,y,liste[0],ar[1],ar[2],ar[3],ar[4]
   IF Val(liste[j]) > Val(liste[j + 1]) THEN 
     y = Val(liste[j]) 
     liste[j] = liste[j + 1]
     liste[j + 1] = Str(y) 
     c = 1
   ENDIF 
 NEXT 
UNTIL c = 0 
FOR EACH element IN liste 
txt = txt & Str(element) & Chr(10) 
NEXT
PRINT txt
textarea2.Text = ""
txt = Mid$(txt,1,-1)
'Der letzte Zeilenumbruch muß weg 
textarea2.Text = txt
Button1.setfocus
END
PUBLIC SUB Button3_Click()
 textarea1.Text = "114,3"
 textarea1.Text = textarea1.Text & Chr(10) & "135,7"
 textarea1.Text = textarea1.Text & Chr(10) & "104,8"
 textarea1.Text = textarea1.Text & Chr(10) & "118,5"
 textarea1.Text = textarea1.Text & Chr(10) & "125,7"
 textarea1.Text = textarea1.Text & Chr(10) & "121,4"
 textarea1.Text = textarea1.Text & Chr(10) & "122,4"
 textarea1.Text = textarea1.Text & Chr(10) & "96,8"
 textarea1.Text = textarea1.Text & Chr(10) & "118,9"
 textarea1.Text = textarea1.Text & Chr(10) & "120"
 textarea1.Text = textarea1.Text & Chr(10) & "112,2"
 textarea1.Text = textarea1.Text & Chr(10) & "127,9"
 textarea1.Text = textarea1.Text & Chr(10) & "122,8"
 textarea1.Text = textarea1.Text & Chr(10) & "128,9"
 textarea1.Text = textarea1.Text & Chr(10) & "120,3"
'mw = 119,373
'varianz = 92,6016
'sigma = 9,62297
'median
Button2.setfocus
END
PUBLIC SUB Button4_Click()
'median abziehen 
m AS Float 
d AS Float 
n AS Integer 
y AS Variant
DIM Liste AS String[]
element AS String 
txt AS String 
text AS String 
text = Textarea1.Text
m = Val(textbox1.Text)
liste = Split(text,Chr(10))
y = 0
n = liste.length
FOR EACH element IN liste 
d = Val(element) - m 
'PRINT element,m,d
txt = txt & Str(d) & Chr(10) 
NEXT
PRINT txt
textarea3.Text = ""
txt = Mid$(txt,1,-1)
'Der letzte Zeilenumbruch muß weg 
textarea3.Text = txt
  Button6.setfocus
END
PUBLIC SUB Button5_Click()
'in 1,0 Folge umwandeln 
e AS Integer 
DIM Liste AS String[]
element AS String 
txt AS String 
text AS String 
text = Textarea3.Text
liste = Split(text,Chr(10))
 'n = liste.length
FOR EACH element IN liste 
IF Val(element) < 0 THEN 
e = 0
ELSE 
e = 1
ENDIF 
txt = txt & Str(e) & Chr(10) 
NEXT
PRINT txt
textarea4.Text = ""
txt = Mid$(txt,1,-1)
'Der letzte Zeilenumbruch muß weg 
textarea4.Text = txt
END
PUBLIC SUB Button6_Click()
DIM s AS String
DIM n AS Integer
DIM T AS String
DIM char AS String
DIM ozaehler AS Integer
DIM izaehler AS Integer
DIM Liste AS String[]
element AS String 
txt AS String 
text AS String 
text = Textarea4.Text
liste = Split(text,Chr(10))
n = liste.length
ozaehler = 0
izaehler = 0
FOR EACH element IN liste 
IF element = "0" THEN ozaehler = ozaehler + 1
IF element = "1" THEN izaehler = izaehler + 1
NEXT
textbox2.Text = ozaehler
textbox3.Text = izaehler
textbox4.Text = ozaehler + izaehler
END
PUBLIC SUB Button11_Click()
  ME.Close 
END
PUBLIC SUB Button7_Click()
UM AS Float
n1 AS Integer
n2 AS Integer
n1 = Val(textbox2.Text)
n2 = Val(textbox3.Text)
UM = 2 * n1 * n2 /( n1 + n2 ) + 1
textbox5.Text = Str(UM)
END
PUBLIC SUB Button8_Click()
DIM s AS String
DIM n AS Integer
DIM T AS String
DIM char AS String
charnext AS String 
DIM runzaehler AS Integer
DIM Liste AS String[]
 element AS String 
txt AS String 
text AS String 
text = Textarea4.Text
liste = Split(text,Chr(10))
n = liste.length
FOR EACH element IN liste 
s = s & element 
NEXT
runzaehler = 1
   T = Trim(s)
   FOR n = 1 TO Len(T) - 1
       char = Mid$(T, n, 1)
       charnext = Mid$(T, n + 1, 1)
       IF char <> charnext THEN runzaehler = runzaehler + 1
  NEXT
textbox6.Text = runzaehler
END
PUBLIC SUB Button9_Click()
'varianz = 2*n1*n2*(2*n1*n2 – n1 – n2) / (n1 + n2) / (n1 + n2)
varianz AS Float
n1 AS Integer
n2 AS Integer
zwei AS Integer 
summe AS Integer 
run AS Integer 
n1 = Val(textbox2.Text)
n2 = Val(textbox3.Text)
run = Val(textbox6.text)
zwei = 2 * n1 * n2
summe = n1 + n2 
PRINT zwei,summe,zwei * (zwei - summe), 
varianz = zwei *( zwei - summe) / (summe * summe * (summe - 1))
'varianz=(run * (run - 2))/(4 * (run - 1))
textbox7.Text = Str(varianz)
IF varianz < 0 THEN varianz = -varianz 
textbox8.Text = Str(Sqr(varianz))
END
PUBLIC SUB Button10_Click()
z AS Float
run AS Float 
UM AS Float
svar AS Float  
run = Val(textbox6.text)
UM = Val(textbox5.text)
svar = Val(textbox8.text) 
z = ( run - UM)/svar 
textbox9.Text = Str(z)
END
PUBLIC SUB Button12_Click()
z AS Float
t1 AS String
t2 AS String
t1 = "Die Meßwerte sind mit einem p <0,05 zufällig erhoben worden!"
t2 = "Die Meßwerte sind mit einem p <0,05 NICHT zufällig erhoben worden!"
z = Val(textbox9.Text)
IF z > 1.96 XOR z < -1.96 THEN 
textbox10.text = t2
ELSE 
textbox10.text = t1
ENDIF  
END 
PUBLIC SUB Button13_Click()
'noch ein paar Beispielwerte, sicher nicht zufällig 
  textarea1.Text = "1"
 textarea1.Text = textarea1.Text & Chr(10) & "2"
 textarea1.Text = textarea1.Text & Chr(10) & "3"
 textarea1.Text = textarea1.Text & Chr(10) & "4"
 textarea1.Text = textarea1.Text & Chr(10) & "5"
 textarea1.Text = textarea1.Text & Chr(10) & "6"
 textarea1.Text = textarea1.Text & Chr(10) & "7"
 textarea1.Text = textarea1.Text & Chr(10) & "8"
 textarea1.Text = textarea1.Text & Chr(10) & "9"
 textarea1.Text = textarea1.Text & Chr(10) & "10"
 textarea1.Text = textarea1.Text & Chr(10) & "11"
 textarea1.Text = textarea1.Text & Chr(10) & "12"
 textarea1.Text = textarea1.Text & Chr(10) & "13"
 textarea1.Text = textarea1.Text & Chr(10) & "14"
 textarea1.Text = textarea1.Text & Chr(10) & "15"
END

Vereinfachungen

[Bearbeiten]
  • Die Beispiele können mit dem Array Befehl viel schneller eingegeben werden.
  • Das Sortieren kann mit dem Array befehl Array.sort stark vereinfacht werden.
  • Das Ganze sollte mit einem Knopfdruck funktionieren.
  • Die Setfocusbefehle sollten in der richtigen Reihenfolge durchlaufen
  • Unterprogramme für die einzelnen Abschnitte wären übersichtlicher.

Das ganze funktioniert weniger fehlerträchtig, wenn alles auf einen Knopfdruck hin passiert. Trotzdem sollte man obige Version stehen lassen, das sie Schritt für Schritt vorgeht.

Runtest 2

[Bearbeiten]

In etwas einfacherer Form wurde der Runtest noch einmal programmiert:

Man braucht dazu

  • 9 Commandbuttons
  • 9 Textboxen
  • 1 Textarea

2 einfache Beispielfolgen wurden integriert.

Listing:

PUBLIC SUB Form_Open()
'Der Run-Test ist ein nichtparametrischer Test 
'auf Stationarität bzw. Nicht-Korrelation 
'IN einer Zeitreihe oder anderen Sequenz. 
'Die abzulehnende Nullhypothese ist hier, 
'dass aufeinanderfolgende Werte unkorreliert sind. 
'Ein run oder "Lauf" ist definiert als eine Folge 
'von gleichen Symbolen IN einer Symbolsequenz 
'mit endlichem Alphabet.
'Aus einer Symbolsequenz muss zunächst eine numerische Reihe 
'erzeugt werden
'Zunächst wird der Median der Reihe berechnet 
'und von allen Werten abgezogen. 
'IN der resultierenden Reihe werden negative Zahlen 
'durch ein '-' und positive durch ein '+' ersetzt. 
'Für Stichprobenumfänge n1,n2 > 10 ist 
'(mit n1,n2 gleich der Anzahl der "plus" und der "minus") 
'die Wahrscheinlichkeitsverteilung der runs ungefähr normal 
'mit dem Mittelwert UM = 2 * n1*n2 /(n1+n2) + 1
'und Varianz
'varianz = 2*n1*n2*(2*n1*n2 – n1 – n2) / (n1 + n2) / (n1 + n2) / (n1 + n2 – 1)
'Die Testgröße z berechnet sich nun nach:
'z = ( U – UM ) / Wurzel aus Varianz 
'wobei U die gemessene Anzahl der "runs" von '-' 
'und '+' in der Reihe ist. 
'z ist ungefähr standardnormalverteilt.
'Beispiel 
'13 3 14 14 1 14 3 8 14 17 9 14 13 2 16 1 3 12 13 14
'Median 13    Abzug von der Orginalreihe 
'0 -10 1 1 -12 1 -10 -5 1 4 -4 1 0 -11 3 -12 -10 -1 0 1
'Umwandlung in + und -
'+ - + + - + - - + + - + + - + - - - + +
'1 2 3   4 5 6   7   8 9   101112    13
'U ist die Zahl der Runs 
'U = 13 runs bzw U: 13
'n1 = Pluszeichen '+': 11
'n2 = Minuszeichen '-': 9
'UM = (2*11*9)/(11+9) + 1 = 10,9
'varianz '= ... = 4,6 ????
'σU = 2,1
'z = (13 - 10,9) / 2,1 = 1.0
'Entscheidung: Die Hypothese wird nicht abgelehnt. 
'Die Elemente der Stichprobe sind vermutlich zufällig entnommen worden. 
'that most of the z-scores for run lengths 1, 2, and 3 
'have an absolute value greater than 1.96. 
'This IS strong evidence that these data are 
'IN fact NOT random. 
'Siehe auch: http://www.itl.nist.gov/div898/handbook/eda/section3/eda35d.htm
'http://www.wu-wien.ac.at/usr/stat2/melichar/spsspu1/spssk3-9.htm 
'Bradley, (1968). Distribution-Free Statistical Tests, Chapter 12.
'
END
PUBLIC SUB Button1_Click()
ME.CLOSE
END
PUBLIC SUB Button2_Click()
DIM s AS String
DIM n AS Integer
DIM T AS String
DIM char AS String
DIM ozaehler AS Integer
DIM izaehler AS Integer
s = textarea1.Text
ozaehler = 0
izaehler = 0
   T = Trim(s)
   FOR n = 1 TO Len(T)
       char = Mid$(T, n, 1)
       SELECT CASE TRUE
          CASE char = "0"
           ozaehler = ozaehler + 1
          CASE char = "1"
           izaehler = izaehler + 1
       END SELECT
   NEXT
textbox1.Text = ozaehler
textbox2.Text = izaehler
textbox3.Text = ozaehler + izaehler
END
PUBLIC SUB Button3_Click()
'mehrfacher Muenzwurf zur Erzeugung einer Zufallsfolge von 0 und 1
DIM a AS Integer
DIM t AS String
DIM M AS Integer
Randomize()
FOR a = 1 TO 200
   M = Int(2 * Rnd) 
   ' Erzeugt einen Wurf zwischen     0 und 1
   t = t & LTrim$(Str$(M))
NEXT
Textarea1.Text = t
END
PUBLIC SUB Button4_Click()
UM AS Float
n1 AS Integer
n2 AS Integer
n1 = Val(textbox1.Text)
n2 = Val(textbox2.Text)
UM = 2 * n1 * n2 /( n1 + n2 ) + 1
'UM = 2 * n1*n2 /(n1+n2) + 1
'Mittelwert der Wahrscheinlichkeitsverteilung der runs
textbox4.Text = Str(UM)
END
PUBLIC SUB Button6_Click()
'varianz = 2*n1*n2*(2*n1*n2 – n1 – n2) / (n1 + n2) / (n1 + n2)
'Varianz der Wahrscheinlichkeitsverteilung der runs
varianz AS Float
n1 AS Integer
n2 AS Integer
zwei AS Integer 
summe AS Integer 
run AS Integer 
n1 = Val(textbox1.Text)
n2 = Val(textbox2.Text)
run = Val(textbox5.text)
zwei = 2 * n1 * n2
summe = n1 + n2 
PRINT zwei,summe,zwei * (zwei - summe), 
varianz = zwei *( zwei - summe) / (summe * summe * (summe - 1))
'varianz=(run * (run - 2))/(4 * (run - 1))
textbox6.Text = Str(varianz)
IF varianz < 0 THEN varianz = -varianz 
textbox7.Text = Str(Sqr(varianz))
END
PUBLIC SUB Button7_Click()
'+ - + + - + - - + + - + + - + - - - + +
Textarea1.Text = "10110100110110100011"
END
PUBLIC SUB Button5_Click()
DIM s AS String
DIM n AS Integer
DIM T AS String
DIM char AS String
charnext AS String 
DIM runzaehler AS Integer
s = textarea1.Text
runzaehler = 1
   T = Trim(s)
   FOR n = 1 TO Len(T) - 1
       char = Mid$(T, n, 1)
       charnext = Mid$(T, n + 1, 1)
       IF char <> charnext THEN runzaehler = runzaehler + 1
  NEXT
textbox5.Text = runzaehler
END
PUBLIC SUB Button8_Click()
z AS Float
run AS Float 
UM AS Float
svar AS Float  
run = Val(textbox5.text)
UM = Val(textbox4.text)
svar = Val(textbox7.text) 
z = ( run - UM)/svar 
'z ist die Prüfvariable
textbox8.Text = Str(z)
END
PUBLIC SUB Button9_Click()
z AS Float
t1 AS String
t2 AS String
t1 = "Die Meßwerte sind mit einem p <0,05 zufällig erhoben worden!"
t2 = "Die Meßwerte sind mit einem p <0,05 NICHT zufällig erhoben worden!"
z = Val(textbox8.Text)
IF z > 1.96 XOR z < -1.96 THEN 
textbox9.text = t2
ELSE 
textbox9.text = t1
ENDIF  
END

Abbildung des Programmablaufes für die 01 Folge Chaitin A

Runtest 3

[Bearbeiten]

Das Programm wurde im Vergleich zu Runtest 2 noch einmal einfacher programmiert. Der Test läuft jetzt auf einen Click. 3 Beispiele wurden integriert.

Man braucht dazu

  • 5 Commandbuttons
  • 9 Textboxen
  • 1 Textarea

3 einfache Beispielfolgen wurden integriert.

Code:

PUBLIC SUB Form_Open()
ME.Text = "Runtest von Münzwürfen"
END
PUBLIC SUB Button1_Click()
s AS String
'10Folge aus der Textarea
n AS Integer
'Laufvariable
T AS String
'getrimmte 10 Folge aus s
char AS String
'einzelne Position der 10 Folge
oz AS Integer
'Zahl der Nullen
iz AS Integer
'Zahl der Einser
UM AS Float
'Mittelwert der Wahrscheinlichkeitsverteilung der runs
runs AS Integer
'Zahl der runs
charnext AS String 
'nächste Position in der Folge 
varianz AS Float
'Varianz der Wahrscheinlichkeitsverteilung der runs
zwei AS Integer 
summe AS Integer 
'Hilfsvariablen zur Berechnung der Varianz
svar AS Float  
'Wurzel der Varianz
z AS Float
'Prüfziffer 
t1 AS String
t2 AS String
'Bewertungstexte 
'------0 und 1, UM Berechnung-----------------
s = textarea1.Text
oz = 0
iz = 0
T = Trim(s)
    FOR n = 1 TO Len(T)
       char = Mid$(T, n, 1)
       SELECT CASE TRUE
          CASE char = "0"
           oz = oz + 1
          CASE char = "1"
           iz = iz + 1
       END SELECT
   NEXT
textbox1.Text = oz
textbox2.Text = iz
textbox3.Text = oz + iz
UM = 2 * oz * iz /( oz + iz ) + 1
'Mittelwert der Wahrscheinlichkeitsverteilung der runs
textbox4.Text = Str(UM)
'---Runs----------------------------------------------
runs = 1
   FOR n = 1 TO Len(T) - 1
       char = Mid$(T, n, 1)
       charnext = Mid$(T, n + 1, 1)
       IF char <> charnext THEN runs = runs + 1
  NEXT
textbox5.Text = runs
'-------Varianz----------------------------------------------
'varianz = 2*n1*n2*(2*n1*n2 – n1 – n2) / (n1 + n2) / (n1 + n2)
'Varianz der Wahrscheinlichkeitsverteilung der runs
zwei = 2 * oz * iz
summe = oz + iz 
'PRINT zwei,summe,zwei * (zwei - summe), 
varianz = zwei *( zwei - summe) / (summe * summe * (summe - 1))
textbox6.Text = Str(varianz)
IF varianz < 0 THEN varianz = -varianz 
textbox7.Text = Str(Sqr(varianz))
svar = Sqr(varianz)
z = ( runs - UM)/svar 
'z ist die Prüfvariable
textbox8.Text = Str(z)
'-------Bewertung------------------------------------------
t1 = "Die Meßwerte sind mit einem p <0,05 zufällig erhoben worden!"
t2 = "Die Meßwerte sind mit einem p <0,05 NICHT zufällig erhoben worden!"
IF z > 1.96 XOR z < -1.96 THEN 
textbox9.text = t2
ELSE 
textbox9.text = t1
ENDIF  
END
PUBLIC SUB Button2_Click()
'+ - + + - + - - + + - + + - + - - - + +
Textarea1.Text = "10110100110110100011"
END
PUBLIC SUB Button3_Click()
'mehrfacher Muenzwurf zur Erzeugung einer Zufallsfolge von 0 und 1
DIM a AS Integer
DIM t AS String
DIM M AS Integer
Randomize()
FOR a = 1 TO 200
   M = Int(2 * Rnd) 
   ' Erzeugt einen Wurf zwischen     0 und 1
   t = t & LTrim$(Str$(M))
NEXT
Textarea1.Text = t
END
PUBLIC SUB Button4_Click()
ME.CLOSE
END
PUBLIC SUB Button5_Click()
Textarea1.Text = "10101010101010101010"
END

Entropie bei einfachen 01 Folgen

[Bearbeiten]

Die Entropie ist ein Begriff der viel gebraucht aber wenig verstanden wird. In der Statistik wird der Begriff noch wenig genutzt, obwohl er eigentlich ein grundlegender Begriff sein könnte.

Im folgenden werden einige einfache Gambasprogramme augelistet und beschrieben, die die Entropieberechnung einfacher 01 Folgen schrittweise erarbeiten sollen.

Vorübung1

[Bearbeiten]

Im folgenden Programm werden systematisch alle Möglichkeiten einer zunehmend längeren 01 Folge aufgelistet. Sie brauchen nur eine leere Form, um das Programm in Gang zu bekommen. Die Ausgabe erfolgt im Direktfenster.

PUBLIC SUB Form_Open()
'Dieses Programm zaehlt im Binaersystem von 1 bis 2^8
'Die vorderen Leerräume werden mit Null aufgefüllt.
s AS Integer
z AS Integer
t AS String
FOR s = 1 TO 8
 FOR z = 0 TO (2^s - 1)
  t = Bin$(z,s)
  PRINT t
 NEXT 
NEXT
END

Ausgabe:

0
1
00
01
10
11
000
001
010
011
100
101
110
111
0000
0001
0010
0011
0100

Vorübung2

[Bearbeiten]

In einer zweiten Vorübung werden jetzt allen Binärzahlen Entropiewerte zugeordnet, die ganz grob vereinfacht ( und damit noch ziemlich falsch) berechnet werden. Eine ganz geordnete 01 Folge hat dabei immer den Entropiewert 0. Eine völlig zufällige 01 Folge hat einen Entropiewert, der ihrer Länge entspricht.

Beispiel:

  • 00000000000000000000 Entropie = 0
  • 01101100110111100010 Entropie = 20

Vorsicht die berechneten Entropiewerte sind noch ziemlich falsch !!

' Gambas class file
t AS String  
PUBLIC SUB Form_Open()
s AS Integer
z AS Integer
 n AS Integer 
e AS Integer 
n = 0
FOR s = 1 TO 10
 FOR z = 0 TO (2^s - 1)
 t = Bin$(z,s)
 PRINT "n,t " & n,t;
 e = ent(t)
 PRINT " E = " & e
 n = n + 1
 NEXT 
NEXT
END
PUBLIC FUNCTION ent(e AS Integer) AS Integer
oz AS Integer 
iz AS Integer 
gz  AS Integer 
char AS String 
te AS String 
n AS Integer 
oz = 0
iz = 0
gz = 0 
te = Trim(t)
  FOR n = 1 TO Len(te)
      char = Mid$(te, n, 1)
       SELECT CASE TRUE
          CASE char = "0"
           oz = oz + 1
          CASE char = "1"
           iz = iz + 1
       END SELECT
       gz = oz + iz 
   NEXT
PRINT " gz,oz,iz " & gz,oz,iz;
IF oz > iz THEN e = gz - oz 
'IF oz > 0.6*iz THEN e = gz - oz Else runstest 
IF oz < iz THEN e = oz
'IF oz < 0.4*iz THEN e = oz Else runstest 
IF oz = iz THEN e = gz
'IF oz = iz THEN runstest
RETURN e 
END

10Statistik

[Bearbeiten]

Man kann an das Problem der Unterscheidung zufälliger und nichtzufälliger 01 Folgen auch noch anders herangehen. Eine Möglichkeit zeigt das folgende Programm 01Statistik.

Das Programm kann an an Hand der Beispiele, die in ihm enthalten sind, leicht ausgetestet werden. Man kann jede beliebige 01 Folge in die Textarea kopieren und auswerten lassen. Es werden nur Runs bis maximal einer Länge von 10 berücksichtigt.

Sie brauchen

  • viele Befehlsbuttons
  • viele Textboxen
  • eine Textarea

um das Programm in Gang zu bringen.

Siehe auch: http://www.madeasy.de/2/prg01st.htm ( Noch in VB , Layout blieb gleich)

' Gambas class file
t AS String
PUBLIC SUB Button9_Click()
 ME.Close
END
PUBLIC SUB Button2_Click()
'diese Funktion soll eine 01 Datei untersuchen
'Sie soll die Zahl der 00 Paare  zurueckgeben
'io,oi,oo Zahl der anderen Paare
DIM s AS String 
DIM n AS Integer
DIM T AS String
DIM char AS String
DIM oozaehler AS Integer
DIM oizaehler AS Integer
DIM iozaehler AS Integer
DIM iizaehler AS Integer
s = textarea1.Text
oozaehler = 0
oizaehler = 0
iozaehler = 0
iizaehler = 0
T = Trim(s)
   FOR n = 1 TO Len(T) STEP 2
       char = Mid$(T, n, 2)
       SELECT CASE TRUE
          CASE char = "00"
           oozaehler = oozaehler + 1
          CASE char = "01"
           oizaehler = oizaehler + 1
          CASE char = "10"
           iozaehler = iozaehler + 1
          CASE char = "11"
           iizaehler = iizaehler + 1
   END SELECT
   NEXT
textbox4.Text = oozaehler
textbox5.Text = oizaehler
textbox6.Text = iozaehler
textbox7.Text = iizaehler
END
PUBLIC SUB Button1_Click()
'Wieviel 1 und 0 finden sich in der Folge ?
DIM s AS String
DIM n AS Integer
DIM T AS String
DIM char AS String
DIM ozaehler AS Integer
DIM izaehler AS Integer
s = textarea1.Text
ozaehler = 0
izaehler = 0
   T = Trim(s)
   FOR n = 1 TO Len(T)
       char = Mid$(T, n, 1)
       SELECT CASE TRUE
          CASE char = "0"
           ozaehler = ozaehler + 1
          CASE char = "1"
           izaehler = izaehler + 1
       END SELECT
   NEXT
textbox1.Text = ozaehler
textbox2.Text = izaehler
textbox3.Text = ozaehler + izaehler
END 
PUBLIC SUB Button6_Click()
'mehrfacher Muenzwurf zur Erzeugung einer Zufallsfolge von 0 und 1
DIM a AS Integer
DIM t AS String
DIM M AS Integer
Randomize()
FOR a = 1 TO 20000
   M = Int(2 * Rnd) 
   ' Erzeugt einen Wurf zwischen     0 und 1
   t = t & LTrim$(Str$(M))
NEXT
Textarea1.Text = t
END
PUBLIC SUB Button8_Click()
M AS String 
t AS String
a AS Integer 
FOR a = 1 TO 10000
   M = "10" 
   t = t & LTrim$(Str$(M))
NEXT
Textarea1.Text = t
END
PUBLIC SUB Button4_Click()
DIM s AS String
DIM n AS Integer
DIM T AS String
DIM Tempo AS String
DIM char AS String
a AS Integer 
DIM o1 AS Integer
DIM o2 AS Integer
DIM o3 AS Integer
DIM o4 AS Integer
DIM o5 AS Integer
DIM o6 AS Integer
DIM o7 AS Integer
DIM o8 AS Integer
DIM o9 AS Integer
DIM oa AS Integer
s = textarea1.Text
   T = Trim(s)
' 'Rem diese Funktion soll eine 01 Datei untersuchen
' 'Rem Sie soll die Zahl der 000,0000,00000 etc  ( der runs ) zurueckgeben
o1 = 0
o2 = 0
o3 = 0
o4 = 0
o5 = 0
o6 = 0
o7 = 0
o8 = 0
o9 = 0
oa = 0
' 'Rem 00000000001000000000010000000000
' Cls
Tempo = RTrim$(LTrim$(s))
' 'Rem a = 10
a = 10
' 'Rem PRINT Mid$(Temp, 1, 11)
IF Mid$(Tempo, 1, a + 1) = "00000000001" THEN oa = oa + 1
' 'Rem PRINT Mid$(Temp, Len(Temp) - 10, 11)
IF Len(Tempo) < a THEN GOTO a9
IF Len(Tempo) = a AND s = "0000000000" THEN oa = oa + 1
IF Len(Tempo) = a THEN GOTO a9
IF Mid$(Tempo, Len(Tempo) - 10, 11) = "10000000000" THEN oa = oa + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "100000000001" THEN oa = oa + 1
'Rem PRINT Mid$(Tempo, n, a)
NEXT
' 
a9:
' 'Rem a = 9
a = 9
'Rem 00000000010000000001000000000
' 'Rem PRINT Mid$(Temp, 1, 10)
IF Mid$(Tempo, 1, 10) = "0000000001" THEN o9 = o9 + 1
'Rem PRINT Mid$(Temp, Len(Temp) - 9, 10)
IF Len(Tempo) < a THEN GOTO a8
IF Len(Tempo) = a AND s = "000000000" THEN o9 = o9 + 1
IF Len(Tempo) = a THEN GOTO a8
IF Mid$(Tempo, Len(Tempo) - 9, 10) = "1000000000" THEN o9 = o9 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "10000000001" THEN o9 = o9 + 1
' 'Rem PRINT Mid$(Temp, n, a)
NEXT 
' 
a8:
' 'Rem a = 8
a = 8
' 'Rem 00000000100000000100000000
' 'Rem PRINT Mid$(Temp, 1, a + 1)
IF Mid$(Tempo, 1, a + 1) = "000000001" THEN o8 = o8 + 1
 'Rem PRINT Mid$(Temp, Len(Temp) - a, a + 1)
IF Len(Tempo) < a THEN GOTO a7
IF Len(Tempo) = a AND s = "00000000" THEN o8 = o8 + 1
IF Len(Tempo) = a THEN GOTO a7
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "1000000001" THEN o8 = o8 + 1
' 'Rem PRINT Mid$(Temp, n, a)
NEXT 
' 
a7:
' 'Rem a = 7
a = 7
' 'Rem 00000000100000000100000000
IF Mid$(Tempo, 1, a + 1) = "00000001" THEN o7 = o7 + 1
IF Len(Tempo) < a THEN GOTO a6
IF Len(Tempo) = a AND s = "0000000" THEN o7 = o7 + 1
IF Len(Tempo) = a THEN GOTO a6
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "10000000" THEN o7 = o7 + 1
 FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "100000001" THEN o7 = o7 + 1
NEXT 
' 
a6:
' 'Rem a = 6
a = 6
' 'Rem 00000010000001000000
IF Mid$(Tempo, 1, a + 1) = "0000001" THEN o6 = o6 + 1
IF Len(Tempo) < a THEN GOTO a5
IF Len(Tempo) = a AND s = "000000" THEN o6 = o6 + 1
IF Len(Tempo) = a THEN GOTO a5
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "1000000" THEN o6 = o6 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "10000001" THEN o6 = o6 + 1
NEXT 
' 
a5:
' 'Rem a = 5
a = 5
' 'Rem 00000100000100000
IF Mid$(Tempo, 1, a + 1) = "000001" THEN o5 = o5 + 1
IF Len(Tempo) < a THEN GOTO a4
IF Len(Tempo) = a AND s = "00000" THEN o5 = o5 + 1
IF Len(Tempo) = a THEN GOTO a4
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "100000" THEN o5 = o5 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "1000001" THEN o5 = o5 + 1
NEXT 
' 
a4:
' 'Rem a = 4
a = 4
' 'Rem 00001000010000
 IF Mid$(Tempo, 1, a + 1) = "00001" THEN o4 = o4 + 1
 IF Len(Tempo) < a THEN GOTO a3
 IF Len(Tempo) = a AND s = "0000" THEN o4 = o4 + 1
 IF Len(Tempo) = a THEN GOTO a3
 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "10000" THEN o4 = o4 + 1
 FOR n = 1 TO Len(Tempo)
 IF Mid$(Tempo, n, a + 2) = "100001" THEN o4 = o4 + 1
 NEXT 
a3:
a = 3
' 'Rem 00010001000
 IF Mid$(Tempo, 1, a + 1) = "0001" THEN o3 = o3 + 1
 IF Len(Tempo) < a THEN GOTO a2
 IF Len(Tempo) = a AND s = "000" THEN o3 = o3 + 1
 IF Len(Tempo) = a THEN GOTO a2
 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "1000" THEN o3 = o3 + 1
 FOR n = 1 TO Len(Tempo)
 IF Mid$(Tempo, n, a + 2) = "10001" THEN o3 = o3 + 1
NEXT 
' 
a2:
 a = 2
' 'Rem 00100100
IF Mid$(Tempo, 1, a + 1) = "001" THEN o2 = o2 + 1
IF Len(Tempo) < a THEN GOTO aeins
IF Len(Tempo) = a AND s = "00" THEN o2 = o2 + 1
IF Len(Tempo) = a THEN GOTO aeins
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "100" THEN o2 = o2 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "1001" THEN o2 = o2 + 1
NEXT 
aeins:
a = 1
' 'Rem 01010
IF Mid$(Tempo, 1, a + 1) = "01" THEN o1 = o1 + 1
 IF Len(Tempo) < a THEN GOTO a0
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "10" THEN o1 = o1 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "101" THEN o1 = o1 + 1
NEXT 
' 
a0:
textbox8.Text = o1
textbox9.Text = o2
textbox10.Text = o3
textbox11.Text = o4
textbox12.Text = o5
textbox13.Text = o6
textbox14.Text = o7
textbox15.Text = o8
textbox16.Text = o9
textbox17.Text = oa
END 
PUBLIC SUB Button7_Click()
'muss noch erstellt werden
END
PUBLIC SUB Button5_Click()
'diese Funktion soll eine 01 Datei 
'untersuchen
'Sie soll die Zahl der 11,111,1111,11111 Runs etc  zurueckgeben
DIM s AS String
DIM n AS Integer
DIM T AS String
DIM Tempo AS String
DIM char AS String
a AS Integer 
DIM i1 AS Integer
DIM i2 AS Integer
DIM i3 AS Integer
DIM i4 AS Integer
DIM i5 AS Integer
DIM i6 AS Integer
DIM i7 AS Integer
DIM i8 AS Integer
DIM i9 AS Integer
DIM ia AS Integer
s = textarea1.Text
T = Trim(s)
i1 = 0
i2 = 0
i3 = 0
i4 = 0
i5 = 0
i6 = 0
i7 = 0
i8 = 0
i9 = 0
ia = 0
Tempo = RTrim$(LTrim$(s))
' 'Rem 11111111110111111111101111111111
' Cls
a = 10
' 'Rem PRINT Mid$(Temp, 1, 11)
IF Mid$(Tempo, 1, a + 1) = "11111111110" THEN ia = ia + 1
' 'Rem PRINT Mid$(Temp, Len(Temp) - 10, 11)
IF Len(Tempo) < a THEN GOTO b9
IF Len(Tempo) = a AND s = "1111111111" THEN ia = ia + 1
IF Len(Tempo) = a THEN GOTO b9
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "01111111111" THEN ia = ia + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "011111111110" THEN ia = ia + 1
' 'Rem PRINT Mid$(Temp, n, a)
NEXT
b9:
a = 9
IF Mid$(Tempo, 1, 10) = "1111111110" THEN i9 = i9 + 1
IF Len(Tempo) < a THEN GOTO b8
IF Len(Tempo) = a AND s = "111111111" THEN i9 = i9 + 1
IF Len(Tempo) = a THEN GOTO b8
IF Mid$(Tempo, Len(Tempo) - 9, 10) = "0111111111" THEN i9 = i9 + 1
FOR n = 1 TO Len(Tempo)
 IF Mid$(Tempo, n, a + 2) = "01111111110" THEN i9 = i9 + 1
NEXT
b8:
a = 8
IF Mid$(Tempo, 1, a + 1) = "111111110" THEN i8 = i8 + 1
IF Len(Tempo) < a THEN GOTO b7
IF Len(Tempo) = a AND s = "11111111" THEN i8 = i8 + 1
IF Len(Tempo) = a THEN GOTO b7
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "011111111" THEN i8 = i8 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "0111111110" THEN i8 = i8 + 1
NEXT 
'  
b7:
a = 7
IF Mid$(Tempo, 1, a + 1) = "11111110" THEN i7 = i7 + 1
IF Len(Tempo) < a THEN GOTO b6
IF Len(Tempo) = a AND s = "1111111" THEN i7 = i7 + 1
IF Len(Tempo) = a THEN GOTO b6
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "01111111" THEN i7 = i7 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "011111110" THEN i7 = i7 + 1
NEXT 
' 
b6:
a = 6
IF Mid$(Tempo, 1, a + 1) = "1111110" THEN i6 = i6 + 1 
IF Len(Tempo) < a THEN GOTO b5
IF Len(Tempo) = a AND s = "111111" THEN i6 = i6 + 1
IF Len(Tempo) = a THEN GOTO b5
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "0111111" THEN i6 = i6 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "01111110" THEN i6 = i6 + 1
NEXT 
' 
b5:
a = 5
' 
IF Mid$(Tempo, 1, a + 1) = "111110" THEN i5 = i5 + 1
IF Len(Tempo) < a THEN GOTO b4
IF Len(Tempo) = a AND s = "11111" THEN i5 = i5 + 1
IF Len(Tempo) = a THEN GOTO b4
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "011111" THEN i5 = i5 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "0111110" THEN i5 = i5 + 1
NEXT 
b4:
a = 4
IF Mid$(Tempo, 1, a + 1) = "11110" THEN i4 = i4 + 1
IF Len(Tempo) < a THEN GOTO b3
IF Len(Tempo) = a AND s = "1111" THEN i4 = i4 + 1
IF Len(Tempo) = a THEN GOTO b3
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "01111" THEN i4 = i4 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "011110" THEN i4 = i4 + 1
NEXT 
' 
b3:
a = 3
IF Mid$(Tempo, 1, a + 1) = "1110" THEN i3 = i3 + 1 
IF Len(Tempo) < a THEN GOTO b2
IF Len(Tempo) = a AND s = "111" THEN i3 = i3 + 1
IF Len(Tempo) = a THEN GOTO b2
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "0111" THEN i3 = i3 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "01110" THEN i3 = i3 + 1
NEXT 
' 
b2:
a = 2
IF Mid$(Tempo, 1, a + 1) = "110" THEN i2 = i2 + 1
IF Len(Tempo) < a THEN GOTO beins
IF Len(Tempo) = a AND s = "11" THEN i2 = i2 + 1
IF Len(Tempo) = a THEN GOTO beins
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "011" THEN i2 = i2 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "0110" THEN i2 = i2 + 1
NEXT 
beins:
a = 1
IF Mid$(Tempo, 1, a + 1) = "10" THEN i1 = i1 + 1
IF Len(Tempo) < a THEN GOTO b0
IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "01" THEN i1 = i1 + 1
FOR n = 1 TO Len(Tempo)
IF Mid$(Tempo, n, a + 2) = "010" THEN i1 = i1 + 1
NEXT 
' 
b0:
textbox18.Text = i1
textbox19.Text = i2
textbox20.Text = i3
textbox21.Text = i4
textbox22.Text = i5
textbox23.Text = i6
textbox24.Text = i7
textbox25.Text = i8
textbox26.Text = i9
textbox27.Text = ia
END 
PUBLIC SUB Button10_Click()
'Chaitin , ein bekannter Zufallsforscher gab IN einem Aufsatz folgende Sequenz an
'Lit chaitin G.J. 1975 scientific American 232 S 47 -52
t = "01101100110111100010"
textarea1.Text = t
END
PUBLIC SUB Button11_Click()
'Chaitin , ein bekannter Zufallsforscher gab IN einem Aufsatz folgende Sequenz an
'01101100110111100010
'Diese Folge wurde veraendert , 
'so dass nach jeder Ziffer ihr Gegenteil folgt,
t = "0110100110100101101001101010100101011001"
textarea1.Text = t
' Rem Wie man zb an Hand der ungleichen Paarverteilung gut erkennen kann , wird der Zufall weniger
' Rem Obwohl auf den ersten Blick ohne Kenntnis der Entstehung
' Rem vielleicht sogar mehr Zufall zu erwarten ist
END
PUBLIC SUB Button12_Click()
'Zufallszahl die durch mehrfachen echten Muenzwurf zur Erzeugung einer Zufallsfolge von 0 und 1
'ermittelt wurde.
t = "101101101010100111001011001110000001111001010000111101010001001101111011000010001010100011101110010101110111111100000100110100001101110111101010110000010001110110001000000100111110000011111010010001101111001010100000101101000011000110100011001111011111000110111001001100000011111001000000110000100000011010101000001100010110000111001111001000011011111111001001010100111110010001001000010010010000100010100111001111011000001010011111110010111110111011000111011010110000011101100111101011001110"
textarea1.Text = t
END
PUBLIC SUB Button13_Click()
'BB ,die orginalfolge von Chaitin wird einfach 2 * hintereinander geschrieben
t = "0110110011011110001001101100110111100010"
textarea1.Text = t
END
PUBLIC SUB Button14_Click()
'Dieser Befehl zaehlt im Binaersystem von 1 bis 2000
'er listet die Zahlen ohne Zwischenraum hintereinander
'012345678...  0.1.10.11.100.101.110 etc
te AS String 
z AS Integer 
FOR z = 0 TO 2000
  t = Bin$(z)
 te = te & t
NEXT 
textarea1.Text = te
END

Das Programm ist ein bißchen lang geraten. Es kann mit Sicherheit verbessert werden. Es hat die Limitation, daß es Runs nur bis zu einer Länge von 10 erfasst.


Vorübung3: Programmierung des Problems mit dem Runtest

[Bearbeiten]

Zitat: Wenn du es nicht programmiert hast, dann hast du es nicht verstanden.

Leider funktioniert der Runtest nicht bei beliebigen 01 Sequenzen , sondern nur wenn die Zahl von 0 und 1 ungefähr gleich ist. Beispielsweise kann man eine Sequenz 00000000000000000010 im Runtest nicht auf ihre Zufälligkeit überprüfen.

Im Unterschied zur Vorübung2 werden jetzt für die Binärzahlen, bei denen die Zahl der Nullen gleich der Zahl der Einser ist, die Entropien mit dem Runstest berechnet.

  • Die Länge der 01 Folge ist variierbar , hier s = 8. ( Länge ist die Variable s im Listing)
  • Die Zahl der Nullen und Einsen ist zur Vereinfachung gleich groß.
  • Das Programm startet von alleine.
  • Die Ergebnisausgabe erfolgt im Direkfenster.
  • Bewertung:
    • pz Werte um die 0 sind ein Zeichen hoher Entropie. Pz-Werte über 1,5 oder unter -1,5 sind ein Zeichen niedriger Entropie
PUBLIC SUB Form_Open()
s AS Integer
'Laenge der Binaerzahl
z AS Integer
'Zaehler von 0 bis 2^s-1
zz AS Integer 
'Zaehler von 1 bis alle Varianten mit ozaehler = izaehler
t AS String
'binaerzahl
ozaehler AS Integer
'Zahl der Nullen
izaehler AS Integer
'Zahl der Einser
tt AS String 
'binaerzahl als String
n AS Integer 
'Laenge der Binaerzahl
char AS String 
UM AS Float 
varianz AS Float
svar AS Float
'Quadratwurzel der Varianz
zwei AS Integer 
summe AS Integer 
run AS Integer 
nn AS Integer
chari AS String
charnext AS String 
runzaehler AS Integer
pz AS Float 
'Pruefvariable entspricht dem Entropiewert der Folge
'pz Werte um die 0 sind ein Zeichen hoher Entropie. 
'pz-Werte > 1,5 oder < -1,5 sind ein Zeichen niedriger Entropie 
s = 10
'Laenge der 01 Folge
zz = 0
FOR z = 0 TO (2^s - 1)
 t = Bin$(z,s)
 tt = Str(t)
 'PRINT "tt = " & tt
 ozaehler = 0
 izaehler = 0
 FOR n = 1 TO Len(tt)
       char = Mid$(tt, n, 1)
          SELECT CASE TRUE
          CASE char = "0"
           ozaehler = ozaehler + 1
          CASE char = "1"
           izaehler = izaehler + 1
       END SELECT
 NEXT  
 'PRINT izaehler
 'PRINT ozaehler 
 IF izaehler = ozaehler THEN 
 zz = zz + 1
 t = tt 
 PRINT "zz = " & zz & " t = " &  t;
 'runtest
 UM = 2 * s/2 * s/2 /( s/2 + s/2 ) + 1
 'PRINT "UM  = " & UM 
 zwei = 2 * s/2 * s/2
 summe = s 
 varianz = zwei *( zwei - summe) / (summe * summe * (summe - 1))
IF varianz < 0 THEN varianz = -varianz 
'PRINT "Varianz = " & varianz
runzaehler = 1
   FOR nn = 1 TO Len(t) - 1
           chari = Mid$(t, nn, 1)
       charnext = Mid$(t, nn + 1, 1)
       IF chari <> charnext THEN runzaehler = runzaehler + 1
  NEXT
'PRINT " runzaehler = " & runzaehler;
svar = Sqr(varianz)
pz = ( runzaehler - UM)/svar 
PRINT " pz = " & Str(pz)
'PRINT Str(pz)
ENDIF
NEXT 
END

Ergebnisausgabe:

zz = 1 t = 00001111 pz = -2,291287847478
zz = 2 t = 00010111 pz = -0,763762615826
zz = 3 t = 00011011 pz = -0,763762615826
zz = 4 t = 00011101 pz = -0,763762615826
zz = 5 t = 00011110 pz = -1,527525231652
zz = 6 t = 00100111 pz = -0,763762615826
zz = 7 t = 00101011 pz = 0,763762615826
zz = 8 t = 00101101 pz = 0,763762615826
zz = 9 t = 00101110 pz = 0
zz = 10 t = 00110011 pz = -0,763762615826
zz = 11 t = 00110101 pz = 0,763762615826
zz = 12 t = 00110110 pz = 0
zz = 13 t = 00111001 pz = -0,763762615826
zz = 14 t = 00111010 pz = 0
zz = 15 t = 00111100 pz = -1,527525231652
zz = 16 t = 01000111 pz = -0,763762615826
zz = 17 t = 01001011 pz = 0,763762615826
zz = 18 t = 01001101 pz = 0,763762615826
zz = 19 t = 01001110 pz = 0
zz = 20 t = 01010011 pz = 0,763762615826
zz = 21 t = 01010101 pz = 2,291287847478
zz = 22 t = 01010110 pz = 1,527525231652
zz = 23 t = 01011001 pz = 0,763762615826
zz = 24 t = 01011010 pz = 1,527525231652
zz = 25 t = 01011100 pz = 0
zz = 26 t = 01100011 pz = -0,763762615826
zz = 27 t = 01100101 pz = 0,763762615826
zz = 28 t = 01100110 pz = 0
zz = 29 t = 01101001 pz = 0,763762615826
zz = 30 t = 01101010 pz = 1,527525231652
zz = 31 t = 01101100 pz = 0
zz = 32 t = 01110001 pz = -0,763762615826
zz = 33 t = 01110010 pz = 0
zz = 34 t = 01110100 pz = 0
zz = 35 t = 01111000 pz = -1,527525231652
zz = 36 t = 10000111 pz = -1,527525231652
zz = 37 t = 10001011 pz = 0
zz = 38 t = 10001101 pz = 0
zz = 39 t = 10001110 pz = -0,763762615826
zz = 40 t = 10010011 pz = 0
zz = 41 t = 10010101 pz = 1,527525231652
zz = 42 t = 10010110 pz = 0,763762615826
zz = 43 t = 10011001 pz = 0
zz = 44 t = 10011010 pz = 0,763762615826
zz = 45 t = 10011100 pz = -0,763762615826
zz = 46 t = 10100011 pz = 0
zz = 47 t = 10100101 pz = 1,527525231652
zz = 48 t = 10100110 pz = 0,763762615826
zz = 49 t = 10101001 pz = 1,527525231652
zz = 50 t = 10101010 pz = 2,291287847478
zz = 51 t = 10101100 pz = 0,763762615826
zz = 52 t = 10110001 pz = 0
zz = 53 t = 10110010 pz = 0,763762615826
zz = 54 t = 10110100 pz = 0,763762615826
zz = 55 t = 10111000 pz = -0,763762615826
zz = 56 t = 11000011 pz = -1,527525231652
zz = 57 t = 11000101 pz = 0
zz = 58 t = 11000110 pz = -0,763762615826
zz = 59 t = 11001001 pz = 0
zz = 60 t = 11001010 pz = 0,763762615826
zz = 61 t = 11001100 pz = -0,763762615826
zz = 62 t = 11010001 pz = 0
zz = 63 t = 11010010 pz = 0,763762615826
zz = 64 t = 11010100 pz = 0,763762615826
zz = 65 t = 11011000 pz = -0,763762615826
zz = 66 t = 11100001 pz = -1,527525231652
zz = 67 t = 11100010 pz = -0,763762615826
zz = 68 t = 11100100 pz = -0,763762615826
zz = 69 t = 11101000 pz = -0,763762615826
zz = 70 t = 11110000 pz = -2,291287847478

Abbildung Grafische Darstellung der Entropiewerte einer 8er 01 Folge. Je größer die Säulen, desto kleiner ist die Entropie. Je näher die Säule bei Null liegt desto größer ist die Entropie.


Zufallsberechnungen mit der Randomfunktion

[Bearbeiten]

Für die Berechnung von Zufallszahlen ( bzw Pseudozufallszahlen) brauchen Sie die Befehle Randomize(), RND und INT

Siehe auch http://www.madeasy.de/7/prgmini.htm#z

Achtung: Randomize() ist in neueren Versionen durch RANDOMIZE zu ersetzen.

Münzwurf

[Bearbeiten]

Münze ganz oft, 01 Zufallsfolge

[Bearbeiten]

Wenn Sie eine längere Zufallsfolge aus O und 1 haben wollen, können Sie dies mit folgendem Programm erreichen. Wie mit einer Münze, die man immer wieder wirft, wird eine Folge Zufallszahlen zwischen 0 und 1 erzeugt. Sie brauchen eine Textarea und einen Befehlsbutton um das Programm in Gang zu bringen. Der Quelltext hinter dem Befehlsfeld lautet:

PUBLIC SUB Button1_Click()
'mehrfacher Muenzwurf zur Erzeugung einer Zufallsfolge von 0 und 1
DIM a AS Integer
DIM t AS String
DIM M AS Integer
Randomize()
FOR a = 1 TO 20000
 M = Int(2 * Rnd) 
' Erzeugt einen Wurf zwischen 0 und 1
 t = t & LTrim$(Str$(M))
NEXT
Textarea1.Text = t
END

Würfeln bis 6

[Bearbeiten]

Diese Programm erzeugt wie ein Würfel Zufallszahlen zwischen 1 und 6. Das Ergebnis wird in einer Textbox ausgegeben. Sie brauchen einen Commandbutton, ein Textlabelfeld und einen Textbox, um das Programm in Gang zu bringen.

Siehe auch: Bild

Der Quelltext hinter dem Befehlsfeld Würfeln lautet:

PUBLIC SUB Button1_Click()
DIM Wuerfel AS Integer
Randomize() 
Wuerfel = Int(Rnd(1,7)) 
' Erzeugt einen Wurf zwischen 1 und 6 
TextLabel1.Text = "Sie würfelten eine " 
TextBox1.Text = Wuerfel
END

Folgende Befehle wurden verwendet:

Randomize: Initialisiert den Zufallszahlengenerator.

Anmerkungen: Das Zahl-Argument kann ein beliebiger zulässiger numerischer Ausdruck sein. Durch Zahl wird der Zufallszahlengenerator initialisiert, indem ihm ein neuer Startwert zugewiesen wird. Wenn Sie Zahl weglassen, wird als neuer Startwert der von der Timer-Funktion ausgegebene Wert verwendet. Somit ist der Befehl Randomize Timer eigentlich redundant.

Wird Randomize nicht verwendet, dann liefert die Rnd-Funktion bei jeder Ausführung des Programms dieselbe Zufallszahlenfolge. Soll sich die Zufallszahlenfolge bei jeder Ausführung des Programms ändern, dann setzen Sie eine Randomize-Anweisung ohne Argument an den Anfang des Programms.

Rnd Liefert eine Zufallszahl.

Rnd ( [ Min [ , Max ] ) 

Berechnet eine Pseudozufallszahl mit dem Lehmer Algorithmus.

Wenn keine Parameter angegeben werden, dann wird eine Zufallszahl im Intervall [ 0 , 1 [ zwischen Null und Eins erzeugt.

Wenn der erste Parameter ( = Min ) angegeben wird, dann wird eine Zufallszahl im Intervall [ 0 , Min [ zwischen Null und dem Parameter erzeugt.

Wenn man die beiden Parameter angibt, dann wird eine Zufallszahl im Intervall [ Min , Max [ erzeugt.

Beispiel:

PRINT Rnd

=> 0.019539254718

PRINT Rnd(2)

=> 0.040205506608

PRINT Rnd(Pi, Pi(2))

=> 3.204108046818

Int

Value = Int ( Zahl )

Schneidet die Stellen nach dem Komma weg und gibt nur die Zahlen vor dem Komma aus. Anders erklärt: Gibt den Zahlenwert vor dem Komma zurück, d.h es wird die ganze Zahl ausgegeben, die kleiner als ursprüngliche Zahl ist .

Beispiel:

PRINT Int(Pi)

=> 3

PRINT Int(-Pi)

=> -4

6er Würfel überprüfen

[Bearbeiten]

Im folgenden wird ein Programm aufgelistet , welches die Randomfunktion an Hand eines Würfels überprüft. Es funktioniert direkt im Terminalmodus von Gambas. Man braucht also keine Form.

' Gambas class file
STATIC PUBLIC SUB Main()
DIM x AS Integer
DIM w AS Integer
DIM a AS Integer 
DIM b AS Integer 
DIM c AS Integer 
DIM d AS Integer 
DIM e AS Integer 
DIM f AS Integer 
Randomize()
FOR x = 1 TO 1000000
'w = Int(Rnd(6) + 1) identisch zur nächsten Zeile 
w = Int(Rnd(1,7)) 
   SELECT CASE w
     CASE 1 
       a = a + 1 
     CASE 2 
       b = b + 1 
     CASE 3
       c = c + 1
     CASE 4 
       d = d + 1
     CASE 5
       e = e + 1 
     CASE 6
       f = f + 1 
   END SELECT
 NEXT
 PRINT a, b, c, d, e, f
END

Würfeln bis 12

[Bearbeiten]

Man braucht eine Textbox , ein Textlabelfeld und einen Commandbutton, um das Programm zu starten. Das Problem ist analog dem 6er Würfel einfach zu lösen :

PUBLIC SUB Button1_Click()
Wuerfel AS Integer
Randomize() 
Wuerfel = Int(Rnd(1,13)) ' Erzeugt einen Wurf zwischen 1 und 12 
TextLabel1.Text = "Sie würfelten eine " 
TextBox1.Text = Wuerfel
END

Im Terminalmodus ist es kürzer:

STATIC PUBLIC SUB Main()
Wuerfel AS Integer
Randomize() 
Wuerfel = Int(Rnd(1,13)) ' Erzeugt einen Wurf zwischen 1 und 12 
PRINT wuerfel 
END

Oder noch kürzer:

STATIC PUBLIC SUB Main()
 Randomize() 
 PRINT Int(Rnd(1,13))
END

Lotto

[Bearbeiten]

Dieses schon etwas kompliziertere Programm zieht aus den Zahlen 1 bis 49 zufällig sechs Lottozahlen und eine Zusatzzahl. Das Ganze wird geordnet ausgegeben und Doppelgänger werden vermieden.

Bevor man ein Zufallsprogramm akzeptiert, sollte man es 1000 mal laufen lassen und die gleichberechtigte Verteilung und Unberechenbarkeit der Zahlenfolge mit dem Computer Überprüfen.

Sie brauchen 2 Befehlsbuttons und eine Textarea um das Programm in Gang zu bringen.

Screenshot zum Programm Lottozahlen

Der Quelltext hinter dem Befehlsfeld Lottozahlen lautet:

' Gambas class file
ar AS Integer[]
PUBLIC SUB Form_Open()
  'schon beim Öffnen der Form wird der Array mit lauter Nullen gefüllt.
  x AS Integer
  ar = NEW Integer[]
  ME.Text = "Lottozahlen"
  FOR x = 0 TO 48
    ar.Add(Str(0))
  NEXT
END

PUBLIC SUB Button1_Click()
  x AS Integer 
  r AS Integer 
  element AS Integer 
  txt AS String
  z AS Integer 
  txt = ""
  'der Array wird komplett auf Null gestellt
  FOR x = 0 TO 48
    ar[x] = 0 
  NEXT
  'dann wird der Array mit 6 Zufallszahlen an den Stellen gefüllt, die mit der Zufallszahl übereinstimmen 
  Randomize() 
  FOR x = 0 TO 5
    r = Int(Rnd(1,49))
    IF r = ar[r] THEN x = x - 1 
    'Falls ein Doppelgänger auftritt gehe eins zurück 
    ar[r] = r
  NEXT 
  'nur die Zahlen ungleich 0 (<> 0 ) werden ausgegeben
  FOR EACH element IN ar 
    IF element <> 0 THEN txt = txt & element & Chr(10) 
  NEXT
  'Zusatzzahl suchen , die nicht schon gezogen wurde 
  REPEAT 
    z = Int(Rnd(1,49))
  UNTIL z <> ar[z] 
  'Textausgabe wird zusammengestellt 
  txt = txt & Chr(10) & "Zusatzzahl: " & z
  textarea1.Text = txt 
END

PUBLIC SUB Button2_Click()
  ME.Close 
END

Zufallsbuchstaben

[Bearbeiten]

Diese Programm erzeugt Zufallsbuchstaben zwischen A und Z. Das Ergebnis wird in einer Textarea ausgegeben.

Sie brauchen eine Textarea und 2 Commandbuttons, um das Programm in Gang zu bringen. Es schaut dann in etwas so aus:


Der Quelltext hinter dem Befehlsfeld Zufallsbuchstaben lautet:

PUBLIC SUB Button1_Click()
DIM Z AS Integer
DIM Buchstabe AS String
Randomize()
Textarea1.Text = ""
FOR Z = 1 TO 50 
 Buchstabe = Chr$(Int(Rnd(65,91))) 
 TextArea1.Text = TextArea1.Text & Buchstabe
NEXT 
END

Mit dem Befehl CHR$ werden Zahlen zu Buchstaben umgewandelt.

Character = Chr$ ( Zahl ) gibt das Zeichen zurück, welches dem ASCII code von Zahl entspricht .

Beispiel 1:

PRINT Chr$(65)

Ergebnis: A

Beispiel 2:

PUBLIC SUB Button1_Click()
DIM x AS Integer
FOR x = 30 TO 133
 PRINT Chr$(x);
NEXT
END

Zufallspunkte

[Bearbeiten]

Mit dem folgenden Programm können Sie ein Zeichenfeld ( DrawingArea ) mit Zufallspunkten füllen.

Sie brauchen für das Programm:

  • eine Drawingarea
  • zwei Commandbuttons.

Das Ganze schaut dann so aus:

Der Code dazu:

PUBLIC SUB Button1_Click()
x AS Integer
y AS Integer
z AS Integer
Draw.Begin(DrawingArea1)
 FOR z = 1 TO 100000
  x = Int(Rnd(0,DrawingArea1.Width))
  y = Int(Rnd(0,DrawingArea1.Height))
  Draw.Point(x,y)
 NEXT 
Draw.End
END
PUBLIC SUB Button2_Click()
 ME.Close
END

Zufallsquadrate

[Bearbeiten]

Confetti Programm

Mit dem folgenden Confettiprogramm wird ein Zeichnungsfeld mit vielen kleinen , verschieden farbigen Quadraten gefüllt. In dem Programm taucht 3 mal der Zufall auf: 1.Die Farbe ist per Zufall gewählt. 2.Die x Koordinate der Quadrate ist per Zufall gewählt. 3.Die y Koordinate der Quadrate ist per Zufall gewählt.

Man braucht eine Form , darauf plaziert man eine Drawing Area. Dann braucht man noch 2 Commandbuttons.

Das Ganze schaut so aus:

Der Code dazu:

PUBLIC SUB Form_Open()
 Button1.Text = "Start"
 Button2.Text = "Stop"  
END
PUBLIC SUB Button1_Click()
 i AS Integer
 X AS Integer
 Y AS Integer
 Draw.Begin(DrawingArea1)
 FOR i = 1 TO 200000
   Draw.FillColor = Int(Rnd(&HFFFFFF&))
   'PRINT Int(Rnd(&HFFFFFF&))
   Draw.FillStyle = Fill.Solid
   X = Int(Rnd(DrawingArea1.Width))
   Y = Int(Rnd(DrawingArea1.Height))
   Draw.Rect(X - 7, Y - 7, 7, 7)
 NEXT
 Draw.End
END
PUBLIC SUB Button2_Click()
 ME.Close
END

Münzwurf Statistik

[Bearbeiten]

DrawingArea, Image

[Bearbeiten]

Um unter Gambas Grafiken zu erstellen sollten Sie sich mit dem Steuerelement des Zeichnungsfeldes ( DrawingArea) vertraut machen.

Die Koordinaten der DrawingArea1

[Bearbeiten]

Folgendes kleine Programm liefert die Koordinaten der DrawingArea1

Machen Sie ein neues Projekt. Öffnen Sie eine neue Form: Mit der rechten Maus auf Form klicken. Geben Sie der Form irgendeinen Namen oder nehmen Sie den Vorschlag Form1. Holen Sie sich eine DrawingArea = Zeichenfeld aus der Werkzeugkiste. Benennen Sie diese nicht um.

Kopieren Sie den Code von unten ins Programm. Starten Sie das Programm mit F5. Die ausgegebenen Zahlen entsprechen den Zahlen bei den Eigenschaften ( = F4 = Properties) der DrawingArea1.

Beachten Sie folgendes : die linke obere Ecke ist (X,Y) , die rechte untere Ecke ist (X + DrawingArea1.Width, Y + DrawingArea1.Height )

Der Code:

PUBLIC SUB Form_Open()
 PRINT DrawingArea1.X
 PRINT DrawingArea1.Y
 PRINT DrawingArea1.Width
 PRINT DrawingArea1.Height
END

Ergebnis

Wenn Sie das Zeichengebiet am Anfang nicht verändert haben werden folgende Werte ausgegeben

0
0
64
32

Bilder

[Bearbeiten]

Siehe Gambas:_Bilder

PUBLIC SUB Form_Open()
 PRINT DrawingArea1.X
 PRINT DrawingArea1.Y
 PRINT DrawingArea1.Width
 PRINT DrawingArea1.Height
END

Farben

[Bearbeiten]

Siehe Gambas:_Farben

Mathematische Funktionen

[Bearbeiten]

Siehe Gambas: Rechnen

Punkt,Linie,Kreis

[Bearbeiten]

Zeichnen kann man in Gambas nur in einem Grafikfeld ( = DrawingArea ). In einem Grafikfeld kann man Punkte, Rechtecke, Ellipsen, Linien und anderes zeichnen. Man kann verschiedene Farben und Stiftbreiten benutzen.

Punkte

[Bearbeiten]

Das folgende Beispielprogramm zeichnet ein paar Punkte. Einen einzelnen Punkt sieht man schlecht.

Machen Sie dazu ein neues Projekt. Öffnen Sie eine neue Form: Mit der rechten Maus auf Form klicken. Geben Sie ihr den Namen Fmain. Holen Sie sich einen Befehlsknopf = Button aus der Werkzeugkiste . Holen Sie sich eine DrawingArea = Zeichenfeld aus der Werkzeugkiste.

Kopieren Sie den Code ins Programm. Starten Sie das Programm mit F5. Achten Sie auf die Farbgebung bei den Eigenschaften, sonst sehen Sie nichts.

PUBLIC SUB Button1_Click()
Draw.Begin(DrawingArea1)
Draw.Point(100,100)
Draw.Point(100,101)
Draw.Point(100,102)
Draw.Point(100,103)
Draw.Point(100,99)
Draw.Point(100,98)
Draw.Point(100,97)
Draw.Point(100,96)
Draw.End
END

Linien

[Bearbeiten]

Das nächste kleine Programm zeichnet ein paar Linien.

Machen Sie ein neues Projekt. Öffnen Sie eine neue Form: Mit der rechten Maus auf Form klicken. Geben Sie ihr den Namen Fmain. Holen Sie sich einen Befehlsknopf = Button aus der Werkzeugkiste . Holen Sie sich eine DrawingArea = Zeichenfeld aus der Werkzeugkiste.

Kopieren Sie den Code ins Programm. Starten Sie das Programm mit F5. Achten Sie auf die Farbgebung bei den Eigenschaften, sonst sehen Sie nichts.

PUBLIC SUB Button1_Click()
DIM B AS Integer ' Variable deklarieren. 
Draw.Begin(DrawingArea1)
FOR B = 1 TO 200 STEP 10 ' Schleife initialisieren. 
Draw.Line(1, B, 500, B)
NEXT 
Draw.End
END

Linienbreite

[Bearbeiten]

Dieses Grafikprogramm zeigt die Programmierung verschieden dicker Linien. Sie brauchen wieder einen Befehlsbutton und eine DrawingArea. Der entscheidende Befehl heißt hier Draw.LineWidth Hinter dem Befehl Linienbreite steht folgender Code :

PUBLIC SUB Button1_Click()
DIM B AS Integer ' Variable deklarieren. 
Draw.Begin(DrawingArea1)
Draw.Line(10,100, 20, 100)
FOR B = 1 TO 100 STEP 10 ' Schleife initialisieren. 
 Draw.LineWidth=B ' Stiftbreite einstellen. 
 Draw.Line(10+B,100, 20+B, 100)
NEXT 
Draw.End
END

Noch ein paar Linien

[Bearbeiten]
PUBLIC SUB Button1_Click()
Draw.Begin(DrawingArea1)
' Zeichnet eine Linie horizontal durch die Mitte der Form
Draw.Line (0, ME.Height / 2, ME.Width, ME.Height / 2)
' Zeichnet eine Linie senkrecht durch die Mitte der Form
Draw.Line (ME.Width / 2, 0,ME.Width / 2, ME.Height)
' Zeichnet eine Linie von der linken oberen zur unteren rechten Ecke
Draw.Line (0, 0,ME.Width, ME.Height)
' Zeichnet eine Linie von der rechten oberen zur unteren linken Ecke
Draw.Line (ME.Width, 0,0, ME.Height)
Draw.End
END

Warum werden die Linien nicht sauber zentriert ?

Fügen Sie direkt nach der ersten Zeile folgenden Code ein:

DrawingArea1.Resize(ME.Width, ME.Height)
DrawingArea1.Background = &HFFFFFF&

Schaut es jetzt besser aus ?

Wenn Sie die Zeile

DrawingArea1.Resize(ME.Width, ME.Height)

nach dem Befehl Draw.Begin(DrawingArea1) einfügen , gibt es eine Fehlermeldung:

QPaintDevice: Cannot destroy paint device that is being painted
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
 Major opcode:  66
 Minor opcode:  0
 Resource id:  0x2e00010
X Error: RenderBadPicture (invalid Picture parameter) 180
 Major opcode:  153
 Minor opcode:  5
 Resource id:  0x2e00025

Farbe der Linie

[Bearbeiten]

Wenn Sie die Farbe Ihrer Linie verändern wollen, dann hilft folgendes Programm

Draw.Begin(DrawingArea1)
Draw.ForeColor = &HFFFFFF 
' weiße Farbe 
' Draw.ForeColor = &H0000FF& blaue Linie
' Draw.ForeColor = &HFF00FF& lila
' Draw.ForeColor = &HFF0000& rot
' Draw.ForeColor = &H00FF00& grün
' Draw.ForeColor = &HFFFF00& gelb
' Draw.ForeColor = &H00FFFF& türkis
' &H000000& = Schwarz 
Draw.Line(1, 130, 500, 400)
Draw.End

Rechteck

[Bearbeiten]

Das folgende Programm zeichnet ein Rechteck.

Machen Sie ein neues Projekt. Öffnen Sie eine neue Form: Mit der rechten Maus auf Form klicken. Geben Sie ihr den Namen Fmain. Holen Sie sich einen Befehlsknopf = Button aus der Werkzeugkiste . Holen Sie sich eine DrawingArea = Zeichenfeld aus der Werkzeugkiste.

Nennen Sie die Zeichenfläche da. Dazu markieren Sie die Zeichenfläche mit der Maus . Drücken Sie F4 und sie erhalten die Eigenschaften = Properties der Zeichenfläche. In der zweiten Zeile bei (Name) geben Sie statt DrawingArea den eigenen Namen da ein.

Kopieren Sie den Code ins Programm. Starten Sie das Programm mit F5. Achten Sie auf die Farbgebung bei den Eigenschaften, sonst sehen Sie nichts.

Beachten Sie folgendes:

Die Koordinaten der Drawing Area gehen von der linken Oberen Ecke ( DrawingArea.X = 0, DrawingArea.Y = 0) bis zur unteren rechten Ecke (DrawingArea.Width = beliebig, DrawingArea.Height = beliebig).

Bei den Koordinaten des Rechtecks geben die ersten 2 Ziffern die absoluten Koordinaten der linken oberen Ecke des Rechtecks in der Drawing Area an. Im Beispiel werden 100 und 100 gewählt. Die 2 weiteren Zahlen geben die Koordinaten der rechten unteren Ecke des Rechtecks relativ zur linken oberen Anfangsecke an. Im Beispiel 90 und 90. Die absoluten Koordinaten der rechten unteren Ecke sind im Beispiel dann 190 und 190 .

Beim Draw.Line Befehl ist das anders. Hier wurden absolute Koordinaten gewählt.

Als Übung können Sie versuchen in das Rechteck die 2 Diagonalen mit Drawline einzuzeichen.

Wie lauten dazu die Koordinaten. Lösung siehe unten.

PUBLIC SUB Button1_Click()
Draw.Begin(da)
Draw.Rect(100, 100, 90, 90)
Draw.End
END

Variante mit Diagonalen

PUBLIC SUB Button1_Click() 
Draw.Begin(da)
Draw.Rect(100, 100, 90, 90)
Draw.Line(100, 100, 190, 190)
Draw.Line(100, 190, 190, 100)
Draw.End
END

Rechteck mit Farbe füllen

[Bearbeiten]

Das Beispielprogramm zeichnet ein Rechteck und füllt es mit weißer Farbe.

PUBLIC SUB Button1_Click()
  Draw.Begin(DrawingArea1)     ' Verwende DrawinArea1 als "Leinwand"
  Draw.FillColor = Color.white
  Draw.FillStyle = 1
  Draw.ForeColor = Color.white ' der Rand wird auch weiß 
  Draw.Rect (100, 100,200,200)
  Draw.End
END

Kreis

[Bearbeiten]

Dieses Grafikprogramm zeigt die Programmierung einer Kreisgrafik:

Hinter dem Befehl ein paar Kreise steht der folgende Code:

PUBLIC SUB Button1_Click()
  Draw.Begin(Drawingarea1)
  Draw.Ellipse(10, 50, 90, 90)
  Draw.Ellipse(10, 50, 50, 50)
  Draw.Ellipse(10, 50, 20, 20)
  Draw.End
END

Sie brauchen eine Zeichenfläche (Klasse Drawingarea) und einen Knopf der Klasse Commandbutton auf Ihrem Formular, um das Programm in Gang zu bringen. Spielen Sie mit den einzelnen Größen etwas herum und beobachten Sie wie sich die Grafiken ändern.

Vereinfachen Sie das Programm so, daß nur noch ein Kreis gezeichnet wird.

Beachten Sie folgendes:

  • Die erste Zahl hinter dem Befehl Draw.Ellipse gibt die x Koordinate der linken oberen Ecke eines Rechtecks an, in die die Ellipse , bzw. der Kreis tangential eingebettet ist.
    • Man kann diesen Wert xloe ( x Wert linke obere Ecke) nennen
  • Die zweite Zahl gibt die y Koordinate der linken oberen Ecke an.
    • Man kann diesen Wert yloe ( y Wert linke obere Ecke) nennen
  • Die dritte Zahl gibt die x Koordinate der rechten unteren Ecke an. Der Wert ist kein Absolutwert sondern relativ zur linken oberen Ecke.
    • Man kann diesen Wert rxrue ( relativen x Wert rechte untere Ecke) nennen
  • Die vierte Zahl gibt die y Koordinate der rechten unteren Ecke an.
    • Man kann diesen Wert ryrue ( relativen y Wert rechte untere Ecke) nennen

Will man einen Kreis programmieren, dann müssen der dritte und der vierte Parameter gleich sein, denn nur so wird das berührende Rechteck ein Quadrat. Nur ein Quadrat kann mit allen 4 Seiten einen Kreis berühren.

Draw.Ellipse(xloe, yloe, rxrue, ryrue)
Für den Kreis gilt rxrue = ryrue 

Überprüfen Sie, ob im obigen Kreisprogramm diese Vorgaben eingehalten werden. Verändern Sie den Parameter 3 und 4 und schauen Sie sich an , was passiert.

Um das Ganze zu verdeutlichen programmiert man am besten einen Kreis und das umgebende Quadrat.

PUBLIC SUB Button1_Click()
Draw.Begin(Drawingarea1)
Draw.Ellipse(10, 50, 90, 90)
Draw.Rect(10, 50, 90, 90)
Draw.End
END

Aus diesen Vorgaben kann man den Radius des Kreises berechnen:

Radius = (dritte oder vierter Parameter von Draw.Ellipse) / 2) 

Aus diesen Vorgaben kann man auch die Koordinaten des Kreismittelpunktes berechnen.

mx = xloe + rxrue / 2
my = yloe + rxrue / 2

Wie kann man dann die 2 Brennpunkte einer Ellipse berechnen, wenn also rxrue und ryrue verschieden sind ??

Die Röhre

[Bearbeiten]

Ein weiteres Beispiel mit vielen verschiedenen Kreisen. Das Programm wurde mit Menusteuerung programmiert. Siehe Gambas: Menü Außerdem wird eine DrawingArea auf der Form gebraucht.

So schaut das Ganze aus:

Der Code dazu:

PUBLIC SUB Form_Open()
 DrawingArea1.Resize(ME.Width, ME.Height)
END
PUBLIC SUB Menu2_Click()
x AS Integer 
Draw.Begin(Drawingarea1)
FOR x = 0 TO 200 STEP 5
 Draw.Ellipse(10, 10, x + 100, x + 100,5)
NEXT
Draw.End
END
PUBLIC SUB Menu3_Click()
  ME.Close
END

Konzentrische Kreise

[Bearbeiten]

Im folgenden Beispiel werden mehrere konzentrische Kreise in eine DrawingArea gezeichnet. Sie brauchen

  • eine Drawingarea ( Grafikfeld)
  • einen Befehlsbutton

um das Programm in Gang zu bringen.

PUBLIC SUB Form_Open()
 Drawingarea1.cached = TRUE
 IF Drawingarea1.width > Drawingarea1.height THEN 
 Drawingarea1.width = Drawingarea1.height 
 ELSE 
 Drawingarea1.height = Drawingarea1.width 
ENDIF 
Button1.Text = "Kreise"
ME.Text = "Konzentrische Kreise"
END
PUBLIC SUB Button1_Click()
mx AS Integer 
'x Koordinate des Mittelpunktes
my AS Integer
'y Koordinate des Mittelpunktes 
'Radius = mx - a 
a AS Integer
'linke obere Ecke x Koordinate 
b AS Integer
'linke obere Ecke y Koordinate  
c AS Integer
'a + c ergibt die x Koordinate der rechten unteren Ecke 
d AS Integer
'b + d ergibt die y Koordinate der rechten unteren Ecke 
mx = Drawingarea1.width / 2
Draw.Begin(Drawingarea1)
a = 0
FOR a = 0 TO mx STEP 10
 b = a 
 c = 2 * (mx - a)
 d = c
draw.Ellipse (a,b,c,d)
NEXT 
draw.End
END

Die folgende Abbildung zeigt einen Screenshot des Programmes. Eine Kleinigkeit ist allerdings falsch. Fällt es Ihnen auf.

Der zweite Befehlsbutton und der Code dazu fehlt im obigen Programm.

PUBLIC SUB Button2_Click()
 ME.Close 
END

Tortengrafik

[Bearbeiten]

Fügt man dem Befehl Draw(Ellipse) außer den 4 notwendigen Parametern noch 2 weitere Parameter hinzu erhält man Kreissegmente, die man gut für eine Tortengrafik nutzen kann.

  • Parameter 5, Gradzahl bei der das Segment beginnen soll
  • Parameter 6, Gradzahl, bei der das Segment endet soll.

Beispiel:

PUBLIC SUB Button1_Click()
Draw.Begin(Drawingarea1)
Draw.Ellipse(10, 50, 90, 90, 10, 90)
Draw.End
END

Man erhält einen Viertelkreis , der bei zehn Grad im Westem beginnt und entgegen des Uhrzeigerssinnes läuft.

Siehe auch: http://www.binara.com/gambas-wiki/bin/view/Gambas/DrawFigures

Ellipse

[Bearbeiten]

Um die wichtigsten Parameter des Befehls Draw.Ellipse zu verstehen, können Sie folgendes Programm ausprobieren:

Layout

[Bearbeiten]

Sie brauchen:

  • 9 Textboxen auf Ihrer Form
  • 1 Drawingarea
  • 3 Befehlsbuttons
  • 2 Labelfelder

auf Ihrer Form um das Programm in Gang zu bringen.

Der Code

[Bearbeiten]
PUBLIC SUB Form_Open()
textbox1.Text = "0"
textbox2.Text = "0"
textbox3.Text = Str(Drawingarea1.Width)
textbox4.Text = Str(Drawingarea1.Height)
textbox5.Text = "10"  
textbox6.Text = "10" 
textbox7.Text = Str(0 + Drawingarea1.Width/2)
textbox8.Text = Str(0 + Drawingarea1.Height/2)
textbox9.Text = Str(Drawingarea1.Width/2)
Button1.Text = "Kreis"
END
PUBLIC SUB Button1_Click()
a AS Integer 
b AS Integer
c AS Integer
d AS Integer
a = Val(Textbox1.text)
b = Val(Textbox2.text)
c = Val(Textbox3.text)
d = Val(Textbox4.text)
Draw.Begin(Drawingarea1)
Draw.ellipse(a,b,c,d)
Draw.End 
textbox7.Text = Str(a + c/2)
textbox8.Text = Str(b + d/2)
textbox9.Text = Str(c/2) 
CATCH
message.Info("Bitte geben Sie in jedes Feld eine Zahl ein !")
END
PUBLIC SUB Button2_Click()
Draw.Begin(Drawingarea1)
Drawingarea1.Refresh
Draw.End 
END
PUBLIC SUB Button3_Click()
a AS Integer 
b AS Integer
c AS Integer
d AS Integer
e AS Float
f AS Float 
a = Val(Textbox1.text)
b = Val(Textbox2.text)
c = Val(Textbox3.text)
d = Val(Textbox4.text)
e = Val(Textbox5.text)
f = Val(Textbox6.text)
Draw.Begin(Drawingarea1)
Draw.ellipse(a,b,c,d,e,f)
Draw.End 
CATCH
message.Info("Bitte geben Sie in jedes Feld eine Zahl ein !")
END

Und so schaut das Programm zur Laufzeit aus :

Der Seestern

[Bearbeiten]

"Der kleine G. hatte gar nicht gewußt, dass man unterwasser auch so schöne Sterne finden konnte."

Das Seesternprogramm zeigt den Übergang von einer geordneten Struktur ins Chaos. Normalerweise haben Seesterne eigentlich 5 Beine. Bei unserem Programm ist eines verloren gegangen.

Um das Programm in Gang zu bringen, braucht man eine DrawingArea und einen Befehlsbutton.

Layout

[Bearbeiten]

Der Code

[Bearbeiten]
PUBLIC SUB Form_Open()
 DrawingArea1.Width = 1000
 DrawingArea1.H = 1000
 DrawingArea1.X = 0
 DrawingArea1.Y = 0
 DrawingArea1.Background = &HFFFFFF&
 Button1.Text = "Seestern"
END
PUBLIC SUB Button1_Click()
 E AS Integer 
AW AS Float 
H AS Integer 
X AS Float
Y AS Float 
I AS Integer 
A AS Float 
B AS Float
C AS Float 
Draw.Begin(DrawingArea1)
FOR E = 1 TO 13 
IF E = 1 THEN 
AW = 55 
H = 100 
ENDIF
IF E = 2 THEN 
AW = 80
H = 120 
ENDIF
IF E = 3 THEN 
AW = 88
H = 120
ENDIF 
IF E = 4 THEN 
AW = 90
H = 150 
ENDIF
IF E = 5 THEN 
AW = 90.1
H = 300 
ENDIF
IF E = 6 THEN 
AW = 90.2
H = 490 
ENDIF
IF E = 7 THEN 
AW = 90.21
H = 1000 
ENDIF
IF E = 8 THEN 
AW = 90.22
H = 600 
ENDIF
IF E = 9 THEN 
AW = 90.25
H = 250 
ENDIF
IF E = 10 THEN 
AW = 90.3
H = 180
ENDIF 
IF E = 11 THEN 
AW = 91
H = 100 
ENDIF
IF E = 12 THEN 
AW = 92
H = 100 
ENDIF
IF E = 13 THEN 
AW = 92.2
H = 410
ENDIF
X = 0.1513 
Y = -0.5388 
'Pi = 3.141593: 
A = AW * Pi / 180'
'Rem umrechnung d.360 Grad Winkels ins Bogenmass 
FOR I = 0 TO H 
B = X * Cos(A) - (Y - X * X) * Sin(A) 
C = X * Sin(A) + (Y - X * X) * Cos(A) 
X = B 
Y = C 
'Draw.Point (400 + E ,400 + E)
Draw.Point(B * 300 + 300, C * 300 + 300) 
'PRINT B, C 
NEXT  
'FOR z = 1 TO 1000000: NEXT z: Rem Zeitverzoegerung kann man variieren 
NEXT  
Draw.End
END


Picture,Image,Drawingarea,Picturebox etc

[Bearbeiten]

Was ist der Unterschied zwischen einem Image und einem Picture ?

[Bearbeiten]

Unter Linux werden Bilder und Grafiken mit X11 dargestellt. Das X System hat dabei eine Netzkomponenete. Ein Bild, welches von einem Programm bearbeitet wird, kann auf einem ganz anderen Rechner im Netz gezeigt werden.

Ein Image in Gambas ist ein Bild, das auf ein Programm beschränkt bleibt. So kann man schneller darauf zugreifen und mehr mit dem Bild anstellen. ( Strecken, drehen etc)

Ein Picture in Gambas ist ein Bild das unter X dargestellt wird, ob das nun auf derselben Maschine oder sonst wo im Netz passiert , ist dabei offen. Jede Veränderung an dem Bild geht also den Umweg über einen Netzaufruf oder eine lokale pipe. Deswegen funktioniert das deutlich langsamer.

In Programmen mit intensiver Bildernutzung, wird man je nach Bedarf von einem in das andere Format wechseln und konvertieren, wenn es nützlich erscheint.

Das Image Bildformat ist also gut für Bildmanipulationen, das Picture Bildformat ist besser geeignet für reine Darstellungszwecke.

Grafikfeld ( DrawingArea)

[Bearbeiten]

siehe Gambas:_Grafik

Bildfeld (Picturebox)

[Bearbeiten]

Scrollviewfeld

[Bearbeiten]

Um mit Bilder oder Grafiken zu arbeiten ist das Steuerelement ScrollView ganz praktisch. Man findet es in der Werkzeugkiste (F6) neben der DrawingArea.

Mit dem Scrollviewfeld kann man auch größere Bilder anschauen, denn es stellt eine vertikale und horizontale Schiebeleiste bereit.

Wenn man das Scrollviewfeld nutzen will, dann plaziert man es als erstes auf der Form. Man macht es etwas größer. Dazu zieht man es an der rechten unteren Ecke größer auf. Dann läßt man es markiert. Man erkennt dies an den kleinen weißen Rechtecken am Rand des Steuerelementes. Jetzt plaziert man in das Scrollviewfeld hinein eine DrawingArea oder eine Picturebox. Auch diese zieht man etwas größer.

Mittels Code muß man dann beide Steuerelemente aneinander anpassen. Wie das geht zeigt das Programmbeispiel in Laden Sie ein Bild in eine Picturebox. weiter unten.

Laden Sie ein Bild in eine Picturebox

[Bearbeiten]

Mit diesem kleinen Programm wird ein Screenshot in eine Picturebox geladen.

Wenn Sie nicht wissen, was ein Screenshot ist, dann schauen Sie hier nach:

http://de.wikipedia.org/wiki/Screenshot

Um das Programm in Gang zu bringen, brauchen Sie eine Form, einen Befehlsbutton, ein Scrollviewfeld. In dieses Scrollviewfeld platzieren Sie eine Picturebox.

Code:

PUBLIC SUB Button1_Click()
 bild AS NEW Picture
 bild = Desktop.Grab()
 'Screenshot wird gemacht
 PictureBox1.Picture = bild
END

Sie können diesen Code verbessern, wenn Sie die Picturebox an das Scrollviewfeld anpassen:

PUBLIC SUB Button1_Click()
 bild AS NEW Picture
 'Form1.Hide 
 'Form wird ausgeblendet 
 bild = Desktop.Grab()
 'Screenshot wird gemacht
 Picturebox1.Resize(bild.Width, bild.Height)
 'Picturebox so groß machen wie das Bild
 Picturebox1.X = 0
 Picturebox1.y = 0
 'Picturebox an Scrollview anpassen
 PictureBox1.Picture = bild
 'Form1.Show
END

Umwandeln eines Pictures in ein Image

[Bearbeiten]

Im folgenden Beispiel wird eine Screenshot erzeugt. Dieser wird in ein Image umgewandelt und in einer DrawingArea angezeigt.

Um das Programm in Gang zu bringen brauchen Sie:

  • Eine Form
    • Einen Commandbutton = Befehlsknopf
    • Ein ScrollViewfeld = Feld mit vertikaler und horizontaler Verschiebemöglichkeit
      • Im Scrollviewfeld eine Drawingarea

Der Code:

PUBLIC SUB Button1_Click()
 bild AS NEW Picture
 i AS NEW Image 
 bild = Desktop.Grab()
 'hier wird ein Screenshot gemacht 
 i = bild.image 
 'hier wird das bild in ein image umgewandelt
 Drawingarea1.Cached = TRUE 
 DrawingArea1.Resize(i.Width,i.Height)
 DrawingArea1.Clear()
 Draw.Begin(DrawingArea1)
  Draw.Image(i, 0, 0)
 Draw.End
 DrawingArea1.Visible = TRUE
 DrawingArea1.Refresh
END

Laden Sie ein Bild mit Dialog in eine Picturebox

[Bearbeiten]

Mit dem folgenden Programm können Sie ein Bild mit folgendem Format: jpg; jpeg; png; bmp mit einem Dialogfenster in eine Pictureboxladen.

Um das Programm in Gang zu bringen brauchen Sie

  • eine Picturebox aus der Werkzeugkiste
  • einen Befehlsbutton in der Picturebox

Code:

PUBLIC SUB Button1_Click()
 p AS picture
 Dialog.Path = "/usr/share/wallpapers"
 IF NOT Exist(Dialog.Path) THEN
   Dialog.Path = System.Home
 ENDIF
 Dialog.Filter = [ "Picture files (*.jpg; *.jpeg; *.png; *.bmp)", "All files (*.*)" ]
 IF Dialog.OpenFile() THEN RETURN
 p = NEW picture
 p.Load(Dialog.Path)
 Picturebox1.Resize(p.Width, p.Height)
 Picturebox1.Picture = p
 PictureBox1.Move(0, 0, ME.ClientW, ME.ClientH)
 Picturebox1.Visible = TRUE
CATCH
 Message.Warning(Error.Text & " !")
END

Bei diesem Programm stört noc, das das Bild beim Laden 2 mal angezeigt wird. Wie kann man diese vermeiden ?

Laden Sie ein Bild ohne Dialog in die Picturebox

[Bearbeiten]

Vorsicht. Dieses Beispiel ist etwas kompliziert.

Mit dem folgenden Programm kann man ein Bild in die Picturebox laden. Das Programm beruht auf dem Beispiel Programm blights, welches mit Gambas mitgeliefert wird.

Starten sie ein neues Projekt . Holen Sie sich eine neue Form mit der Rechten Maustaste auf Form im Projekt. Nennen Sie die Form wie sie wollen. Platzieren sie auf der Form 2 Befehlstasten und eine Picturebox . Speichern Sie in das Programmverzeichnis 2 Bilddateien blon.xpm und bloff.xpm, die sie unter blights in den Beispielen von Gambas finden.

Wenn Sie die Bilder nicht finden, nehmen sie andere Bilddateien oder schauen Sie einmal in folgendem Verzeichnis nach: /opt/gambas/share/gambas/examples/Basic

Mit den Befehlstasten An und Aus laden Sie nun verschiedene Bilder in die PictureBox1.

Der Programmcode schaut so aus :

' Gambas class file
PUBLIC SUB Button1_Click()
PictureBox1.Picture = Picture["bloff.xpm"]
END
'--------------
PUBLIC SUB Button2_Click()
PictureBox1.Picture = Picture["blon.xpm"]
END

Bild speichern ohne Dialog

[Bearbeiten]

Dim P as picture Dim A as string Dim B as string P = picture.box1.picture B = "hallo.png" A = ("/home/name/bilder" & B) P.save(A) Eine einfache methode picture abzuspeichern.

Bild speichern mit Dialog

[Bearbeiten]

Bild aus dem Clipboard holen

[Bearbeiten]

Bild in den Zwischenspeicher laden

[Bearbeiten]

Resize

[Bearbeiten]

Mehrere grafische Elemente von Gambas kennen die Resizemethode. Wie der Name schon sagt kann man damit die Größe eines grafischen Objektes auf dem Bildschirm verändern.

Wie das geht zeigt folgendes Beispiel:

PUBLIC SUB Form_Open()
 Textbox2.Text = "200"  
 Textbox3.Text = "200"
 Button1.Text = "Resize Button1"
 Button1.Width = 200
 Button1.Height = 50
END
PUBLIC SUB Button1_Click()
 Button1.Resize(Val(textbox1.text),Val(textbox2.text))
END

Um das Programm in Gang zu bringen brauchen Sie 2 Textboxen und einen Befehlsbutton auf Ihrer Form. Drückt man auf den Befehlsbutton nach Start des Programmes, dann wird seine Größe an Hand der Werte in den 2 Textboxen verändert. Bereits beim Start des Programmes wird das Unterprogramm Form_Open abgearbeitet und macht ein paar sinnvolle Voreinstellungen. Im Unterprogramm Button1.Click wird dann geresized d.h die Größe verändert. Als Alternative kann man natürlich auch eingeben:

 Button1.Width = Val(textbox1.text)
 Button1.Height = Val(textbox2.text)

Man kann also auch ohne Resizemethode resizen.

Beispiel 2: Automatisches Resize einer Textarea an eine Form:

PUBLIC SUB Form_Resize()
 TextArea1.Move(0, 0, ME.ClientWidth, ME.ClientHeight) 
END

Sie brauchen eine Form und eine Textarea um das Programm in Gang zu bringen. Ganz egal wo die Textarea steht, sie wird an die Form angepasst. Auch wenn man die Form verschiebt bleibt, die Textarea an der Form kleben.

Cached

[Bearbeiten]

Refresh

[Bearbeiten]

Screenshot

[Bearbeiten]

Mit diesem kleinen Programm wird ein Screenshot in eine Picturebox geladen.

Wenn Sie nicht wissen, was ein Screenshot ist, dann schauen Sie hier nach:

http://de.wikipedia.org/wiki/Screenshot

Um das Programm in Gang zu bringen, brauchen Sie eine Form, einen Befehlsbutton, ein Scrollviewfeld. In dieses Scrollviewfeld platzieren Sie eine Picturebox.

Code:

PUBLIC SUB Button1_Click()
 bild AS NEW Picture
 bild = Desktop.Grab()
 'Screenshot wird gemacht
 PictureBox1.Picture = bild
END


Farben

[Bearbeiten]

Man kann die Farbe verschiedener Objekt ganz einfach über das Eigenschaftsfenster des Objektes verändern ( Vordergrund , Hintergrund etc). Das Eigenschaftsfenster öffnet man im Entwurfsmodus wie üblich mit F4.

Man kann die Farbeinstellungen aber auch während der Laufzeit ändern. Dies soll im folgenden Programmbeispiel gezeigt werden:

Dieses Miniprogramm zeigt die RGB Farben. Sie können in den Textboxen Werte von 0 - 255 eingeben und sich die Farbe anschauen. Aus den 3 Dezimalzahlen wird ein Hexadezimalwert als String gebastelt:

sHEX = Hex$(r,2) & Hex$(g,2) & Hex$(b,2)
sHEX = "&H" & sHEX & "&"

Wollen Sie das Programm zum laufen bringen brauchen Sie auf Ihrer Form folgende Felder, die Sie sich aus dem Werkzeugkasten holen müssen:

  • 3 Textlabelfelder
  • 3 Textfelder ( Textbox1-3 ) für die RGB Wert eingabe
  • 1 Befehlsfeld ( = Command Button )
  • 1 Zeichenfeld ( = DrawingArea ) für die Farbdarstellung


Das Ganze schaut dann so aus:


Programmcode

PUBLIC SUB Button1_Click()
DIM sHex AS String
DIM r AS Integer
DIM g AS Integer
DIM b AS Integer
IF Textbox1.text = "" THEN Textbox1.Text = 0 
IF Textbox2.text = "" THEN Textbox2.Text = 0 
IF Textbox3.text = "" THEN Textbox3.Text = 0 
r = Val(Textbox1.Text)
g = Val(Textbox2.Text)
b = Val(Textbox3.Text)
sHEX = Hex$(r,2) & Hex$(g,2) & Hex$(b,2)
sHEX = "&H" & sHEX & "&"
DrawingArea1.BackColor = Val(sHEX)
END

Farbspektrum

[Bearbeiten]

Das natürliche Farbspektrum des Lichtes reicht von dunkelrot über orange, gelb, grün nach blau und violett.

Farbe Wellenlaenge RGB
Rot ~ 625-740 nm #DF0000
Orange ~ 590-625 nm #FF8000
Gelb ~ 565-590 nm #FFFF00
Gruen ~ 520-565 nm #00FF00
Cyan ~ 500-520 nm #00FFFF
Blau ~ 450-500 nm #0000FF
Indigo ~ 430-450 nm #0000AF
Violett ~ 380-430 nm #50007F

Will man sich dieses Farbspektrum anschauen, hilft einem folgendes Programm. Man kann es noch verbessern, wenn man einen Schieberegler zur Farbwahl nutzt.

Man braucht für das Programm eine Form, eine DrawingArea und einen Commandbutton. Wenn man den Commandbutton mehrfach betätigt wird die Farbe immer weiter verändert. Sie beginnt bei rot und endet bei violett.

Programmcode

sp AS Integer 
PUBLIC SUB Form_Open()
sp = 1
drawingarea1.BackColor = &HC2020C&
END
PUBLIC SUB Button1_Click()
DIM ss AS Integer
ss = 1 
ss = sp
drawingarea1.BackColor = Val(spektrum(ss))
sp  = sp + 20
' Hier kann man die Farbsprünge wählen , addieren sie zu sp 5,10,20,50 oder 100 
IF sp > 1120 THEN sp = 1
'bei violett springt es wieder nach rot zurück
END
PUBLIC FUNCTION spektrum(ss AS Integer) AS String
x AS Integer
sHEX AS String
DIM s AS Integer 
DIM r AS Integer
DIM g AS Integer
DIM b AS Integer
s = 0
FOR x = 1  TO 255
 'rot nach gelb 
 r = 255
 b = 0
 sHEX = Hex$(r,2) & Hex$(x,2) & Hex$(b,2)
 sHEX = "&H" & sHEX & "&"
 s = s + 1 
 IF s = ss THEN RETURN sHEX
NEXT
's = 255
FOR x = 255  TO 1 STEP -1
 'gelb nach grün 
 g = 255
 b = 0
 sHEX = Hex$(x,2) & Hex$(g,2) & Hex$(b,2)
 sHEX = "&H" & sHEX & "&"
 s = s + 1 
 'PRINT s
 IF s = ss THEN RETURN sHEX
NEXT
's = 510
FOR x = 1  TO 255
 'von grün nach cyan 
 r = 0
 g = 255
 sHEX = Hex$(r,2) & Hex$(g,2) & Hex$(x,2)
 sHEX = "&H" & sHEX & "&"
 s = s + 1 
 'PRINT s
 IF s = ss THEN RETURN sHEX
NEXT
's = 765
FOR x = 255  TO 1 STEP - 1
 'von cyan nach blau 
 r = 0
 b = 255
 sHEX = Hex$(r,2) & Hex$(x,2) & Hex$(b,2)
 sHEX = "&H" & sHEX & "&"
 s = s + 1 
 'PRINT s
 IF s = ss THEN RETURN sHEX
NEXT
's = 1020
b = 255
FOR x = 1  TO 100
 'von blau nach lila 
 g = 0
 sHEX = Hex$(x,2) & Hex$(g,2) & Hex$(b,2)
 sHEX = "&H" & sHEX & "&"
 b = b - 2
 s = s + 1 
 'PRINT s
 'PRINT shex
 IF s = ss THEN RETURN sHEX
NEXT  
's = 1120
END


Wie man MouseDown, MouseMove und MouseUp benutzt

[Bearbeiten]

Wenn die linke Maustaste gedrückt wird, dann wird ein mousemove-Ereignis in regelmäßigen Abständen gestartet .

Das Programm

Holen Sie sich eine neue Form und benennen Sie diese als Fmaus. Deklarieren Sie diese als Startform.

Holen Sie sich aus der Werkzeugkiste 3 Malfelder ( Drawingarea ) und benennen Sie diese in den Eigenschaften ( = Properties) in da1, da2 und da3 um. Kopieren Sie sich den unten angegebenen Code und Compilieren Sie das Programm. Läuft es ? Falls ja experimentieren Sie etwas mit der Maus und den Farben herum.



Klicken Sie in die schwarzen Felder ! Im zweiten Feld muß man die Mausetaste gedrückt halten. Im dritten Feld muss man die Mausloslassen.

Der Code:

STATIC PUBLIC SUB Main()
 hForm AS Fmaus
 hForm = NEW Fmaus
 hForm.show
END
PUBLIC SUB da1_MouseDown()
 Draw.Begin(da1)
   Draw.Ellipse(Mouse.X,Mouse.Y, 9, 9)
 Draw.End
END
PUBLIC SUB da2_MouseMove()
 Draw.Begin(da2)
   Draw.Ellipse(Mouse.X,Mouse.Y, 9, 9)
 Draw.End
END
PUBLIC SUB da3_MouseUp()
 Draw.Begin(da3)
   Draw.Ellipse(Mouse.X,Mouse.Y, 9, 9)
 Draw.End
END

Die Koordinaten der Maus

[Bearbeiten]

Folgendes Programm funktioniert nur in einem Grafikfeld ( = DrawingArea ).

Das Programm liefert fortlaufend die Koordinaten der Maus, wenn man sie auf dem Grafikfeld bewegt und die linke Maustaste gedrückt hält.

Machen Sie ein neues Projekt. Öffnen Sie eine neue Form: Mit der rechten Maus auf Form klicken. Geben Sie ihr irgendeinen Namen. Holen Sie sich eine DrawingArea = Zeichenfeld aus der Werkzeugkiste.

Holen Sie sich 2 Textboxen aus der Werkzeugkiste.

Die Form schaut dann so aus:



Kopieren Sie den Code von unten ins Programm. Starten Sie das Programm mit F5. Achten Sie auf die Farbgebung bei den Eigenschaften, sonst sehen Sie nichts. Achten Sie auch auf die Farbgebung der Form. Die Farbeigenschaften der Form werden auf die Eigenschaften der Formkomponenten übertragen.

Fahren Sie mit der Maus im Zeichenfeld umher und drücken Sie die linke Maustaste. Dann werden die Koordinaten der Maus in den Textboxen angezeigt.

Beachten Sie folgendes : die linke obere Ecke ist (0,0) , die rechte untere Ecke ist (DrawingArea1.Width, DrawingArea1.Height )

Der neue Code:

PUBLIC SUB DrawingArea1_MouseMove()
Textbox1.text = Mouse.X 
Textbox2.text = Mouse.Y 
END

Wie erhält man Absolute Koordinaten ?

Der alte Code: Gambas älter als 0.65

PUBLIC SUB DrawingArea1_MouseMove(X AS Integer, Y AS Integer, Button AS Integer)
Textbox1.text = X 
Textbox2.text = Y 
END

Drag and Drop , Nehmen und Ziehen mit der Maus.

[Bearbeiten]

Das Programm zeigt die Drag und Drop eigenschaft. Man zieht ein Bild mit der Maus auf der Form hin- und her solange man die linke Maustaste betätigt.

Das Programm funktioniert mit einem Bildfeld ( = Image ). Man kann aber auch andere Objekte auf diesselbe Art verschieben.

Machen Sie ein neues Projekt. Öffnen Sie eine neue Form: Mit der rechten Maus auf Form klicken. Geben Sie ihr irgendeinen Namen. Holen Sie sich mit F6 ein Image = Bild aus der Werkzeugkiste und belassen Sie den Namen als Image1 .

Die Form schaut dann so aus:



Kopieren Sie den Code von unten ins Programm. Starten Sie das Programm mit F5. Achten Sie auf die Farbgebung bei den Eigenschaften, sonst sehen Sie nichts. Achten Sie auch auf die Farbgebung der Form. Die Farbeigenschaften der Form werden auf die Eigenschaften der Formkomponenten übertragen.

Fahren Sie mit der Maus im Zeichenfeld umher und drücken Sie die linke Maustaste. Dann wird das Bildfeld entsprechend den Koordinaten der Maus verschoben.

Der Code:

PUBLIC SUB Form_MouseMove()
Image1.X = Mouse.X
Image1.Y = Mouse.Y 
END

Wenn Sie wollen , dass das Bild bereits beim ersten Mouseklick zur Maus springt, dann fügen Sie noch folgenden Code ein:

PUBLIC SUB Form_MouseDown()
Image1.X = Mouse.X
Image1.Y = Mouse.Y 
END

alter Code

PUBLIC SUB Form_MouseMove(X AS Integer, Y AS Integer, Button AS Integer)
Image1.X = X
Image1.Y = Y 
END

Maustasten abfragen

[Bearbeiten]

Im folgenden Programm wird die linke Maustaste abgefragt. Wird sie gedrückt , dann malt die Maus eine runde Form. Wird die rechte Taste gedrückt, wird eine rechteckige Form zum Malen benutzt.

Sie brauchen ein Zeichenfeld ( Drawingarea) auf Ihrer Form, um das Programm in Gang zu bringen.

PUBLIC SUB Form_Open()
 DrawingArea1.Cached = FALSE
 DrawingArea1.BackColor = &HFFFFFF&
 'weisser Hintergrund
END
PUBLIC SUB DrawingArea1_MouseMove()
 IF Mouse.Button = 1 THEN
   Draw.Begin(DrawingArea1)
     Draw.Ellipse(Mouse.X, Mouse.Y, 9, 9)
   Draw.End
 ELSE
   Draw.Begin(DrawingArea1)
     Draw.Rect(Mouse.X, Mouse.Y, 9, 9)
   Draw.End  
 ENDIF
END

Eine andere Cursorform über die Eigenschaften festlegen

[Bearbeiten]

Man kann die Form des Mauszeigers ( Cursor) bei den Eigenschaften einiger Steuerelemente festlegen. Nimmt man eine leere Form und schaut sich deren Eigenschaften mit der F4 Taste an, dann findet sich dort in der Mitte der Eigenschaftstabelle eine Zeile mit der Bezeichnung Mouse. Clickt man diese Zeile im rechten Teil an , dann erhält man eine Auswahl von verschiedenen Mouseformen:

  • Arrow
  • Blank
  • Cross
  • Custom
  • Default
  • Horizontal
  • Pointing
  • SizeAll
  • SizeE
  • SizeH
  • SizeN
  • SizeNE
  • SizeNESW
  • SizeNW
  • SizeNWSE
  • SizeS
  • SizeSE
  • SizeSW
  • SizeV
  • SizeW
  • SplitH
  • SplitV
  • Text
  • Vertical
  • Wait

Probieren Sie verschiedene Mouseformen aus und starten Sie Ihr Programm einfach mit F5, dann sehen Sie die gewählte Mauszeigerform.

Über einigen Steuerelementen läßt sich die Zeigerform wieder neu wählen oder sie ist bereits voreingestellt.

Sie können den Mauszeiger auch in ihrem Programmablauf ändern. Wie das geht zeigt folgendes Programm: Sie brauchen eine Form und 2 Befehlsknöpfe, um es in Gang zu bringen.

PUBLIC SUB Button1_Click()
 Form1.Mouse = Mouse.Wait
END
PUBLIC SUB Button2_Click()
 Form1.Mouse = Mouse.Pointing
END

Die Zufallsmaus

[Bearbeiten]

Sie können die ganzen Mauszeigerformen anschauen , wenn Sie einmal folgendes Programm ausprobieren.

Um es in Gang zu bringen brauchen Sie nur einen Timer ( Taktgeber) auf Ihrer Form.

PUBLIC SUB Form_Open()
timer1.Enabled = TRUE
timer1.Delay = 300 
END
PUBLIC SUB Timer1_Timer()
x AS Integer 
Mouse AS Integer 
Randomize
x = Int(Rnd(1,15))
form1.Mouse = x - 2 
END

Bereits beim starten des Programmes wird der Timer angeschaltet und seine Zeitverzögerung ( Delay ) auf einen mittleren Wert von 300 eingestellt. Im Unterprogramm des Timers werden Zufallszahlen zwischen 1 und 15 erzeugt. Diese Zufallszahlen werden der Eigenschaft des Mauszeigers zugeordnet. Deswegen variiert die Mausform alle möglichen Formen per Zufall durch. Die Eigenschaften der Maus finden Sie unter der Gambas Komponente Gb.QT .

Stört Sie der Zufall im obigen Programm. Dann probieren Sie einmal folgende Variante:

PUBLIC SUB Button1_Click()
x AS Integer 
Mouse AS Integer 
FOR x = -1 TO 13 
 form1.Mouse = x 
 WAIT 0.5
 Button1.Text = "Maus" & Str(x)
NEXT 
END

In diesem Programm werden alle Mausformen mit einer Verzögerung von einer halben Sekunde ( Wait 0.5) durchprobiert. Um das Programm in Gang zu bringen brauchen Sie eine Form und einen Befehlsbutton.

Die Zeigerform der Maus kann über folgende konstanten Werte festgelegt werden, wenn man die Mauseigenschaft mit

Mouse AS Integer 

definiert.

  • Default = -1
  • Arrow = 0
  • Cross = 2
  • Wait = 3
  • Text = 4
  • SizeS = 5
  • SizeE = 6
  • SizeNESW = 7
  • SizeNWSE = 8
  • SizeAll = 9
  • Blank = 10
  • SplitV = 11
  • SplitH = 12
  • Pointing = 13

Ein anderes Cursorbild mit dem Cursorbefehl

[Bearbeiten]

Man kann mit dem Befehl Cursor dem Cursor ein neues Symbol zuordnen. Wie das geht soll das folgende Beispielprogramm zeigen.

PUBLIC SUB Form_Open()
hPict AS Picture
hCursor AS Cursor
hPict = Picture["neuerpfeil.png"]
hCursor = NEW Cursor(hPict)
ME.Cursor=hCursor
END

Die Bilddatei neuerpfeil.png müssen sie mit einem Malprogramm neu erstellen und im Verzeichnis abspeichern, in dem auch ihr Gambasprogramm steht. Fehlt die Bilddatei, dann ergibt das eine Fehlermeldung Null objekt , da das zu ladenden Bildobjekt für die Klasse Cursor fehlt.

Theorie

[Bearbeiten]

Hinter dem Befehl Cursor steht eine Klasse , in die ein beliebiges Bild als Mauszeiger geladen werden kann. Die Klasse ist zur Laufzeit erzeugbar. Dies wird auch im obigen Beispielprogramm so gehandhabt. Mit dem Befehl wird ein neuer Cursor aus einem Picture Objekt erzeugt. Die Mausspitze kann man genauer definieren, im allgemeinen wird die linke obere Ecke des Mausbildes herangezogen.

Die Syntax für den Cursor lautet dann:

hCursor = NEW Cursor ( Picture AS Picture [ , X AS Integer, Y AS Integer ] ) 

X und Y sind die Koordinaten der Mausspitze ( Hot spot)

Frage

[Bearbeiten]

Wie kann man den Mauszeiger zur Uhrform ( busy or wait = Warten ) und zurück verändern ?

Lösung:

ME.Mouse = Mouse.Wait
...
ME.Mouse = Mouse.Normal


Textausgabe

[Bearbeiten]

Die Textausgabe kann mit dem Print Befehl im Direktfenster oder in einer Textbox oder Textarea erfolgen.

Das kürzeste Gambas Programm mit einer Textausgabe lautet

PUBLIC SUB Form_Open()
PRINT 1
END

Man braucht eine leere Form, um es zu starten.

Starten Sie ein neues Projekt. Nennen Sie es wie sie wollen. Holen Sie sich eine neue Form mit der rechten Maustaste. Nennen Sie diese wie sie wollen. Es geht auch einfach F .

Dann kopieren Sie den Programmode in den Gambas Programmcodebereich Form.class.

Starten Sie das Programm mit F5

Diese Programm nutzt den Print Befehl. Alles was das Programm macht: Es gibt die Zahl eins im Direktfenster aus.

Will man das Programm abändern, um die Textausgabe in einer Textbox zu erreichen, dann schaut der Code so aus:

PUBLIC SUB Form_Open()
Textbox1.Text = "1"
END

Versucht man das Programm mit einer leeren Form zu starten, dann erhält man eine Fehlermeldung.

Unknown identifier: textbox1 Zeile 5 in Form1.class 

Man braucht also eine Textbox auf der Form. Diese holt man sich mit F6 und Doppelklick auf die Textbox aus der Werkzeugkiste.

Print

[Bearbeiten]

Der gute alte Printbefehl ist etwas aus der Mode gekommen. Trotzdem kann man ihn noch sehr gut gebrauchen. Mit dem Print Befehl leitet man die Programmausgabe in die Standardausgabe ( meist die Textkonsole) um.

Dies ist unterschiedlich zu Visual Basic. Dort gab der Printbefehl sein Ergebnis in der Form aus. Das machte er ohne Rücksicht auf die Dinge, die sonst noch in der Form zu finden waren. Die Ausgabe war deswegen oft schlecht lesbar. Er hatte auch den Nachteil, keinen Zeilenumbruch zu können.

Man kann den Printbefehl in Gambas sehr gut zur Fehlersuche benutzen, wenn man mit ihm den Wert von Variablen in die Textkonsole umleitet und ausgibt. Viele Hilfetexte für Gambas benutzen außerdem den Printbefehl.

Versuchen Sie jetzt folgendes Beispiel:

PUBLIC SUB Button1_Click()
DIM k AS Integer
FOR k = 1 TO 10
 PRINT k;
NEXT
PRINT
PRINT 1,2,3,4,5,6,7,8,9,10
FOR k = 1 TO 10
 PRINT k
NEXT
END

Holen Sie sich eine neue Form. Darauf plazieren Sie einen Befehlsknopf ( = CommandButton) . Diesen können Sie sich mit F6 aus der Werkzeugkiste holen. Klicken Sie im Entwurfsmodus auf den Befehlsknopf und weisen Sie ihm den Programmcode weiter unten zu. Wenn das hier gezeigte Programm für sie noch zu kompliziert ist , dann geben Sie einfach einmal Print 1 oder Print "Hallo Welt! " ein.

Starten Sie das Programm mit F5 und drücken Sie auf den Befehlsknopf, dann sollten Sie folgende Ausgabe erhalten:

12345678910
1	2	3	4	5	6	7	8	9	10
1
2
3
4
5
6
7
8
9
10

Man beendet das Programm mit einem Klick auf die Raute rechts oben .

Der Printbefehl gibt Ausdrücke auf dem Standard Ausgabe gerät aus. Die Ausdrücke werden vorher mit der String Funktion Str() in eine Textausgabe umgewandelt.

Text muß für den Printbefehl in Anführungszeichen stehen:

Print "Hallo Welt" ist korrekt Print Hallo Welt funktioniert nicht.

Bei ganzen Zahlen können die Anführungszeichen weggelassen werden. Print "1" ist identisch mit Print 1.

Falls nach dem letzten Zeichen kein Komma oder Strichpunkt folgt, wird ein Neue Zeile Befehl automatisch angefügt.

Falls im Print Befehl ein Komma auftaucht wird eine Tabsprung (ASCII code 9) eingefügt. Meist entspricht der Tabsprung 5 Leerzeichen.

Der Doppelpunkt nach dem Printbefehl funktioniert in Gambas nicht.

Print 1: Print 2 

gibt eine Fehlermeldung.

Syntax error

String$

[Bearbeiten]

Mit dem Befehl String$ kann man ein Zeichen oder eine Zeichenfolge mehrfach ausgeben

Syntax:

String = String$ ( Häufigkeit , Zeichenfolge ) 

Beispiel :

PRINT String$(12, "*")

Ausgabe: ************

PRINT String$(2, "Gambas")

Ausgabe: GambasGambas

Texteingabe

[Bearbeiten]

Die Texteingabe erfolgt über eine Textbox oder eine Textarea.

Man kann die Texteingabe auf die Eingabe bestimmter Zeichen begrenzen. Wie das geht, zeigt folgendes Beispiel. Es nutzt den STOP EVENT Befehl:

Sie brauchen eine Textbox auf Ihrer Form um das Programm in gang zu bringen:

'Meine Textbox verarbeitet nur Ziffern.
PUBLIC SUB TextBox1_KeyPress()
  IF Instr("0123456789", Key.Text) = 0 THEN
   STOP EVENT
 ENDIF
END SUB

Ähnliches können Sie mit dem folgenden Code erreichen.Interessant ist hier, die anfangs unverständliche Nutzung des If Then Befehles:

PUBLIC SUB Form_Open()
 ME.Text = "Nur Zahlen erlaubt !"
END
PUBLIC SUB TextBox1_KeyPress()
   IF key.Code >= 48 AND key.Code <= 57 THEN 
   ELSE IF key.Code = key.BackSpace THEN 
   ELSE IF key.Code = key.Delete THEN 
   ELSE 
     STOP EVENT 
 ENDIF 
END

Text Löschen

[Bearbeiten]

Mit dem folgenden kleinen Programm löscht man eine Textbox leer. Es ist ziemlich simpel. Holen Sie sich eine Textbox aus der Werkzeugkiste . Dann noch einen BefehlsButton. Waybackmaschine anwählen und dann suchen unter www.madeasy.de/7/prgtxtdel.htm

PUBLIC SUB Button1_Click()
TextBox1.Text = ""
END

Text zusammenkleben mit &

[Bearbeiten]

Text kleben kann man in Gambas mit dem Befehl &. Das Zeichen finden Sie oberhalb der Ziffer 6. Man kann den Text nicht einfach mit dem Plus Zeichen zusammenkleben, denn im Gegensatz zu VB ist + in Gambas nur für die mathematische Addition reserviert.

Das Beispielprogramm klebt 2 Textteile aneinander und gibt sie in einer TextArea aus. Es ist ziemlich einfach. Holen Sie sich drei TextAreas aus der Werkzeugkiste . Dann noch zwei Buttons. Benennen Sie die Buttons bei den Properties ( = Eigenschaften mit F4 Taste aufrufen) um.

Siehe auch Waybackmaschine und dann suchen unter www.madeasy.de/7/prgtxtplus.htm

Der Programmcode schaut so aus:

PUBLIC SUB Button1_Click()
TextArea1.Text = "1.Teil "
TextArea2.Text = "2.Teil " 
END

PUBLIC SUB Button2_Click()
TextArea3.Text = "1.Teil " & " und 2.Teil "
END


Auch folgender Code ist korrekt:

TextArea3.Text = TextArea1.Text & TextArea2.Text

TextArea3.Text = TextArea1.Text + TextArea2.Text ergibt eine Meldung True oder T.

Neue Zeile mit & Chr$(10) & Chr$(13)

[Bearbeiten]

Die Zeichen Chr$(10), Chr$(13) haben eine besondere Bedeutung. Sie symbolisieren keinen Buchstaben wie zb Chr$(60) sondern führen einen Zeilenwechsel durch. Die alten Bezeichnungen dafür waren LF und CR, d.h Line feed und Carriage return. Sie stammen noch aus der Schreibmaschinenarea.

Beachten Sie das in Gambas das Pluszeichen + nur als mathematisches Zeichen verwendet werden darf. Zum kleben von Strings benutzt man &.

Das Beispiel Programm klebt 2 Textteile aneinander und fügt eine neue Zeile dazwischen. Das Ergebnis wird in einer dritten TextArea ausgegeben.

Holen Sie sich drei TextAreas aus der Werkzeugkiste . Dann noch zwei Buttons. Benennen Sie die Buttons bei den Properties ( = Eigenschaften mit F4 Taste aufrufen) um.

Der Programmcode schaut so aus:

PUBLIC SUB Button1_Click()
TextArea1.Text = "1.Teil "
TextArea2.Text = "2.Teil " 
END
PUBLIC SUB Button2_Click()
TextArea3.Text = "1.Teil " & Chr$(10) & Chr$(13) & " und 2.Teil "
END

Textlabel Fett, Kursiv und farbig

[Bearbeiten]

Die Textausgabe in einem Textlabel kann man kursiv,fett oder farbig gestalten. Wie das geht zeigt folgendes Programm.

Holen Sie sich einen TextLabel aus der Werkzeugkiste . Dann noch einen Button. Benennen Sie den Button bei den Properties ( = Eigenschaften mit F4 Taste aufrufen) um.

http://www.madeasy.de/7/prgtextlabel.htm

Screenshot des Textlabel Programmes

Clicken Sie auf den Button im Entwurfsmodus und geben sie den Programmcode von unten ein. Leider wird unter der Wikieingabe der Quelltext falsch dargestellt. Drücken Sie deswegen in diesem Wikiabsatz rechts oben auf Bearbeiten und übernehmen Sie den Wikiquelltext des Programmes direkt aus der Bearbeitenversion. Dann funktioniert es richtig.

PUBLIC SUB Button1_Click()
"TextLabel1.Text= "<b>TextLabel</b><br>"&
"<i>Hier können Sie die Textausgabe beeinflussen </i> <br>"&
"<u>So geht das</u><br>"&
"<font color=red>auch in rot!</font>"
END

Der Split Befehl

[Bearbeiten]

Der Befehl Split unterteilt einen Textstring in mehrere Teile. Die Textausgabe wird durch ein Separatorzeichen getrennt. Das Seperatorzeichen ist auf ein Komma voreingestellt. Will man ein anderes Separatorzeichen muss man dies angeben. In dem angegebenen Beispiel wird als Separatorzeichen ein Leerzeichen verwendet.

Einen Satz in seine Worte zerlegen

[Bearbeiten]

Mit dem Splitbefehl kann man sehr einfach eine Satz in seine Worte zerlegen:

Beispielprogramm im Terminalmodus

STATIC PUBLIC SUB Main()
DIM liste AS String[]
DIM element AS String
DIM trenn AS String
DIM text1 AS String
trenn = " "
text1 = "Dies ist ein Satz mit mehreren Worten."
liste = Split(text1, trenn)
FOR EACH element IN liste
 PRINT element
NEXT
END

Ausgabe im Direktfenster:

Dies
ist
ein
Satz
mit
mehreren
Worten.

Beispiel2: Eine Zahlreihe summieren

[Bearbeiten]

Siehe Gambas Rechnen Summierprogramm Addy

Beispiel 3 des Splitbefehls

[Bearbeiten]

Das Beispielprogramm zeigt Ihnen den Gebrauch des Splitbefehls .

Das hier angebene Beispiel ist etwas kompliziert , da in der Ausgabe die Reihenfolge der Wort noch von hinten nach vorne vertauscht wird.

Holen Sie sich eine neue Form. Platzieren Sie darauf ein Textfeld ( = Textbox). (Holen Sie sich das Element mit F6 und Doppelclick aus der Werkzeugkiste.)

Platzieren Sie darauf ein Befehlsfeld und benennen Sie es neu, wie auf dem Bild gezeigt :

Holen Sie aus der Werkzeugkiste zwei Textlabelfelder.

Programmcode:

STATIC PUBLIC SUB Main()
hForm AS F
hForm = NEW F
hForm.show
END
PUBLIC SUB Button1_Click()
myAr AS String[]
myStr AS String
outstr AS String
x AS Integer
outstr = ""
myAr = Split(TextBox1.Text, " ")
FOR x = 1 TO myAr.length
 outstr = outstr & " " & myAr[myAr.length - x]
NEXT
TextLabel2.Text = outstr
END

Split Syntax

Array = Split ( String [ , Separators , Escape ] ) 

Splits a string into substrings delimited by Separators . Escape characters can be specified: any separator characters enclosed between two escape characters are ignored in the splitting process.

Note that Split takes only three arguments: if you want to use several separators, you should pass them as the second parameter, concatenated in a single string.

By default, the comma character is the separator, and there are no escape characters.

This function returns a string array filled with each detected substring.

Beispiel

DIM Elt AS String[]
DIM Sb AS String
Elt = Split("Gambas Almost Means BASIC ! 'agree ?'", " ", "'")
FOR EACH Sb IN Elt
 PRINT Sb
NEXT

Ausgabe:


Gambas
Almost
Means
BASIC
!
agree ?

Der Replace Befehl - Zeichenersetzen

[Bearbeiten]

Mit dem Replace$ Befehl kann man Buchstaben oder Silben in einem Text austauschen.

Der Befehl hat folgende Syntax:

Ergebnis = Replace$ ( Text , Suchmuster , Ersatzmuster ) 

Der Befehl tauscht an jeder Stelle im Text die Silbe Suchmuster durch das neue Ersatzmuster aus. Das ganze wird in Ergebnis gespeichert. Beachten Sie Ergebnis, Text , Suchmuster , Ersatzmuster sind willkürlich gewählte Namen Falls Text ein leerer Text ist, dann ist Ergebnis auch Null. Falls Suchmuster leer ist (null), dann ist Ergebnis = Text.

Kleine Beispiele aus der Gambas Hilfe

[Bearbeiten]
PRINT Replace$("Gambas is basic", "bas", "BAS")

>> GamBAS is BASic

PRINT Replace$("Gambas is basic", "a", "")

>>Gmbs is bsic

PRINT Replace$("Gambas is basic", " ", "--")

>>Gambas--is--basic

Beispielprogramm

[Bearbeiten]

Im folgenden Beispiel kann man die Austauschaktion beobachten und nach belieben verändern.

Layout

[Bearbeiten]

Man braucht:

  • 1 Textarea
  • 1 Befehlsbutton
  • 2 Textboxen
  • 1 Label

Der Code

[Bearbeiten]
PUBLIC SUB Form_Open()
 ME.Text = "Replace-Befehl"
 Textarea1.Text = "Dies ist ein neuer Test"
 Textbox1.Text = "i"
 Textbox2.Text = "a"
 Label1.Text = "mit"
 Button1.Text = "Ersetze"
END
PUBLIC SUB Button1_Click()
 a AS String 
 a = Replace$(Textarea1.Text, Textbox1.text,Textbox2.text)
 textarea1.Text = a
END

Instr An welcher Position steht der Teil ?

[Bearbeiten]

Der Befehl InStr sucht eine kurze Zeichenfolge (String) in einer längeren Zeichenfolge.

print Instr("bearbeitet", "ea")

Ergibt in der Ausgabe:

2

Die Textfolge ea wird ab der Position 2 in bearbeitet gefunden: bearbeitet.

Das kurze Programm

STATIC PUBLIC SUB Main()
PRINT Instr("Dieser Text wird jetzt gleich bearbeitet", "ei")
PRINT Instr("Dieser Text wird jetzt gleich bearbeitet", "ei", 28)
PRINT Instr("Diesen String wird jetzt gleich bearbeitet ", "ein")
END

ergibt als Ergebnis in der Direktausgabe:

26
36
0
  • 26 ist die erste Fundstelle.
  • 36 ist die Fundstelle nach der Position 28
    • Wenn man nach der zu suchenden Textsequenz nach einem Komma noch eine ganze Zahl N eingibt, dann fängt der Befehl erst ab der N.ten Stelle im Text zu suchen an.
  • ein gibt es gar nicht im Text , deswegen wird 0 ausgegeben.

RInStr

[Bearbeiten]

Der Befehl RInStr funktioniert wie sein Namensvetter InStr, nur sucht er vom rechten Ende her. (von Rechts deswegen RInStr)

Beispiel mit allen Möglichkeiten von RInStr

STATIC PUBLIC SUB Main()
PRINT RInstr("Dieser Text wird jetzt gleich bearbeitet", "ei")
PRINT RInstr("Dieser Text wird jetzt gleich bearbeitet", "ei", 28)
PRINT RInstr("Dieser Text wird jetzt gleich bearbeitet", "ein")
END

Das gleiche Beispiel im Grafikmodus:

PUBLIC SUB Button1_Click()
PRINT RInstr("Dieser Text wird jetzt gleich bearbeitet", "ei")
PRINT RInstr("Dieser Text wird jetzt gleich bearbeitet", "ei", 28)
PRINT RInstr("Dieser Text wird jetzt gleich bearbeitet", "ein")
END

Um das Beispiel in Gang zu bringen braucht man einen Befehlsbutton auf der Form.

Ausgabe:

36
26
0

Subst Platzhalter im Text

[Bearbeiten]

Mit Subst kann man einen variablen Platzhalter in einen Text einfügen. Der zu ersetzende Teil beginnt immer mit & und einer Zahl danach. (&1, &2, &3 ....usw.). Das Einfügen erfolgt der Reihe nach.

print Subst("Diesen Text in einer &1 bearbeiten", "Textbox")

&1 wird durch Textbox ersetzt.

print Subst("&1 Texte in der &2 ersetzen. ", "Alle", "Textbox")

Ausgabe:

Alle Texte in der Textbox ersetzen.

Länge eines Strings ( einer Textfolge) feststellen Len

[Bearbeiten]

Mit dem Befehl Len kann man die Länge eines Strings messen.

 print Len("Die Länge wird gleich gemessen.")

Ausgabe:

32

Beispiel:

PUBLIC SUB Form_Open()
 Button1.Text = "Länge"
 Textbox1.Text = "Dies ist ein Test"
 Textbox2.Text = ""
END
PUBLIC SUB Button1_Click()
 textbox2.Text = Str(Len(textbox1.text))
END

Sie brauchen einen Befehlsbutton und 2 Textboxen auf ihrer Form, um das Beispiel in Gang zu bringen. Wenn Sie nicht wissen was der Befehl str bedeutet, dann schauen Sie hier nach: Gambas: Umwandlung von Variablen Str wandelt jede andere Variable in einen String um. Probieren Sie einfach einmal das Beispiel ohne Str aus. Auch das funktioniert.

CHR() ASCII-Zahlencode in Zeichen umwandeln

[Bearbeiten]

Der CHR Befehl wandelt Zahlen zu Buchstaben und Zeichen um

Syntax:

Character = Chr$ ( Zahl ) 

Er gibt das Zeichen zurück, welches dem ASCII code von Zahl entspricht . Auf das früher übliche Stringzeichen $ können Sie verzichten.

Chr(Zahl) ist gleich Chr$(Zahl) 

Das Gegenteil des CHR Befehls ist der Befehl ASC.

Beispiel 1:

PRINT Chr$(65)

Ausgabe: A

Beispielprogramm zum CHR Befehl im Terminalmodus

STATIC PUBLIC SUB Main()
DIM x AS Integer
FOR x = 30 TO 133
PRINT x,Chr$(x)
NEXT
PRINT
PRINT "Zeilenumbruch CHR(10)", Chr$(10)
PRINT "Return CHR(13)", Chr$(13)
PRINT "Leerzeichen Chr$(32)", "a";Chr$(32);"a"
PRINT "0 CHR48", Chr$(48), Str(0)
PRINT "9 CHR57", Chr$(57), Str(9)
PRINT "@ CHR64", Chr$(64), Str("@")
PRINT "A CHR65", Chr$(65), Str("A")
PRINT "Z CHR90", Chr$(90), Str("Z")
PRINT "a CHR97", Chr$(97), Str("a")
PRINT "z CHR122", Chr$(122), Str("z")
END

ASC() Wandelt alphanumerische Zeichen in ASCII-Zahlencode um

[Bearbeiten]

Der Befehl Asc gibt den ASCII code eines Buchstabens oder Zeichens zurück. Wenn die Position nicht angegeben wird, dann wird der ASCII code des ersten Zeichens zurückgegeben.


Syntax

Asc ( String [ , Position ] ) 

Beispiel:

PRINT Asc("Gambas")

Ausgabe: 71

PRINT Asc("Gambas", 3)

Ausgabe: 109

Beispiel im Terminalmodus:

STATIC PUBLIC SUB Main()
DIM test AS String
DIM x AS Integer
test = "1234567 Dies ist ein Test"
FOR x = 1 TO Len(test)
 PRINT Asc(test,x)
NEXT
END

Str() wandelt andere Variablen in einen Textstring um

[Bearbeiten]

Haben Sie eine Zahl oder eine andere Variable, die Sie in Text umwandeln wollen, dann sollten Sie den Befehl Str() verwenden. Einfache Umwandlungen macht Gambas automatisch ohne den Str Befehl, verlassen Sie sich aber nicht auf diese Automatismen. Im Zweifelsfall fügen Sie ein Str ein.

Beispiel: Sie brauchen eine Textbox und einen Befehlsknopf, um es in Gang zu bringen.

PUBLIC SUB Form_Open()
 ME.Text = "Str wandelt andere Variablen in Text um"
 Button1.Text = "Start"
 textbox1.Text = ""
END
PUBLIC SUB Button1_Click()
 textbox1.Text = Str(8 * 37)
 'textbox1.Text = 8 * 37
 'Probieren Sie es einmal ohne Str
END

Siehe auch Gambas: Umwandlung von Variablen#str$

Zeichensatz

[Bearbeiten]

Folgendes kleine Programm gibt den aktuellen Zeichensatz Ihres Systems aus. Sie brauchen dazu nur eine leere Form.

PUBLIC SUB Form_Open()
PRINT System.Charset
END

Ausgabe zb im Direktfenster:

ISO-8859-15

Siehe auch CONV$

Schriftart (Font) über einen Standarddialog wählen

[Bearbeiten]

Im folgenden Beispielprogramm kann man die Schriftart einer Textarea über einen Standarddialog wählen.

Sie brauchen dazu eine Textarea und einen Commandbutton.

PUBLIC SUB Button1_Click()
 IF Dialog.SelectFont() THEN RETURN
 Textarea1.Font = Dialog.Font
END

Sie können den Font natürlich auch über die Eigenschaften der Textarea festlegen oder im Programm direkt codieren.

Ein Beispielprogramm zeigt die direkte Codierung während der Laufzeit. Sie brauchen eine Form und einen Textarea, um das Programm in Gang zu bringen.

PUBLIC SUB Form_Open()
Form1.Font.Name = "Utopia"
Form1.Font.Bold = TRUE
Form1.Font.Italic = TRUE
Form1.Font.Size = "24"
Form1.Font.StrikeOut = FALSE
Form1.Font.Underline = TRUE
END

Alle verfügbaren Schriftarten aufzählen

[Bearbeiten]

Mit dem folgenden Beispielprogramm können Sie sich alle verfügbaren Fonts aufzählen lassen. Sie brauchen einen Befehlsbutton um das Programm starten zu können. Die Ausgabe der Fonts erfolgt im Direktfenster.

PUBLIC SUB Button1_Click()
DIM c AS String
FOR EACH c IN Fonts
 PRINT c
NEXT 
END


Text in die Zwischenablage

[Bearbeiten]

Die Zwischenablage ist eine der praktischsten Erfindungen seit es den PC gibt. Auch unter Gambas kann man sie nutzen.

Das folgende kleine Programm kopiert mit dem Befehl1 einen Text in den Zwischenspeicher und holt ihn mit dem Befehl 2 wieder heraus.



Hinter den Befehlsfeldern In den Zwischenspeicher und aus dem Zwischenspeicher heraus steht folgender Programmcode:

PUBLIC SUB Button1_Click()
DIM t AS String
Clipboard.Clear 
' Zwischenablage löschen. 
t = textarea1.Text 
Clipboard.Copy (t)
'Text in Zwischenablage kopieren. 
textarea1.Text = "" 
END

PUBLIC SUB Button2_Click()
DIM a$ AS String
'Text aus Zwischenablage holen. 
textarea2.Text = Clipboard.Paste ()
END

Kürze Variante :

' Gambas class file
PUBLIC SUB Button1_Click()
Clipboard.Copy (Textarea1.Text)
'Text in Zwischenablage kopieren. 
END

PUBLIC SUB Button2_Click()
textarea2.Text = Clipboard.Paste ()
'Wieder heraus holen
END

Hinweis: Nach beenden der Anwendung, wird das Clipboard gelöscht!

Theorie der Zwischenablage

[Bearbeiten]

Die Clipboardklasse ist static. Was heißt das ??

Das Clipboard hat folgende Eigenschaften:

  • Format
  • Type

Es hat folgende Methoden

  • Clear
  • Copy
  • Paste

Es hat folgende Konstanten

  • Image
  • None
  • Text

You cannot instanciate this class. Referenced by: Graphical User Interface Component - gb.qt

Wie kann man Grafik in die Zwischenablage kopieren und wieder heraus holen?

[Bearbeiten]

In Linux kann man einen Screenshot mit Strg und der Drucktaste in den Zwischenspeicher kopieren. Wie funktioniert das unter Gambas??

Wie kann man die Klipper-Zwischenablage (KDE) bearbeiten ?

[Bearbeiten]

Im KDE gibt es das Zwischenablagetool Klipper. Wie funktioniert das Handling von Klipper unter Gambas ??


Übersicht der Befehle

[Bearbeiten]
Date Gibt das aktuelle Systemdatum zurück
Format ermöglicht verschiedene Ausgaben für Zeit und Datum
IsDate Gibt einen booleschen Wert zurück, der angibt, ob ein Ausdruck in ein Datum umgewandelt werden kann
Minute Gibt eine ganze Zahl im Bereich von 0 bis 59 zurück, die die Minute in der Stunde darstellt
Month Gibt eine ganze Zahl im Bereich von 0 bis 12 zurück, die den Monat im Jahr darstellt
Now Gibt das aktuelle Datum und die aktuelle Zeit auf Ihrem Computer zurück
Time, Time$ Gibt einen Wert vom Typ Date zurück, der die aktuelle Systemzeit angibt
Timer Gibt die Anzahl der Sekunden zurück, die seit Programmbeginn vergangen sind
Weekday Gibt den Wochentag als ganze Zahl zurück (1 = Sonntag, 2 = Montag, usw.)
Year Gibt das Jahr als ganze Zahl zurück
Wait Wartet eine vorgegebene Zeitspanne

Wait-Befehl (Pause)

[Bearbeiten]

Der Wait-Befehl hat folgende Syntax.

WAIT [ Pause ]

Er ruft die Event Schleife auf. Falls für Pause ein Wert eingegeben wurde, dann bleibt er in der Warteschleife bis die Pausenzeit vergangen ist. Pause ist eine Fließkommazahl. Wenn man eine warteschleife von 100 ms programmieren will, muss man

 WAIT 0.1

eingeben.

Während der Waitschleife sind Tastatur- oder Mauseingaben nicht möglich. Nur Zeichnungs, Zeitgeber und Dateibeschreibungsereignisse wie Process_Write laufen noch ab.

Beispiel:

Das folgende Beispiel zeigt den Gebrauch des Wait-Befehls. Man braucht dazu eine Form mit einem Befehlsbutton und einer Textbox.

PUBLIC SUB Button1_Click()
  WAIT 5
  'wartet 5 Sekunden 
  WAIT 0.1 
  'wartet 100 Millisekunden 
  textbox1.Text = ""
END

Wichtige Befehle für die Zeit sind time und now. Der Timer ist eine Stopuhr die immer wieder ein bestimmtes Zeitintervall durchläuft und dann ein Ereignis startet. Vorsicht: die Timerfunktion ist etwas anderes als der Timer. Die Timerfunktion misst die Zeit in Sekunden die seit dem Programmstart vergangen ist.

Einfache Umrechnungen sollten Sekunden in Minuten und Stunden und Tage umrechnen können. Das ganze auch wieder rückwärts.

Time Befehl

[Bearbeiten]

Ein gutes Beispiel für eine einfache Funktion ist der Befehl Time (= Zeit). Diese Funktion liefert die aktuelle Systemzeit. Sie können diese Funktion mit folgendem Befehl testen:

Print Time

Das folgende kleine Programm ohne Grafik gibt die Zeit im Direktfenster aus:

STATIC PUBLIC SUB Main()
  PRINT Time
END

Wenn Sie die Zeit immer wieder aktualisiert haben wollen, müssen Sie eine Schleife einbauen. Das Programm schaut dann so aus:

STATIC PUBLIC SUB Main()
  DIM i AS Integer
  FOR i = 1 TO 100
    PRINT Time
    WAIT 0.1
  NEXT
END

Das Programm gibt 10 Sekunden lang alle 100 Millisekunden die Zeit aus.

Ein ähnliches Beispiel für die Grafikausgabe aktualisiert die Zeitausgabe immer wieder. Dazu nutzt man den Timer, das Zeitgeber-Steuerelement. Dieser hat zunächst mit der aktuellen Zeit nichts zu tun, sondern löst ein Ereignis nach einer bestimmten Zeit aus.

Das folgende kleine Beispielprogramm kombiniert den Timer und die Timefunktion zu einer ständig aktualisierten Zeitangabe, wie sie diese auch rechts unten an ihrem PC finden.

Starten Sie ein neues Projekt. Nennen Sie es Zeitausgabe. Platzieren Sie anschließend eine Textbox auf Ihrer Form. Außerdem brauchen Sie das Zeitgebersteuerelement mit dem Uhrsymbol. Holen Sie sich beides mit F6 und einem Doppelclick auf das Symbol aus der Werkzeugkiste. Achten Sie darauf, dass der Zeitgeber mit der Enabled Eigenschaft erst angeschaltet werden muss. Dies können Sie bei den Eigenschaften des Timers zur Entwurfszeit einstellen oder Sie können es auch im Programmcode mit der Zeile

Timer1.Enabled = TRUE

erreichen.

PUBLIC SUB Timer1_Timer()
  Timer1.Enabled = TRUE
  TextBox1.Text = Time
END

Das Programm zeigt in der Textbox die aktuelle Zeit an. Diese wird jede Sekunde (= 1000 Millisekunden) aktualisiert.

Timer-Funktion

[Bearbeiten]

Die Timer-Funktion hat nichts mit dem gleichnamigen Zeitgebersteuerelement zu tun.

Die Timer-Funktion gibt die Zeit in Sekunden aus, die seit Programmbeginn verstrichen sind.

In Visual Basic ist das anders. Hier gibt die Timer-Funktion die Anzahl der Sekunden zurück, die seit 0 Uhr verstrichen sind, mit einer Genauigkeit von 1/100 Sekunde.

Hinter dem Befehl Zeit seit Programmstart steht folgender Code:

PUBLIC SUB Button1_Click()
  TextBox1.Text = Timer
END

Beispiel:

PRINT Timer

Ergebnis variabel

0.291657006775

Ferner kann die Funktion dazu dienen, die Laufzeit eines Programms oder eines Programmteils zu ermitteln.

Beispiel:

Beginn = Timer 
'Schleife laufen lassen 
Ende = Timer 
Zeit = Ende - Beginn 
'Zeit wird in Sekunden gemessen 

Sie können die Timer-Funktion zusammen mit der Randomize-Anweisung verwenden, um einen Startwert für die Rnd-Funktion zu erzeugen.

Format Befehl für die Zeit und Datumsausgabe

[Bearbeiten]

Der Format$ Befehl ist sehr umfassend in seinen Möglichkeiten. Im folgenden soll nur die Zeit und Datumsfunktion betrachtet werden. Allgemein funktioniert er so:

String = Format$ ( Expression [ , Format ] ) 

Der Befehl Format wandelt einen Ausdruck (Expression) in einen Textstring um, je nach dem wie man es selber haben will.

Die Funktion nutzt ihre länderspezifischen Einstellungen des Rechners und muss deswegen immer wieder überprüft werden, insbesondere wenn man von einer Sprache in die andere wechselt.

Benutzerdefinierte Datumsformate kann man folgendermassen ausgeben:

yy gibt die Jahreszahl in 2 Ziffern aus
yyyy gibt die Jahreszahl in 4 Ziffern aus
m gibt den Monat aus
mm gibt den Monat in 2 Ziffern aus
mmm gibt den Monat als abgekürzte Textform aus z.B. Aug = August
mmmm gibt den Monat in voller Bezeichnung aus
d gibt den Tag aus
dd gibt den Tag in 2 Ziffern aus
ddd gibt den Wochentag in abgekürzter Form aus
dddd gibt den Wochentag in voller Länge aus
/ gibt den Datumstrenner (=separator) aus
h gibt die Stunde aus
hh gibt die Stunde in 2 Ziffern aus
n gibt die Minuten aus
nn gibt die Minuten in 2 Ziffern aus
s gibt die Sekunden aus
ss gibt die Sekunden in 2 Ziffern aus
: gibt den Zeittrenner (= time separator) aus

Das zusammengefasste Beispielprogramm im Terminalmodus nutzt neben dem Formatbefehl noch die Funktion Now für den momentanen Zeitpunkt. Now = Jetzt.

STATIC PUBLIC SUB Main()
  PRINT Format$( Now, "mm/dd/yyyy hh:nn:ss" )
  PRINT Format$( Now, "m/d/yy h:n:s" )
  PRINT Format$( Now, "ddd dd mmm yyyy" )
  PRINT Format$( Now, "dddd dd mmmm yyyy" )
END

Die Ausgabe im Direktfenster mit deutscher Ländereinstellung schaut so aus:

11.12.2004 20:11:10
11.12.04 20:11:10
Fr 12 Nov 2004
Freitag 12 November 2004

Benutzerdefinierte Einzelbeispiele:

Befehl Ausgabe
PRINT Format$( Now, "mm/dd/yyyy hh:nn:ss" ) 04/15/2002 09:05:36
PRINT Format$( Now, "m/d/yy h:n:s" ) 4/15/02 9:5:36
PRINT Format$( Now, "ddd dd mmm yyyy" ) Mon Apr 15 2002
PRINT Format$( Now, "dddd dd mmmm yyyy" ) Monday April 15 2002

Problem mit Null Uhr Zeit rückwärts

[Bearbeiten]

Siehe dazu die Anmerkung von InselAX.

Orginaltext Mitteilung:

Ich habe auch noch ein anderes Problem gelöst. Es hat mit dem Datentyp "DATE" zu tun. Date ist nicht gleich Date! Das Problem trat auf als ich die aktuelle Uhrzeit, die in mein Eingabeformular übernommen wird und mit Hilfe eines Timers dort weiterläuft, (an Hand einer Konfigurationsdatei) auf GMT (Greenwich-Zeit; hier in Deutschland -1 Stunde bei Winterzeit; -2 Stunden bei Sommerzeit) umstellen wollte. Da hat mein Timer beim Wechsel von 23:59 auf 00:00 Uhr Ortszeit angefangen rückwärts zu laufen... warum auch immer...!?!?.

Die Lösung besteht darin, etwa folgendes zu schreiben:

DIM gmt AS Date
DIM ortszeit AS Date
DIM korrektur AS Date

ortszeit = Time(Now)
gmt = ortszeit - korrektur

(wobei korrektur Val("01:00:00") ist und 01:00:00 aus einer Datei kommt)

Wenn ich jetzt z.B. schreiben würde:

TextBoxZeit.Text = gmt

dann würde der Timer beim Wechsel rückwärts laufen und gegen 00:00 zählen, wobei er bei er bei 01:00:00 anfängt.

Problemlösung ist erst mal:

zeit = gmt + Val("00:00:00")

und dann

TextBoxZeit.Text = gmt

Problem mit Greenwich Time

[Bearbeiten]

Siehe dazu die Anmerkung von InselAX.

In einer GMT-TextBox läuft die Greenwich Zeit (hier in Deutschland Lokalzeit - 1 St.) Das funktionierte auch 23 Stunden lang. Für 1 Stunde von 00:00 Uhr bis 01:00 wurde zwar die korrekte Zeit in GMT angezeigt (23:00 bis 00:00), aber das Auslesen der Textbox brachte nur "00/00/00". Habe Benoit das Problem geschildert und er bat mich ihm meine Software zu schicken. Er schickte mir gestern einen Patch zurück....Ich hänge Dir ihn auch an. Es gab einen Bug in der Konvertierung von Float nach Date. Mit dem Patch funktioniert es. Du musst ihn in "./src/exec" (da wo Dein Gambas steckt....) kopieren und dann Gambas neu kompilieren.

Siehe: gbx_value.c

Gambas-Buch > Zeit und Datum > "Problem mit Null Uhr Zeit rückwärts" und "Problem mit Greenwich Time"

[Bearbeiten]

Das Problem liegt an der Art, wie in Date das Datum und die Uhrzeit gespeichert werden.
Date ist ein Clone des Datentyps Double mit einem eingegrenzten Wertebereich von -657434 bis 2958465,99998843
Dabei wird der ganzzahlige Teil als Datum interpretiert und ermöglicht ein Datum von "01.01.100"-"31.12.9999". Der Nachkommateil wird als Zeit interpretiert, wobei folgende Formel verwendet wird:

(Sekunden seit Mitternacht) / (24*60*60)

Folglich gilt:

0 <= Zeit < 1

Da die Zeit somit niemals negativ sein kann, wird ein negatives Vorzeichen ignoriert.

Wenn du jetzt Dein Programm im Gambas-Buch betrachtest, wird in der Festlegung der Ortszeit durch die Time-Funktion der Vorkommateil gelöscht. nach 0 Uhr erhält gmt einen negativen Wert (-1 Stunde) durch die Ignorierung des Vorzeichens wird dadurch 1 Uhr. In der folgenden Stunde (bis 0:59:59 Uhr) wird gmt mit Werten von -1 Stunde bis -1 Sekunde versorgt, die in "1:00:00" - "0:00:01" umgewandelt werden. Die Zeit läuft also nur scheinbar rückwärts.

DIM gmt AS Date
DIM ortszeit AS Date
DIM korrektur AS Date

ortszeit = Time(Now)
gmt = ortszeit - korrektur 'Korrectur="1:00:00"

Hier ist also ein Fehler im Programm! Du mußt dafür sorgen, daß gmt niemals negativ wird. Der Fehler liegt in der Position der Time-Funktion. Vergleiche dazu folgendes Programm:

DIM gmt AS Date
DIM heute AS Date
DIM korrektur AS Date

heute = Now
gmt = Time(heute - korrektur)

Hier wird der Vorkommateil(Datum) erst nach Abzug der Korrektur gelöscht. Folglich wird gmt nicht negativ und die Zeitberchnung funktioniert richtig. Das Programm läst sich noch weiter vereinfachen:

DIM gmt AS Date
DIM korrektur AS Date
 
gmt = Time(Now - korrektur)

Übrigens kannst Du auf die gleiche Art das korrigierte Datum abfragen:

datum = Int(Now - korrektur)

Es liegt somit kein Bug vor, es ist nur eine Frage der richtigen Programmierung! (und der genauen Kenntnis des Datentyps Date)-- InselAX 16:28, 15. Jun. 2008 (CEST)


Datum

[Bearbeiten]

Wichtige Befehle für das Datum sind date, weekday, now, format und format$

Interessant sind folgende Fragen:

  • Welcher Wochentag hat ein bestimmtes Datum? Siehe weekday Funktion
  • Wieviel Tage liegen zwischen 2 verschieden Datumsangaben?

Heute

[Bearbeiten]

Das heutige Datum und die aktuelle Zeit erhält man mit dem Befehl Now.

Beispiel:

PRINT Now

Ausgabe:

05/16/2002 22:31:30 
'so lang ist es schon her seit Benoit dies programmiert hat

Das folgende Miniprogramm gibt das heutige Datum in einer Textbox aus :

Siehe: prgheute.png

Hinter dem Befehl Heute steht folgender Code:

PUBLIC SUB Button1_Click()
  TextBox1.Text = "Heute ist der " & Str$(Now) 
END

Anmerkung für VB6-Programme: In VB6 muß Str$ durch CStr ersetzt werden -- InselAX 17:58, 17. Jun. 2008 (CEST)

Beispiel 2:

Der Befehl Date verkürzt die Zeit- und Datumsausgabe auf die reine Datumsangabe. Probieren Sie dazu folgendes Programm. Sie brauchen nur eine leere Form, um es zu starten.

PUBLIC SUB Form_Open()
  PRINT Now
  PRINT Date(Now)
END

Da das Datum im Datentyp 'Date' ald ganzzahliger Teil gespeichert wird kann man Date(Now) auch durch Int(Now) ersetzen.-- InselAX 17:59, 17. Jun. 2008 (CEST)

Anmerkung für VB6-Programme: In VB6 muß Date durch DateValue ersetzt werden -- InselAX 17:58, 17. Jun. 2008 (CEST)

Wochentag

[Bearbeiten]

Beispielprogramm:

Es gibt den Wochentag des heutigen Tages aus. Das Programm funktioniert im Terminalmodus:

STATIC PUBLIC SUB Main()
  PRINT WeekDay(Now)
  PRINT "Heute ist ";
  IF WeekDay(Now) = 1 THEN PRINT "Montag" 
  IF WeekDay(Now) = 2 THEN PRINT "Dienstag" 
  IF WeekDay(Now) = 3 THEN PRINT "Mittwoch" 
  IF WeekDay(Now) = 4 THEN PRINT "Donnerstag" 
  IF WeekDay(Now) = 5 THEN PRINT "Freitag" 
  IF WeekDay(Now) = 6 THEN PRINT "Samstag" 
  IF WeekDay(Now) = 7 THEN PRINT "Sonntag" 
END

Das Programm nutzt den Befehl Weekday und den Befehl Now von Gambas.

Das Programm geht davon aus, daß der Montag der erste Tag der Woche ist. In VB6 hat Weekday einen weiteren (optionalen) Parameter, der den ersten Tag der Woche angibt (1=So 2=Mo 3=Di 4=Mi 5=Do 6=Fr 7=Sa), wobei Sonntag die Voreinstellung ist. Damit das Programm in VB6 korrekt funktioniert, muß jedes 'WeekDay(Now)' durch WeekDay(Now,2) ersetzt werden.

Alternativ kann man den Wochentag auch mit dee Format-Anweisung anzeigen. Format(Now,"ddd") für den auf 2 Buchstaben abgekürzten Wochentag und Format(Now,"dddd") für den ausgeschriebenen Wochentag.-- InselAX 18:23, 17. Jun. 2008 (CEST)

Schaltjahr

[Bearbeiten]

Das folgende Beispielprogramm berechnet für eine Jahreseingabe, ob das Jahr ein Schaltjahr ist. In einem Schaltjahr gibt es einen 29. Februar.

Hinter dem Befehl Ist das Jahr ein Schaltjahr? steht folgender Code:

PUBLIC SUB Button1_Click()
  DIM leapyear AS String

  'keine Eingabe
  IF TextBox1.Text = "" THEN
    TextBox2.Text = "Es wurde keine Jahreszahl angegeben!"
    RETURN
  ENDIF

  'Eingabe keine Zahl oder Zahl mit Punkt (z.B. 1234.5)
  IF NOT IsInteger(Val(TextBox1.Text)) OR TextBox1.Text LIKE "*.*" THEN
    TextBox2.Text = "\"" & TextBox1.Text & "\" ist keine Jahreszahl!"
    RETURN
  ENDIF

  IF Val(TextBox1.Text) MOD 400 = 0 THEN
    leapyear = " ist ein Schaltjahr."
  ELSE IF Val(TextBox1.Text) MOD 100 = 0 THEN
    leapyear = " ist eine Jahrhundertwende, aber kein Schaltjahr."
  ELSE IF Val(TextBox1.Text) MOD 4 = 0 THEN 
    leapyear = " ist ein Schaltjahr."
  ELSE
    leapyear = " ist kein Schaltjahr."
  ENDIF
 
  TextBox2.Text = "Das Jahr " & Val(TextBox1.Text) & leapyear 
END 

Wikipedia bietet weiterführende Informationen zum Thema Schaltjahr.

IsDate

[Bearbeiten]

Die IsDate-Funktion liefert einen Wert TRUE oder FALSE, der anzeigt, ob eine Variable vom Datumstyp ist als ein gültiges Datum interpretiert werden kann. Damit ist beispielsweise auch eine Überprüfung auf Schaltjahr möglich.
IsDate("29.2.2008")=True
IsDate("29.2.2009")=False
-- InselAX 18:46, 17. Jun. 2008 (CEST)

Syntax: IsDate(Variant)

CDate

[Bearbeiten]

Die CDate-Funktion wandelt einen Ausdruck in einen Datums-Datentyp um.

Syntax: CDate(Ausdruck)

Das Argument Ausdruck muss ein Zeichenfolgenausdruck oder ein numerischer Ausdruck sein, der als Datum interpretiert werden kann. Erlaubte Werte für Dateninformationen sind die Werte vom 1. Januar 100 (-657434) bis zum 31. Dezember 9999 (2958465). Der Tag 0 ist dabei der 30.12.1899. Dieser Tag ist mit CDate nicht zu erreichen, da CDate 0 als Uhrzeit ohne Datum interpretiert.-- InselAX 19:11, 17. Jun. 2008 (CEST)

Die Year-Funktion liefert eine Ganzzahl (Integer) aus dem Bereich von 100 bis 9999, die das Jahr in einem als Argument eingegebenen Datum darstellt.

Syntax: Year(Datum)

Anmerkungen: Das Datum-Argument ist ein beliebiger numerischer oder Zeichenfolgen-Ausdruck, der ein Datum und/oder eine Uhrzeit vom 1. Januar 100 bis zum 31. Dezember 9999 darstellen kann, wobei der 1. Januar 1900 gleich 2 ist. Zahlen links vom Dezimalzeichen in Datum stehen für das Datum, Zahlen rechts davon stehen für die Uhrzeit. Negative Zahlen stehen für Datumsangaben vor dem 30. Dezember 1899.

Weist Datum den Wert Null auf, dann liefert die Year-Funktion auch den Wert Null.

Fragen

[Bearbeiten]

Gibt es in Gambas eine Befehl mit dem man das Datum verändern kann? (In Freebasic gibt es dazu den Befehl SETDATE: SETDATE month$ + "-" + day$ + "-" + year$)

Gibt es in Gambas einen Befehl mit dem man die Uhrzeit verändern kann? (In Freebasic gibt es dazu den Befehl SETTIME)

Unter Linux gehören Datum und Uhrzeit zu den „hoheitlichen“ Aufgaben, nur Benutzer bzw. Programme mit root-Rechten können sie ändern. Entsprechende Gambas-Befehle wären also unter Linux nutzlos.

Gibt es einen Befehl zur Zeitmessung?

Siehe oben: Timer-Funktion


Zur Soundprogrammierung braucht man die Datei gb.sdl und natürlich eine funktionierende Soundkarte, die in Linux eingebunden ist. Siehe zB http://www.binara.com/gambas-wiki/bin/view/Gambas/GbSdl Siehe auch: http://www.binara.com/gambas-wiki/bin/view/Gambas/FutureSDLComponent

Zum Thema Sound in Gambas gibt es ein ganz gutes Beispiel : In den Beispielen die mit Gambas geliefert werden ist ein MusicPlayer im Quelltext dabei. zb

' Gambas class file 
 
STATIC PRIVATE $bDoNotMove AS Boolean 
 
PUBLIC SUB btnOpen_Click() 
 
  IF Dialog.OpenFile() THEN RETURN 
 
  lblTitle.Text = File.Name(Dialog.Path) 
  ' Approximation... 
  sldPos.MaxValue = 600 
 
  Music.Load(Dialog.Path) 
  btnPlay_Click 
 
END 
 
PUBLIC SUB btnPlay_Click() 
 
  timMusic.Enabled = TRUE 
  Music.Play 
 
END 
 
PUBLIC SUB btnPause_Click() 
 
  Music.Pause 
 
END 
 
PUBLIC SUB btnStop_Click() 
 
  Music.Stop 
  timMusic.Enabled = FALSE 
  lblPos.Text = "" 
  sldPos.Value = 0 
 
END 
 
PUBLIC SUB timMusic_Timer() 
 
  DIM iPos AS Integer 
  DIM iVal AS Integer 
  DIM sPos AS String 
  DIM iInd AS Integer 
 
  iPos = Music.Pos 
 
  IF NOT $bDoNotMove THEN 
    Object.Lock(sldPos) 
    IF iPos > sldPos.MaxValue THEN 
      sldPos.MaxValue = sldPos.MaxValue * 2 
    ENDIF 
    sldPos.Value = iPos 
    Object.Unlock(sldPos) 
  ENDIF 
 
  FOR iInd = 0 TO 2 
 
    iVal = iPos MOD 60 
    iPos = iPos \ 60 
    IF iInd THEN 
      sPos = Format(iVal, "00") & ":" & sPos 
    ELSE 
      sPos = Format(iVal, "00") 
    ENDIF 
 
  NEXT 
 
  lblPos.Text = sPos 
 
END 
 
PUBLIC SUB sldPos_Change() 
 
  Music.Pos = sldPos.Value 
 
END 
 
PUBLIC SUB sldPos_MouseDown() 
 
  $bDoNotMove = TRUE 
 
END 
 
PUBLIC SUB sldPos_MouseUp() 
 
  $bDoNotMove = FALSE 
 
END 
 
PUBLIC SUB sldVolume_Change() 
 
  Music.Volume = 1 - sldVolume.Value / sldVolume.MaxValue 
 
END


Mit Gambas 2 können Sie Bilder von Webcameras oder TV Karten speichern und weiterbearbeiten. Voraussetzung ist, dass es sich um v4l (video for linux) Geräte handelt.

Die "VideoDevice" Klasse erlaubt die Steuerung des Gerätes, die Abspeicherung eines Bildes in einer Datei und sie unterstützt die Gambas stream-Schnittstelle mit ihren üblichen Befehlen (READ, SEEK, FLUSH usw.).

Siehe http://gambas.gnulinex.org/v4l/


Datei speichern

[Bearbeiten]

Im folgenden Beispielprogramm wird der Text einer Textarea in einer Datei auf der Festplatte gespeichert. Das Ganze erfolgt über den Standarddialog. Sie brauchen eine Textarea und einen Commandbutton um das Programm in Gang zu bringen.

Beispiel:

PUBLIC SUB Form_Open()
 Textarea1.Text = "Dies ist ein Test"
END
PUBLIC SUB Button1_Click()
 Dialog.SaveFile() 
 File.Save(Dialog.Path, TextArea1.Text)
 CATCH 
 IF ERROR THEN RETURN
END

Datei speichern ohne Dialog

[Bearbeiten]

Sie können eine Datei auch ohne Standarddialog speichern. Dann müssen Sie allerdings den Pfad und den Dateinamen im Programm angeben. Wie das geht, zeigt folgendes Beispiel. Sie brauchen eine Textarea und einen Commandbutton um es in Gang zu bringen.

Programm:


PUBLIC SUB Form_Open()
Textarea1.Text = "Dies ist ein Test"
END
PUBLIC SUB Button1_Click()
File.Save(system.Home & "/test.txt",TextArea1.Text)
File.Save(User.Home & "/test.txt",TextAreal1.Text) ' Gambas 3.8.4
CATCH 
IF ERROR THEN RETURN
END

Mit dem Befehl system.home wird das aktuelle Benutzerverzeichnis gewählt zb /home/ihrname.

Überprüfen Sie - am besten mit dem Konqueror oder mit der Konsole- , ob die Datei auch wirklich gespeichert wurde. Probieren Sie aus, was passiert wenn Sie die Fehlerroutine mit Catch weglassen. ( Das macht solange nichts, solange die Pfadangabe korrekt ist. Ist die Pfadangabe falsch, dann gibt es eine Fehlermeldung: File or directory does not exist.) Probieren Sie aus, was passiert wenn die Datei, in die gespeichert werden soll, schon existiert. ( Die existierende Datei wird ohne Rücksicht auf Verluste überschrieben.) Probieren Sie aus, was passiert, wenn die Pfadangabe falsch ist. ( Es kommt zu keiner Fehlermeldung, solange die Fehlerroutine mit Catch eingebaut ist !!)

Programmvariante: Nur ein Commandbutton ist nötig.

PUBLIC SUB Button1_Click()
File.Save(system.Home & "/test.txt","Dies ist ihr Text")
File.Save(User.Home & "/test.txt","Dies ist ihr Text") ' Gambas 3.8.4
CATCH 
IF ERROR THEN RETURN
END

Datei laden 1

[Bearbeiten]

Auf den meisten Linuxsystemen findet sich die Datei passwd. Diese wollen wir in eine Textarea laden

Dazu muß man wissen, wo die Datei steht: Sie steht im Verzeichnis: /etc

Für das Programm brauchen Sie:

  • eine Form
  • eine Textarea

Code:

PUBLIC SUB Form_Open()
s AS String
s = File.Load("/etc/passwd")
'Die Datei muss existieren, 
'sonst kann sie nicht geladen werden. 
textarea1.Text = s
END

Wie Sie sehen stehen in der Datei die Passwörter aller angemeldeten Benutzer Ihres Linuxsystems. Diese Datei ist lesbar aber schreibgeschützt.

Datei laden 2

[Bearbeiten]

Wenn Sie im Abschnitt Datei speichern die Datei test.txt in ihrem Homeverzeichnis gespeichert haben, können Sie sich diese wieder problemlos laden:

PUBLIC SUB Button1_Click()
DIM sLine AS String
sLine = File.Load(system.home & "/test.txt")
sLine = File.Load(User.Home & "/test.txt") ' Gambas 3.8.4
PRINT sLine
END

Weiteres Beispiel:

Sie haben eine Datei Datei.text in Ihrem Verzeichnis und wollen diese Datei in Gambas laden:

Wie das geht zeigt das folgende Beispiel:


PUBLIC SUB Button1_Click()
DIM sLine AS String
sLine = File.Load("Datei.text")
'Die Datei muss existieren, 
'sonst kann sie nicht geladen werden. 
PRINT sLine
END

Sie brauchen eine Form mit einem Commandbutton. Die Ausgabe erfolgt im Direktfenster. Um das Programm in Gang zubringen, müssen Sie erst mit einem Editor die Datei Datei.text erstellen. Dann speichern Sie die Datei in ihrem Gambas Projektverzeichnis ab. Bei mir steht die Datei zb in dem Verzeichnis :

file:/home/rhoff/gambas-1.0/laden2/

Datei laden mit Standarddialog

[Bearbeiten]

Mit dem Standarddialog kann man Pfad und Dateiname beim Laden wählen.

Für das Beispiel brauchen Sie eine Form , einen Commandbutton, ein Labelfeld und eine Textarea.

PUBLIC SUB Button1_Click()
 IF Dialog.OpenFile() THEN RETURN
 Label1.Text = Dialog.Path
 TextArea1.Text = File.Load(Dialog.Path)
END

Datei laden und speichern mit Addyplus

[Bearbeiten]

In einem kleinen Anwendungsprogramm soll gezeigt werden wie man eine Zahlenkolonne laden und speichern kann. Dazu wird das kleine Summierprogramm Addy erweitert und zu Addyplus umfunktioniert.

Siehe auch http://de.wikibooks.org/wiki/Gambas:_Rechnen#Addy_der_Summierer

So schaut die Form jetzt aus:

Sie brauchen also

  • eine Textarea
  • eine Textbox
  • und 5 Befehlsknöpfe auf Ihrer Form, um das Programm zu starten.

So schaut der Code aus:

PUBLIC SUB Form_Open()
 ME.Text = "Addy, der Summierer"
 Textarea1.Text = ""
 Textbox1.Text = ""
END
PUBLIC SUB Button1_Click()
 DIM text AS String
 DIM summe AS Float
 DIM liste AS String[]
 DIM posten AS String
 text = textarea1.Text
 liste = Split(text,Chr(10))
 FOR EACH posten IN liste
  summe = summe + Val(posten)
 NEXT
 textbox1.Text = summe
 CATCH 
 Message.Info("Bitte in der letzten Zeile kein Return eingeben ! Drücken Sie die Rücktaste!")
END
PUBLIC SUB Button3_Click()
 Dialog.SaveFile() 
 File.Save(Dialog.Path, TextArea1.Text)
CATCH  
IF ERROR THEN RETURN
END
PUBLIC SUB Button2_Click()
IF Dialog.OpenFile() THEN RETURN
TextArea1.Text = File.Load(Dialog.Path)
END
PUBLIC SUB Button4_Click()
SELECT Message.Question("Vorsicht! Das Textfeld wird gelöscht.","Abbrechen","Löschen")
   CASE 1
     RETURN
   CASE 2
     Textarea1.Text =""
 END SELECT
END
PUBLIC SUB Button5_Click()
ME.CLose 
END

Geben Sie in die Textarea irgendeine Zahlenreihe ein, beispielsweise

1
2
3

Dann drücken Sie auf Speichern. Geben Sie einen Dateiname ein zb s1 und speichern sie die erste Zahlenreihe ab.

Dir Befehl

[Bearbeiten]

File name array = Dir ( Directory [ , File pattern ] )

Dieser Befehl gibt einen String Array zurück, der die Namen der Dateien des Verzeichnisses enthält, welches mit File pattern übereinstimmt. Falls kein File pattern spezifiziert wurde , dann werden alle Dateien ins Array geladen. File pattern kann dieselben allgemeinen Zeichen enthalten wie der LIKE Befehl.

Beispiel:

PUBLIC SUB Form_Open()
DIM File AS String
FOR EACH File IN Dir(system.home, "*")
FOR EACH File IN Dir(User.Home,"*") ' Gambas 3.8.4
  PRINT File
NEXT  
END

In diesem Beispiel werden alle Dateien im Home Verzeichnis des aktuellen Benutzers im Direktfenster ausgegeben. Dabei werden allerdings auch die Unterverzeichnisse als Dateien gehandhabt.


Beispiel

' Print a directory
SUB PrintDirectory(Directory AS String)
  File AS String
  FOR EACH File IN Dir(Directory, "*.*")
   PRINT File
 NEXT  
END

Beispielvariante : Sie brauchen eine Form mit einem Button auf der Form. Fügen Sie in das Programm statt /home/rho/gambastext/ ein existierendes Verzeichnis auf Ihrem PC ein.

' Gambas class file
PUBLIC SUB Button1_Click()
 PrintDirectory ("/home/rho/gambastext/")
END
SUB PrintDirectory(Directory AS String)
  DIM File AS String
 FOR EACH File IN Dir(Directory, "*.*")
   PRINT File
 NEXT  
END

Neues Verzeichnis anlegen

[Bearbeiten]

Mit dem Befehl MakeDir kann man ein neues Verzeichnis anlegen. Vorsicht: Es klappt nur,

  • wenn Sie einen korrekten Pfad eingegeben haben,
  • wenn Sie die Schreibberechtigung für diesen Pfad haben
  • wenn Sie nicht in das Verzeichnis des offenen Gambasprojektes ein neues Verzeichnis schreiben wollen. ( siehe Application.Name)
  • keine Datei gleichen Namens in diesem Pfad existiert.

Beispiel:

Sie brauchen einen Befehlsbutton, um das Programm in Gang zu bringen:

PUBLIC SUB Button1_Click()
 MKDIR system.home & "/test"
 MKDIR User.Home & "/test" ' Gambas 3.8.4
END

system.home gibt dabei das aktuelle Nutzerverzeichnis /home/zbihrname an.

Schauen Sie mit dem Konqueror nach, ob das Verzeichnis wirklich angelegt wurde.

Am besten fügt man eine Fehlerroutine ein, für den Fall das der Pfad schon existiert oder kein Schreibzugriff besteht.

Datei kopieren

[Bearbeiten]

Der COPY Befehl kopiert eine Datei von einem Verzeichnis in ein anderes.

COPY Quellverzeichnis/Datei TO Zielverzeichnis/Datei

Obiger Befehl kopiert eine Datei aus dem Quellverzeichnis in das Zielverzeichnis. Dabei braucht die Datei nicht unbedingt denselben Namen zu haben, wie die Zieldatei. Unterverzeichnisse werden dabei allerdings nicht kopiert. (Note that you cannot copy directories recursively with this function. )

Beispiel:

' Sichert die versteckte Gambaskonfigurationsdatei 
' Das Verzeichnis muß vorhanden sein
' und man muß den Zugriff darauf haben 
COPY system.name & "/.gambas/gambas.conf" TO system.name & "/gambas.conf.save"

System.name entspricht dabei ihrem Homeverzeichnis.

Das Beispiel ergibt eine Fehlermeldung, wenn :

  • Das Verzeichnis nicht vorhanden ist
  • Kein Schreibzugriff auf das Verzeichnis existiert
  • Die Zieldatei schon vorhanden ist.

Beispiel2:

Sie brauchen einen Befehlsbutton auf Ihrer Form, um das Beispiel zu starten.

PUBLIC SUB Button1_Click()
 COPY "/home/ihrname/.gambas/gambas.conf" TO "/home/ihrname/test/gambas.conf.save"
END

Wenn man mehrere Dateien auf einmal kopieren will, hilft einem der Dir Befehl. Siehe http://de.wikibooks.org/wiki/Gambas:_Datei

Wie Verzeichnisse kopiert oder verschoben werden können ist hier [[1]] beschrieben

Wie kann man das Home Verzeichnis des aktuellen Benutzers abfragen ?

[Bearbeiten]

Der Befehl Application.home funktioniert dazu nicht mehr. Der Befehl Application.Name ergibt den Pfad des Programmes , welches gerade läuft, aber nicht das Homeverzeichnis.

Das Homeverzeichnis des aktuellen Benutzers erhält man mit dem Befehl system.home in Gambas 2 funktioniert auch dieser Befehl nicht mehr. Hiefür muss nun die 'User' Klasse hergenommen werden. Also lautet der Befehl: user.home

Beispiel1

PUBLIC SUB Form_Open()
PRINT system.Home
END

Beispiel2:

PUBLIC SUB Form_Open()
ME.Text = "Systeminfo"
 textarea1.text = "Charset = " & system.Charset & Chr(13) & Chr(10)
 textarea1.text = textarea1.text & "Domain = " & system.Domain & Chr(13) & Chr(10)
 textarea1.text = textarea1.text & "Homeverzeichnis = " & system.Home & Chr(13) & Chr(10)
 textarea1.text = textarea1.text & "Host = " & system.Host & Chr(13) & Chr(10)
 textarea1.text = textarea1.text & "Sprache = " & system.Language & Chr(13) & Chr(10)
 textarea1.text = textarea1.text & "Pfad = " & system.path & Chr(13) & Chr(10)
 textarea1.text = textarea1.text & "Benutzer = " & system.User 
' PRINT system.Charset
' PRINT system.Domain
' PRINT system.Home
' PRINT system.Host
' PRINT system.Language
' PRINT system.Path
' PRINT system.User
END
PUBLIC SUB Button1_Click()
  ME.Close
END

Man braucht eine Textarea und einen Befehlsbutton, um das Programm zu starten.

Beispiel3

PUBLIC SUB Form_Open()
PRINT user.Home
END

Existiert eine Datei ?

[Bearbeiten]

Im folgenden Beispiel wird überprüft, ob die Bash vorhanden ist oder nicht.

Beispiel:

PUBLIC SUB Button1_Click()
 IF Exist("/bin/bash") = TRUE THEN
 Label1.Text="Bash ist vorhanden"
END IF
IF Exist("/bin/bash") = FALSE THEN
 Label1.Text="Fehler: Bash ist nicht vorhanden"
END IF
END

Sie brauchen einen Befehlsbutton und ein Labelfeld, um das Programm in Gang zu bringen.

Ähnlich funktioniert:

GB.ExistFile(file_name)

Datei laden und speichern in einem kleinen kombinierten Programm

[Bearbeiten]

Im folgenden Programm wird eine Datei test.txt geladen und gespeichert.

So schaut das fertige Programm aus:

Sie brauchen also:

  • Eine Form
  • Eine Textbox
  • 5 Befehlsbuttons

Der Code schaut so aus:

PUBLIC SUB Form_Open()
  Textbox1.Text = "Dies ist ein Test"
END
PUBLIC SUB Button1_Click()
'Gespeichert wird im Dialog d.h es sind auch andere Dateinamen möglich
Dialog.SaveFile() 
File.Save(Dialog.Path, TextBox1.Text)
'File.Save("test.txt",TextBox1.Text)
'test.txt muss schon vorhanden sein
'sonst gibt es eine Fehlermeldung.
END
PUBLIC SUB Button2_Click()
'Geladen wird ohne Dialog
IF Exist("test.txt") THEN Textbox1.Text = File.Load("test.txt")
'test.txt muss vorhanden sein! 
END
PUBLIC SUB Button3_Click()
'Textbox wird gelöscht
  Textbox1.Text =""
END
PUBLIC SUB Button4_Click()
'Programmende
  ME.Close
END
PUBLIC SUB Button5_Click()
'Zufallstext erzeugen
DIM Z AS Integer
DIM Buchstabe AS String
Randomize()
Textbox1.Text = ""
FOR Z = 1 TO 10 
 Buchstabe = Chr$(Int(Rnd(65,91))) 
 TextBox1.Text = TextBox1.Text & Buchstabe
NEXT 
END

Datei schreiben mit WRITE

[Bearbeiten]

Man schreibt in einer Datei wie auch in Basic Sprache üblich ist:

  Dim hFile As File
    hFile = Open application.path & "/blabla.txt " For Write Append 
     Write #hFile, "Hallo Welt"
    Close #hFile 

Wird "For Write" mit "Append" angegeben muss eine Datei "blabla.txt vorhanden sein. Wird "For Write" ohne "Append" angegeben wird eine neue Datei "blabla.txt erzeugt.

Daten einlesen mit READ

[Bearbeiten]

Der READ befehl liest Daten aus den verschiedensten Quellen in den Computer ein. Am einfachsten läßt er sich erklären, wenn man eine Datei von der Festplatte in die Anzeige lädt. Wie das geht zeigt folgendes Programm.

Sie brauchen dazu:

  • eine Form
  • einen Befehlsbutton

Der Code dazu lautet folgendermaßen:

PUBLIC SUB Form_Open()
 Button1.Text = "Read test.txt"
'Der Befehlsbutton1 wird umbenannt
File.Save(application.path & "/test.txt","Dies ist ein Test")
'Es wird eine Testdatei im aktuellen Verzeichnis angelegt und gespeichert
CATCH 
'Mögliche Fehler abfangen
IF ERROR THEN RETURN
END
PUBLIC SUB Button1_Click()
'Die Testdatei wird bitweise eingelesen und wieder zusammengeklebt
 hFile AS File
 s AS String
 OPEN "test.txt" FOR READ AS #hFile
 WHILE NOT Eof(hFile)
   LINE INPUT #hFile, s
   PRINT s
   'Ausgabe im Direktfenster
 WEND
FINALLY ' Immer ausführen, auch bei einem Fehler
CLOSE #hFile
CATCH 
' Nur bei einem Fehler ausführen
 PRINT "Die Datei test.txt kann nicht ausgegeben werden.."
END

Dieses Programm speichert einen eingegebenen Namen in einer Datei ab.

Beim nächsten Programmstart wird man dann mit diesem Namen begrüßt.


Sie benötigen dazu:

  • 1 Form
  • 2 Text Label
  • 1 Eingabefeld
  • 1 Commandbutton


' Gambas class file

PUBLIC SUB Button1_Click()

  settings["Name"] = Eingabefeld.Text 
  Settings.Save
  
END

PUBLIC SUB Form_Open()

 TextLabel2.Text = "Hallo "&settings["Name", "No Name"]&"!"

END


So sieht das gestartete Programm dann aus:



Standarddialoge

[Bearbeiten]

Standarddialoge erleichtern die Programmierarbeit:

Im folgenden Beispielprogramm werden Standarddialoge für die Wahl

  • der Schriftart
  • der Farbe
  • des Dateinamens
  • des Dateipfades

benutzt.

Man braucht 1 Textarea und 3 Commandbuttons um das Programm in Gang zu bringen.

PUBLIC SUB Button1_Click()
 IF Dialog.SelectFont() THEN RETURN
 Textarea1.Font = Dialog.Font
END
PUBLIC SUB Button2_Click()
 IF Dialog.SelectColor() THEN RETURN
 Textarea1.BackColor = Dialog.Color
END
PUBLIC SUB Button3_Click()
Dialog.SaveFile() 
File.Save(Dialog.Path, TextArea1.Text)
CATCH 
IF ERROR THEN RETURN
END

Im folgenden Beispielprogramm wird der Standarddialog zur Verzeichnisauswahl verwendet. Das ausgewählte Verzeichnis wird in die Textbox gestellt. Es wird ein Button und eine Textbox verwendet.

PUBLIC SUB Button1_Click()
  Dialog.SelectDirectory() 
  textbox1.Text = dialog.Path
  CATCH 
  IF ERROR THEN RETURN
END

Theorie

[Bearbeiten]

Diese Klasse Dialog enthält statische Methoden um Standarddialoge aufzurufen. Sie steht in der GB.QT Komponente.

Eigenschaften

Color  Filter  Font  Path  Title  

Methoden

OpenFile  SaveFile  SelectColor  SelectDirectory  SelectFont  

Größe eines Dialogwindows ändern

[Bearbeiten]

In einen Dialogfenster kann man die Größe des Fensters nicht einfach so ändern

dlgDialog.Height = neuerWert..

Dazu muß man folgenden Weg wählen: Window.Border zu Window.Resizable ändern. Dann kann man die Größe ändern. Dann muß man wieder Window.Border zu Window.Fixed zurückändern. Etwas umständlich, aber so funktioniert es.


Selbstverständlich ist es auch unter Gambas möglich, eine Menüführung zu programmieren, denn eine Befehlseingabe über Menüs macht ein Programm oft übersichtlicher und leichter bedienbar.

Erstes Menü

[Bearbeiten]

Für unser erstes Menü beginnen wir mit einer leeren Form. Im Formfenster klicken wir mit der rechten Maustaste und wählen aus dem dort erscheinenden Kontextmenü den Punkt Menüeditor... oder drücken die Tastenkombination Strg + E.

Der Gambas Menüeditor
  • Ein Klick auf die Taste Einfügen erzeugt einen neuen Menüeintrag
  • Der Menüeditor zeigt jetzt unter dem großen weißen Übersichtsfeld weiter unten mehrere Textboxen an (Name, Gruppe, Caption, Tag)
  • Bei Name geben wir dem Menüpunkt einen Namen: mnuFile unter dem wir ihn innerhalb des Programms ansprechen können
  • und bei Caption geben wir eine Beschriftung ein: Datei

Mit den Befehlsfeldern Nächste und Einfügen kann man jetzt jeweils neue Menüpunkte erzeugen. Wenn man dabei den Eintrag Caption leer lässt, wird statt eines Menüpunktes eine Trennlinie erzeugt.

Untermenüs

[Bearbeiten]

Jetzt müssen wir noch festlegen, dass die weiteren Menüpunkte keine eigenen Menüs sind, sondern Untermenüs des ersten Eintrags. Dazu drücken wir die Taste mit dem Pfeil nach rechts. Oben im Menüeditor werden jetzt drei Punkte ... vor der Bezeichnung des Eintrags angezeigt.

Durch mehrmaliges drücken dieser Taste können dann entsprechend auch Unteruntermenüs, Unterunteruntermenüs, usw. erzeugt werden.

Wenn wir dann alle fünf Menüeinträge angelegt haben, können wird den Menüeditor mit OK beenden.

Codeeingabe

[Bearbeiten]

Als letztes müssen wir noch den Programmcode eingeben, der beim Anklicken eines Menüpunktes ausgeführt werden soll. Dass ist aber nicht weiter schwer, da sich ein angeklickter Menüeintrag wie ein angeklickter Button verhält.

Wir geben im Codefenster einfach den folgenden Code ein:

PUBLIC SUB mnuClose_Click()
  ME.Close
END

Jetzt können wir unser Programm mit F5 starten und das Menü testen. Beim Klick auf Schließen wird das Formular geschlossen.

Unser erstes Menü

Optionsmenü

[Bearbeiten]

Ein Optionsmenü ist ein Menüpunkt, der wie eine CheckBox zwischen zwei Zuständen hin und her geschaltet werden kann. Um dies in unserem Programm zu realisieren benutzen wir die Checked-Eigenschaft des Menüpunktes.

Nehmen wir an, wir haben ein Programm, das eine Reihe von Daten ausgibt und wir wollen dem Benutzer die Möglichkeit geben, sich die Daten auch sortiert ausgeben zu lassen. Dazu erzeugen wir im Menüeditor zunächst einen neuen Hauptmenüpunkt mnuData mit der Beschriftung Daten und einen Untermenüpunkt mnuSorted mit der Beschriftung Sortiert.

Schließlich benötigen wir noch den folgenden Programmcode:

PUBLIC SUB mnuSorted_Click()
  'Wert umschalten
  mnuSorted.Checked = NOT mnuSorted.Checked
  
  IF mnuSorted.Checked = TRUE THEN
    PRINT "Sortierung an"
  ELSE
    PRINT "Sortierung aus"
  ENDIF
END

Wird nun dieser Menüeintrag aufgerufen, dann schaltet der Befehl in der dritten Zeile den Wert der Checked-Eigenschaft jeweils um. In der fünften Zeile ist zu sehen, wie wir den aktuellen Zustand des Menüpunktes im restlichen Programm auswerten können.

Ein Optionsmenü

Dynamisches Menü

[Bearbeiten]

Wenn man im Gambas-Projektfenster das Menü Datei und dann den Punkt Zuletzt geöffnet anwählt, erscheint ein Menü mit den Projekten, an denen man zuletzt gearbeitet hat. Aus offensichtlichen Gründen ist es nicht möglich, derartige Menüs schon zur Programmierzeit im Menüeditor zu erstellen, sondern sie müssen zur Laufzeit des Programms dynamisch erzeugt werden.

Dazu erzeugen wir im Menüeditor zunächst unterhalb des Öffnen...-Eintrags ein neues Untermenü mnuRecent mit der Beschriftung Zuletzt geöffnet. Dann ergänzen wir unser Programm noch um den folgenden Programmcode:

$aRecent AS NEW String[]

PUBLIC SUB Form_Open()
  'Beispieldaten
  $aRecent = ["Datei12","Datei34","Datei56","Datei78","Datei90"]
  
  'Menü erzeugen
  UpdateMenu
END

SUB UpdateMenu()
  DIM sFile AS String
  DIM hMenuItem AS Object
  
  'Die alten Einträge löschen
  mnuRecent.Children.Clear
  
  'Deaktivieren, falls keine Einträge vorhanden sind
  IF $aRecent.Length = 0 THEN mnuRecent.Enabled = FALSE
  
  'Die einzelnen Einträge erzeugen
  FOR EACH sFile IN $aRecent
    'neuer Eintrag
    hMenuItem = NEW Menu(mnuRecent) AS "mnuRecentFile"

    'Beschriftung
    hMenuItem.Text = sFile
  NEXT
END

PUBLIC SUB mnuRecentFile_Click()
  PRINT LAST.Text
END

Die von uns erzeugten Einträge haben dann alle den gleichen Namen mnuRecentFile. Damit wir innerhalb der Funktion mnuRecentFile_Click() unterscheiden können welcher der Einträge angeklickt wurde, verwenden wir das LAST-Objekt. LAST ist eine Referenz auf das letzte Objekt, welches ein Ereignis (hier das Click()-Ereignis) ausgelöst hat. Mit LAST.Text greifen wir also auf die Text-Eigenschaft des zuletzt angeklickten Eintrags zu.

Ein dynamisches Menü

Kontextmenü

[Bearbeiten]

In vielen Programmen erscheint nach einem Klick mit der rechten Maustaste ein Kontextmenü. Im folgenden wollen wir in unserem Gambasprogramm ein Steuerelement mit einem einfachen Kontextmenü versehen.

Dazu platzieren wir auf der Form einen Button und ergänzen den folgenden Programmcode:

PUBLIC SUB Button1_MouseDown()
  DIM hContext AS Object
  DIM hMenuItem AS Object

  IF Mouse.Right = TRUE THEN
    'Das Kontextmenü selbst erzeugen
    hContext = NEW Menu(ME) AS "mnuContext"
    
    'Die einzelnen Menüeinträge erzeugen
    hMenuItem = NEW Menu(hContext) AS "mnuRot"
    hMenuItem.Text = "Rot"
    hMenuItem = NEW Menu(hContext) AS "mnuBlau"
    hMenuItem.Text = "Blau"
    hMenuItem = NEW Menu(hContext) AS "mnuGruen"
    hMenuItem.Text = "Grün"
    
    'Das Menü anzeigen
    hContext.Popup
  ENDIF
END

PUBLIC SUB mnuRot_Click()
  Button1.Background = Color.Red
END

PUBLIC SUB mnuBlau_Click()
  Button1.Background = Color.Blue
END

PUBLIC SUB mnuGruen_Click()
  Button1.Background = Color.Green
END

Wenn man auf einem Steuerelement eine Maustaste drückt, wird die zugehörige MouseDown()-Funktion aufgerufen. Innerhalb derer müssen wir dann noch prüfen, ob die rechte Maustaste gedrückt wurde. Falls dem so ist, erzeugen wir das Menü und zeigen es an.

Ein Kontextmenü


Vorsicht ! In diesem Abschnitt ist noch einiges in Arbeit !!

Datenbankprogrammierung nur mit Gambas

[Bearbeiten]

Für das Anlegen einer simplen Adress- und Telefonnummerdatenbank brauchen Sie kein mysql. Probieren Sie es einfach Schritt für Schritt ohne mysql.

Fangen wir mit einer ganz simplen Tabelle an

1 Eins
2 Zwei 

Sie soll abzuspeichern und zu verändern und zu verlängern sein. Sonst brauchen wir erst einmal keine weiteren Funktionen.

Das Ganze kann man als Stringarray machen und in einer Textarea darstellen.

Siehe Gambas: Arrays

Beispiel:

Sie brauchen eine Form eine Textarea und 2 Commandbuttons um das Programm in Gang zu bringen.

' Gambas class file
PUBLIC SUB Form_Open()
 Textarea1.Text = "1,Eins"
 Textarea1.Text = Textarea1.Text & "2,Zwei" 
END
PUBLIC SUB Button2_Click()
Dialog.SaveFile() 
File.Save(Dialog.Path, TextArea1.Text)
'Geben Sie db.txt als Dateinamen ein 
CATCH 
IF ERROR THEN RETURN
END
PUBLIC SUB Button1_Click()
DIM sLine AS String
sLine = File.Load("db.txt")
'Die Datei muss existieren, 
'sonst kann sie nicht geladen werden. 
textarea1.Text = sLine
END

Fügen Sie jetzt noch ein paar Tabellen Einträge dazu und speichern Sie wieder ab:

3,Drei
4,Vier 
5,Fünf

Markieren Sie diese 3 weiteren datensätze und kopieren Sie sie mit Strg + C in den Zwischenspeicher. Mit Strg + V geben Sie sie wieder in Ihrer Textarea aus und speichern Sie ab.

Löschen Sie die Textarea und Laden Sie die Datenbank erneut. Siehe da, Ihre Minitabelle ist noch vorhanden.

Das ganze schaut immer noch wie eine Textdatei aus, aber auch eine richtige Tabelle wird zunächst als hintereinanderfolgende Datei abgespeichert. In unserer Minitabelle sind die einzelnen Datenfelder mit Kommas getrennt, die einzelnen Reihen ( = Datensätze) werden durch ein Return ( = Chr(10)) getrennt.

CSV Datei

[Bearbeiten]

Vielleicht wollen Sie obige einfache Zahlentabelle in ein Standard CSV Datenbankformat umwandeln, wie es zb Excel oder Openoffice als Importmöglichkeit nutzt.

Das CSV-Dateiformat wird oft benutzt, um Daten zwischen unterschiedlichen Computerprogrammen auszutauschen (es ist also ein Austauschformat). Die Verwendung des Formates in den von Microsoft Excel verwendeten Formen hat sich als Pseudostandard etabliert.

Das CSV Excel Format schaut so aus:

"1","Eins"
"2","Zwei"

D.h. im Gegensatz zu unsere Darstellung sind die Eingaben in die Datenfelder noch mit einem Anführungszeichen versehen. Man muß jetzt nur aufpassen , das im Datenfeld selbst kein Anführungszeichen und kein Komma vorkommt, denn diese 2 Zeichen braucht man für die Tabellenstruktur.

Eine CSV-Datei ist eine Text-Datei, die tabellarisch strukturierte Daten enthält und vorrangig zum Datenaustausch verwendet wird. Das Kürzel CSV steht dabei für Character Separated Values oder Comma Separated Values, weil die einzelnen Werte durch ein spezielles Trennzeichen - in vielen Fällen das Komma - getrennt werden. Einzelne Datensätze werden in der Regel durch einen Zeilenumbruch (bei Windows: CR LF = carriage return, line feed; bei Unix: nur LF; bei Mac OS: nur CR) getrennt. Das CSV-Format ist unabhängig von Zeichencodierung, Byte-Reihenfolge und Zeilenumbruchszeichen.

CSV-Dateien tragen auch oft die Dateiendung .txt statt .csv und können auch in jedem Texteditor erstellt und bearbeitet werden.

Versuchen wir die CSV - Umwandlung zu programmieren: Dazu brauchen wir einen neuen Commandbutton den wir CSV nennen und folgenden Code:


PUBLIC SUB Button3_Click()
text AS String
liste AS String[]
posten AS String
reihe AS String 
text = textarea1.Text
liste = Split(text,Chr(10))
textarea1.Text = ""
FOR EACH posten IN liste
 IF posten = "" THEN 
 reihe = ""
 ELSE  
 reihe =  Chr(34) & posten & Chr(34) & Chr(10)
 END IF
 textarea1.Text = textarea1.Text & reihe 
NEXT

Das schaut schon ganz schön aus. Vor allem wird die leere Zeile am Schluss nicht mit Anführungszeichen versehen. Aber leider finden sich keine Anführungszeichen um die Kommas. Das Programm muss also noch verbessert werden:

Der String posten muss nach Kommas durchsucht werden und dann das Komma durch "," ersetzt werden. das geht am besten mit dem Replace Befehl in Gambas. Schauen Sie mit der Hilfetaste F1 und dem Alphabetischen Verzeichnis der Befehle nach, wie er verwendet wird.

Für unsere Anwendung ersetzen wir noch die Anführungszeichen durch chr(34).

PUBLIC SUB Button3_Click()
text AS String
liste AS String[]
posten AS String
reihe AS String 
text = textarea1.Text
liste = Split(text,Chr(10))
textarea1.Text = ""
FOR EACH posten IN liste
 IF posten = "" THEN 
  reihe = ""
 ELSE  
  reihe =  Chr(34) & Replace$(posten, ",", Chr(34) & "," & Chr(34)) & Chr(34) & Chr(10)
 END IF
 textarea1.Text = textarea1.Text & reihe 
NEXT

Probieren Sie es aus. Speichern Sie Ihre Minitabelle beispielsweise als db1.csv ab und versuchen Sie einmal , die Tabelle in Openoffice als Tabelle in der Tabellenkalkulation zu importieren. Klappt es ??

Verändern Sie die Tabelle in Open Office, speichern Sie diese wieder als CSV - Excel datei ab und versuchen Sie die Datei wieder in Ihr Programm zu holen, Klappt es ?

Das erscheint als überflüssige Spielerei, aber wer schon einmal versucht hat alte Datenbanken zu retten, der weiß wie wichtig Standarddatenformate und wie wichtig- Import und Exportmöglichkeiten sind.

Datenbankprogrammierung mit Gambas und MySQL

[Bearbeiten]

Vorarbeiten Mysql

[Bearbeiten]

Im Gegensatz zu MS Access ist Mysql zwar die Standarddatenbank im Linuxbereich, aber noch nicht ganz so leicht zu bedienen wie Access. Trotzdem ist Mysql sehr gut, da sie open source ist, sehr weit verbreitet ist und stabil läuft. Auch scheinen die Dateiformate nicht willkürlich verändert zu werden, wie dies bei MS Access ohne ersichtlichen Grund öfter der Fall war.

Sie sollten sich also etwas mit Mysql vertraut machen, bevor sie mit Gambas auf Mysql losgehen. Ansonsten werden Sie von Access denied Fehlern schnell frustriert sein.

Wenn Sie nicht wissen was eine Datenbank ist schauen Sie sich einmal folgende Seite an:

http://www.madeasy.de/2/datbank.htm

Die Einrichtung von mysql ist heute unter Linux kein allzu großes Problem mehr, da alle aktuellen Standarddistributionen die wichtigsten mysql Pakete enthalten.

Can't connect to local MySQL server through socket ...

[Bearbeiten]

Wenn man Mysql unter Linux in Gang bringen will, nervt einen folgende Fehlermeldung immer wieder.

Can't connect to local MySQL server through socket ... 

Was ist der Grund für diese Fehlermeldung? Meistens liegt das Problem bereits beim Starten von Linux. Der mysql daemon wird nicht gestartet. Um den Fehler zu beheben, müssen Sie in Ihren Runleveleditor gehen. Dort aktivieren Sie Mysql, so dass die Datenbank bereits beim Booten mitgestartet wird.

Unter Suse starten Sie am besten YAST mit dem Rootpasswort. Dann geben Sie folgendes ein:

YAST - SYSTEM/RUNLEVEL-EDITOR/  Dienste 

oder

systemctl start mysql

und aktivieren mysql, falls es nicht schon aktiv ist.

Mysql von der Konsole

[Bearbeiten]

Nach der Installation starten Sie ihr mysql von der Konsole mit:

/etc/init.d/mysql start

Es erscheint die Meldung: failed ( nicht erfolgreich) oder

Starting service MySQL done ( erfolgreich) 

Ich kann auf meinem Rechner mysql nur mit root Rechten starten.

Stoppen können Sie mysql mit:

/etc/init.d/mysql stop

Meldung:

Shutting down service mysql  done

Starten Sie mysql erneut und geben Sie dann ein

mysql 

Meldung:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.0.18
Type 'help;' or '\h' for help. Type '\c' to clear the buffer
mysql> 

Schauen Sie sich den mysql status an und geben Sie status ein:

mysql> status

Meldung:

--------------
mysql  Ver 12.22 Distrib 4.0.18, for suse-linux (i686)
Connection id:          2
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          less
Using outfile:          
Server version:         4.0.18
Protocol version:       10
Connection:             Localhost via UNIX socket
Client characterset:    latin1
Server characterset:    latin1
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 3 min 37 sec
Threads: 1  Questions: 3  Slow queries: 0  Opens: 6  Flush tables: 1  Open tables: 0  Queries per second avg:   
0.014

Wichtig für Gambas sind hier die current database ( noch keine geladen), der current user und die connection.

Haben Sie bereits ein Mysqlpasswort vergeben kommen Sie in mysql nur mit

mysql -p 

und dann der Eingabe des Passwortes hinein. Dieses Passwort hat nichts mit dem Linux Passwort zu tun und wird außerdem vom mysql noch verschlüsselt, steht also nicht im Klartext zur Verfügung. Merken Sie es sich gut, Sie brauchen es auch für Gambas und mysql.

Schauen Sie sich dann einmal die vorhandenen Datenbanken an zb die Testdatenbank test und geben Sie ein:

USE test;

Meldung:

mysql> USE test;
Database changed

Lassen Sie sich nicht durch die Meldung: Database changed irritieren.

Lassen Sie sich nun die vorhandenen Tabellen in mysql anzeigen, aber vergessen Sie nicht den Strichpunkt hinter Ihrer Eingabe sonst wird mysql zickig.

SHOW TABLES;

Da auf meinem Rechner schon einiges in Test zu finden ist erscheint folgende Meldung:

+-----------------+
| Tables_in_test  |
+-----------------+
| NewTable        |
| __RekallObjects |
| gewuerz         |
| t1              |
| t2              |
| test            |
+-----------------+
6 rows in set (0.00 sec)

Jetzt kann man sich die einzelne Tabelle beispielsweise gewuerz anschauen:

SELECT * FROM gewuerz;

Und ich erhalte eine wunderbare Gewürztabelle: mysql> SELECT * FROM gewuerz;

+----+-----------+-------+----------+-------+---------+
| nr | name      | preis | waehrung | menge | einheit |
+----+-----------+-------+----------+-------+---------+
|  1 | anis      |   4.6 | EUR      |   6.8 | kg      |
|  2 | pfeffer   |     5 | euro     |     2 | 4       |
|  3 | safran    |     5 | e        |     3 | 3       |
|  4 | salz      |     4 | e        |     4 | 4       |
|  5 | curry     |     5 | e        |     5 | 5       |
|  6 | knoblauch |     5 | e        |     5 | 5       |
+----+-----------+-------+----------+-------+---------+
6 rows in set (0.02 sec)

Versuchen Sie sich doch auch so eine schöne Gewuerztabelle anzulegen.

Zur weiteren mysql Syntax empfehle ich folgende sehr hilfreiche Website:

http://www.selflinux.org/selflinux/html/mysql.html - Link leider defekt :-( Am besten vollziehen Sie das dortige Kunden Beispiel nach.

Arbeiten mit dem Datenbankmanager von Gambas

[Bearbeiten]

Der Datenbankmanager von Gambas ist gut geeignet, um sehr schnell und übersichtlich mysql Datenbanken darzustellen, neu anzulegen und zu bearbeiten.

Sie finden Ihn im Projektfenster unter dem Menüpunkt Werkzeuge und Datenbank-Manager.


Wenn Sie ihn starten fragt er Sie nach einem kryptischen Password , daß sie eingeben müssen, auch wenn Sie sonst mysql noch als root und ohne Passwort nutzen.

Geben Sie hier einfach Return ein , gibt es eine Fehlermeldung: Please enter at least 8 characters auf Deutsch: Sie sollten ein Passwort mit mindestens 8 Buchstaben nutzen.

Haben Sie diese Passworthürde erfolgreich gemeistert , erscheinen alle Datenbankserver in einer Treeviewansicht.

Bei mir funktioniert nur der Eintrag root@localhost(mysql). Klicken Sie auf diesen , dann zeigen sich alle dort erreichbaren Datenbanken zb auch test. Klicken Sie auf eine der Datenbanken, dann zeigen sich die dortigen Tabellen. Klicken Sie auf eine Tabelle , dann können Sie diese nun im rechten Bildschirm in der Struktur ändern , neue Indizes setzen und auch neue Daten eingeben.

Probieren Sie alles aus und speichern Sie ihre Änderungen durch einen Klick auf das Diskettensymbol ab.

MySQL Nutzerrechte

[Bearbeiten]

MySQL, Apache und phpMyAdmin

[Bearbeiten]

Zur Darstellung von MySQL Datenbanken haben sich die Programme Apache als Webserver und phpMyAdmin als Zugriffsoberfläche sehr bewährt. Versuchen Sie diese beiden Programme auf ihrem Rechner zu installieren. Machen Sie sich dann etwas mit phpMyAdmin vertraut.

Es erleichtert die Fehlersuche enorm, wenn man eine schnelle weitere Zugriffsmöglichkeit auf die MySQL Datenbanken in Form des phpMyAdmin hat.

Datenbankprogrammierung mit Gambas und SQLite

[Bearbeiten]

Nicht immer ist es notwendig, für eine kleine Datenbanklösung einen kompletten Server aufzusetzen. SQLite bietet die Möglichkeit mittels der notwendigen Treiber, welche für Gambas zur Verfügung stehen, eine DB in einer Datei ohne Server zu erzeugen.

Eine SQLite Datenbank kann man mittels den Konsolenprogramm sqlite, nach Installation der notwendigen Treiber, mit Knoda oder natürlich auch mit dem gambaseigenen Datenbankmanager erstellen.

Eine genauere Beschreibung der Datenbank findet man unter http://de.wikipedia.org/wiki/Sqlite .

Eingebunden wird die Datenbank durch die Variablen .Type und .Name der Connection, wobei für .Type "sqlite" und für .Name der absolute Pfad zur Datenbankdatei steht. Die Benutzerrechte richten sich nach den Dateirechten.


Erstellen einer Datenbankverbindung

[Bearbeiten]

Beispiel für ein Datenbank-Connect. Hierbei muss die gb.db Komponente in das Projekt mit eingebunden werden:

PRIVATE $hConn AS Connection
PUBLIC SUB GoConnect()
  DIM sName AS String
  TRY $hConn.Close
  sName = "DatenbankName"
  WITH $hConn
    .Type = "mysql"
    .Host = "DatenbankServer"
    .Login = "Datenbank-Benutzerkennnung"
    .Password = "Datenbank-Benutzerpasswort"
  END WITH
  $hConn.Name = sName
  $hConn.Open
CATCH
Message.Error(Error.Text)
END
PUBLIC SUB Form_Open()
  $hConn = NEW Connection
  GoConnect
END
PUBLIC SUB Form_Close()
  $hConn.Close
END


Verfügbare Datenbanken anzeigen

[Bearbeiten]

Es wird eine Datenbankverbindung mit der unter dem jeweiligen Datenbanksystem immer vorhandenen Standarddatenbank (postgresql: 'template1'; mysql: 'mysql' ...) hergestellt und die Anzahl und durch Abfrage der 'Collection' 'Databases' die dem angemeldetem Benutzer zur Verfügung stehenden Datenbanken angezeigt. Dazu wird als Datenbankname eine leere Zeichenkette angegeben. Der '.Type' ist entsprechend dem Datenbanktyp zu setzen.

Z.B. als Procedure in einem Modul:

 PRIVATE Datenbankverbindung AS Connection
 PRIVATE Datenbankname AS String
 PROCEDURE ListeDatenbanken ()
   DIM Element AS Variant
   Datenbankverbindung = NEW Connection
   WITH Datenbankverbindung
     .Type     = "postgresql"
     .Host     = "Rechnername"
     .Login    = "Benutzername"
     .Password = "Schutzwort"
     .Name     = ""
   END WITH  
   Datenbankverbindung.Open
   PRINT "Anzahl Datenbanken: " & DB.Databases.Count
   FOR EACH Element IN DB.Databases
     Print "Datenbankname: " & Element.Name
   NEXT
   Datenbankverbindung.Close
 END
[Bearbeiten]


Drucken funktioniert unter Gambas mit dem Printer Objekt. Es findet sich in der Komponente GB.QT.

Siehe Gambas Komponenten.

Wenn Sie mehr Informationen zum Printer Objekt brauchen, dann wählen Sie in Gambas mit F1 die Hilfe Funktion. Im Hilfe Browser können Sie im SUCHEN Feld das Stichwort Printer eingeben.

Ein paar Zeilen im Direktausdruck

[Bearbeiten]

Man kann den Drucker ohne Dialog ansteuern. Wie das geht zeigt folgendes Programm. Sie brauchen dazu:

  • eine Form
  • einen Befehlsknopf
  • eine Textarea

Holen Sie sich diese Steuerelemente mit F6 aus der Werkzeugkiste.

Dann fügen Sie folgenden Code ein:

PUBLIC SUB Form_Open()
ME.Text = "Druckprogramm mit dem Printer Befehl"
ME.Width = 400
ME.Height = 400 
ME.Center
Button1.Text = "Ausdruck im Querformat"
Button1.Width = 200
Button1.X = 16
Button1.Y = 24
Textarea1.Text = "Dies ist ein Test für den Drucker!"
Textarea1.X = 16
Textarea1.Y = 64
Textarea1.Width = 312
Textarea1.Height = 248
END
PUBLIC SUB Button1_Click()
 Printer.Colormode = 0 
 'Stellt den SchwarzweißDruck ein
 Printer.Orientation = 0 
 'Hochformat 
 Draw.Begin(Printer) ' Initialisiert den Ausdruck 
 Draw.Text(TextArea1.Text, 200, 200) 
 ' Druckt den Inhalt der TextArea in die linke obere Ecke 
 Draw.End ' Die Seite wird an den Drucker abgeschickt.
END

Der erste Teil des Programmes ist für den Ausdruck überflüssig. Es erleichtert Ihnen nur die Einstellung der Steuerelemente auf der Form und wird direkt beim Start des Programmes ausgeführt. ( Sub Form Open ) Der eigentliche Ausdruck erfolgt erst nach anklicken von Button1. Dort finden Sie die Druckerbefehle.

Drucken mit Dialog

[Bearbeiten]

Man kann den Drucker mit einem Auswahl Dialog ansteuern, um den gewünschten Drucker vor dem Druck zu wählen. Hierzu erweitern Sie das Beispiel "Ein paar Zeilen im Direktausdruck" um den Befehl: Printer.Setup()

Wie das geht zeigt folgendes Programm. Sie brauchen dazu:

  • eine Form
  • einen Befehlsknopf
  • eine Textarea

Holen Sie sich diese Steuerelemente mit F6 aus der Werkzeugkiste.

Dann fügen Sie folgenden Code ein:

PUBLIC SUB Form_Open()
ME.Text = "Druckprogramm mit dem Printer Befehl"
ME.Width = 400
ME.Height = 400 
ME.Center
Button1.Text = "Ausdruck im Querformat"
Button1.Width = 200
Button1.X = 16
Button1.Y = 24
Textarea1.Text = "Dies ist ein Test für den Drucker!"
Textarea1.X = 16
Textarea1.Y = 64
Textarea1.Width = 312
Textarea1.Height = 248
END
PUBLIC SUB Button1_Click()
 Printer.Setup() ' Auswahl Drucker 
 Printer.Colormode = 0 
 'Stellt den SchwarzweißDruck ein
 Printer.Orientation = 0 
 'Hochformat 
 Draw.Begin(Printer) ' Initialisiert den Ausdruck 
 Draw.Text(TextArea1.Text, 200, 200) 
 ' Druckt den Inhalt der TextArea in die linke obere Ecke 
 Draw.End ' Die Seite wird an den Drucker abgeschickt.
END

Der erste Teil des Programmes ist für den Ausdruck überflüssig. Es erleichtert Ihnen nur die Einstellung der Steuerelemente auf der Form und wird direkt beim Start des Programmes ausgeführt. ( Sub Form Open ) Der eigentliche Ausdruck erfolgt erst nach anklicken von Button1. Dort finden Sie die Druckerbefehle.

Drucken im Querformat

[Bearbeiten]

Hierzu können Sie das oben erwähnte Beispeil "Ein paar Zeilen im Direktausdruck" anpassen. Ändern Sie den Befehl Printer.Orientation = 0 nach 1 Der Wert für das Hochformat = 0 und für das Querformat = 1

Drucken einer Grafik

[Bearbeiten]

Drucken in eine Postscript PS Datei

[Bearbeiten]

Drucken Abbrechen

[Bearbeiten]

Printer Klasse Theorie

[Bearbeiten]

In Gambas ist das Printer Objekt ein grafisches Gerät, deswegen nutzen Sie die Methoden der Draw Klasse um damit auszudrucken.

Beispiel:

IF Printer.Setup() THEN RETURN
'Dialog anschalten
Draw.Begin(Printer) ' Initializes the draw
Draw.Text(TextArea1.Text, 200, 200) ' Druckt den Inhalt der Textarea in dle linke obere Ecke des Druckers.
Draw.Foreground = Color.Red
Draw.Rect(500, 200, 32, 32) ' Druckt ein kleines Rechteck
Draw.End ' Die Seite wird an den Drucker gesendet.
Printer.NewPage ' Eine neue Seite wird angesteuert.


Die Printer Klasse ist statisch.

Eigenschaften von Printer

[Bearbeiten]
  • ColorMode

'Schwarzweiß oder Farbe

  • Copies

'Zahl der Kopien

  • File

'In eine PS datei drucken

  • FromPage

' Ausdruck erst mit dieser Seite beginnen

  • ToPage

'Ausdruck bei dieser Seite bereits beenden

  • Height

'Seitenlänge

  • Width

'Seitenbreite

  • MaxPage

'Die größte Seitennummer die man wählen kann

  • MinPage

'Die kleinsten Seitennummer die man wählen kann

  • Name

'Name des Druckers

  • Orientation

'Hoch- oder Querformat

  • Resolution

'Auflösung in DPI

  • Size

'DIN A3,A4 Letter etc


Methoden von Printer

[Bearbeiten]
  • Abort

'Druck abbrechen

  • Setup

'Druckdialog starten

  • NewPage

'Seitenvorschub Neue Seite anfangen

Konstanten von Printer

[Bearbeiten]

Black 'Schwarzweiß

Color 'Farbausdruck

Landscape 'Querformat

Portrait 'Hochformat


Printer.Print

[Bearbeiten]

Den beliebten VB Befehl Printer.Print gibt es leider in Gambas noch nicht. Das kann man vielleicht ergänzen.


Html Browser

[Bearbeiten]

Man kann mit Gambas recht einfach HTML Seiten darstellen. Wie das geht zeigt folgendes Programm. Es wird genutzt, um das Gambaswikibook lokal auf dem Rechner aufrufen zu können.

Sie brauchen eine Form mit

  • einer Textbox
  • einem Labelfeld
  • einem Webbrowserfeld

Um das Webbrowserfeld zu bekommen müssen sie erst die Gambas Komponenten

  • gb.qt.kde und
  • gb.qt.kde.html

zu ihrem Projekt dazuladen.

Wie das geht, ist unter Gambas-Komponenten erklärt.

So schaut dann Ihre Form im Entwurfsmodus aus.

Fügen Sie folgen Code in Ihr Programm:

' Gambas class file
PUBLIC SUB Form_Resize()
  textbox1.Move(0, 0, ME.ClientW)
  WebBrowser1.Move(0, textbox1.H, ME.ClientW, ME.ClientH - textbox1.H - label1.H)
  label1.Move(0, WebBrowser1.Y + WebBrowser1.H, ME.CLientW)
END
PUBLIC SUB Form_Open()
  textbox1.Text = "file:/home/BENUTZER/wiki/Gambas"
  txtLink_Activate
END
PUBLIC SUB WebBrowser1_Change()
  textbox1.Text = LAST.Path
  'DEC Application.Busy
END
PUBLIC SUB WebBrowser1_Click()
  textbox1.Text = " " & LAST.Link
  'INC Application.Busy
END
PUBLIC SUB WebBrowser1_Link()
  label1.Text = LAST.Link
END
PUBLIC SUB txtLink_Activate()
  DIM sPath AS String
  sPath = textbox1.Text
  WebBrowser1.Path = Trim(sPath)
END

Damit das Programm läuft müssen Sie auf ihrem Rechner eine lokale Kopie des Gambas-Wikibooks einrichten, siehe Einrichten einer lokalen Kopie.

Dann können Sie das Programm als Gambas Hilfebrowser auf ihrem Rechner einrichten und immer die neuesten Gambasseiten aus dem GambasWikibook herunterladen.

Nur das Zurückblättern funktioniert noch nicht. Man muss in der obersten Zeile im auf Zurück zu Gambas klicken , dann kommt man wieder zum Hauptmenü.

Ähnlich kann man sich andere Wikibooks auf dem eigenen Rechner einrichten.

Das Ganze funktioniert natürlich auch mit dem Konqueror. Im Konqueror ist dann auch ein Zurückblättern möglich.

Erweiterter Browser

[Bearbeiten]

Um das Problem der fehlenden Möglichkeit zum Zurückblättern zu lösen, ergänzen wir nun die obige Form um drei Buttons: Button1, Button2 und Button3.

Schließlich übernehmen wird den folgenden Code in unser Programm: Wikibrowser2 Form1.class

Wiki Browser 2

Gambas Web Browser

[Bearbeiten]

Bei den mitgelieferten Gambas Beispielprogrammen ist ein kleiner Webbrowser dabei. Er ist sehr praktisch und leicht erweiterbar.


Codebeispiel für die RS 232 Schnittstelle

[Bearbeiten]
PUBLIC sub Write_Serial (a AS String)

IF Sport.status = Net.Inactive THEN
   Message ("open port first")
ELSE
   chkrts.Value = TRUE
   WAIT 0.01
   WRITE #Sport,a,Len(a)
   WAIT 0.5
   chkrts.Value = FALSE
ENDIF   


Das Serielle Gerät benutzt hier RTS UP um Daten zu akzeptieren. Wenn RTS aus ist, werden diese Daten übertragen.


Man kann die Linux Shell von Gambas aus ansprechen und nutzen. Wie das geht zeigen die folgenden Beispiele:

Ls unter Gambas

[Bearbeiten]

Das folgende Beispielprogramm zeigt, wie man sich die Dateien eines Verzeichnisses der Festplatte in einer Textarea anschauen kann.

Man braucht eine Textarea und einen Befehlsbutton, um das Programm in gang zu bringen.

' Gambas class file
PUBLIC Content AS String
'Get the content of a directory
PUBLIC SUB Button1_Click()
  SHELL "ls -la > /tmp/result" WAIT
  Content = File.Load("/tmp/result")
  Textarea1.text = content
END

Man kann den String mit dem Namen Content aus dem Programm entfernen, wenn man die Textarea direkt mit dem Fileload füllt.

  Textarea1.text = File.Load("/tmp/result")

Noch ein Beispiel: Unterverzeichnisse anschauen

[Bearbeiten]

Man braucht eine Textarea und 2 Befehlsbuttons, um das Programm in Gang zu bringen.

PUBLIC SUB Form_Open()
 ME.Text = "Unterverzeichnisse anzeigen - Wählen Sie einen Pfad"
 ME.X = 200
 ME.Y = 50
 ME.Width = 1200
 ME.Height = 600
 Button1.Text = "Unterverzeichnisse anzeigen"
 Button1.X = 16
 Button1.Y = 16
 Button1.Width = 300
 textarea1.Text = "" 
 textarea1.x = 16
 textarea1.y = 56
 textarea1.width = 700
 textarea1.height = 500
 Button2.Text = "Ende"
 Button2.X = 340
END
PUBLIC SUB Button1_Click()
DIM t AS String 
IF Dialog.SelectDirectory() THEN RETURN
t  = Dialog.Path
SHELL "ls -ld " & t & "*/. > /tmp/result" WAIT
Textarea1.text = File.Load("/tmp/result")
END
PUBLIC SUB Button2_Click()
 ME.Close
END

Im ersten Unterprogramm Form_Open werden nur einige Einstellungen für die 3 Steuerelemente vorgenommen. Im 2, Unterprogramm Button1_Click steht der eigentlich wichtige Code: Zunächst wird ein string t deklariert. Dann wird eine Dialogform zur Auswahl des Verzeichnisses geöffnet. Das ausgewählte Verzeichnis (Dialog.path) wird dem String t übergeben. Mit dem Shell Befehl werden alle Unterverzeichnisse von Dialogpath in eine temporäre Datei gespeichert. Diese Datei wird geladen und in der Textarea angezeigt.

wc = wordcount unter Gambas

[Bearbeiten]

Im folgenden Programm wird der Linuxbefehl wc , der die Zeilen, die Worte und die Zeichen eines beliebigen Textes zählt, innerhalb eines Gambasprogrammes genutzt.

Um das Programm in Gang zu bringen braucht man:

  • 2 Befehlsbuttons
  • 1 Textarea ( Hier wird der zu untersuchende Text eingegeben)
  • 1 Textbox ( Hier wird das Ergebnis des wordcount ausgegeben)

Der Code dazu:

PUBLIC t AS String
PUBLIC SUB Form_Open()
 Textarea1.Text = "Dies ist ein Test"
 Textbox1.Text = "" 
END
PUBLIC SUB Button1_Click()
 File.Save(system.Home & "/test.txt",TextArea1.Text)
 CATCH 
 IF ERROR THEN RETURN
END
PUBLIC SUB Button2_Click()
 SHELL "wc " & system.Home & "/test.txt > /tmp/result" WAIT
 t = File.Load("/tmp/result")
 textbox1.Text = t
END
  • Mit dem Befehl 1 wird der Inhalt der Textarea in einer Datei test.txt abgespeichert.
  • Mit dem Befehl 2 wird diese Datei test.txt einem wordcount unterzogen. das Ergebnis in der Datei /tmp/result abgespeichert.
  • Diese Datei wird dann wieder in die Textbox geladen und angezeigt.

Etwas umständlich aber es geht. Der String t ist eigentlich überflüssig und kann aus dem Programm entfernt werden wenn man

textbox1.Text = File.Load("/tmp/result")

schreibt.

cp = Kopieren unter Gambas

[Bearbeiten]

Beispiel 1: Eine Datei kopieren

Sie benötigen auf ihrer Form:

  • 2 Dirviews
  • 2 Fileviews
  • 1 Button
   Public Sub Button1_Click()
   Dim sFile As String
   Dim sStr,sStr2 As String
       sStr = DirView1.Current & "/"
       sStr2 = DirView2.Current 
       (sStr2= Dirview2,Current & "/")
       sFile = sStr & FileView1.Current
       Exec ["cp", "-v", sFile, sStr2] Wait 
       DirView1.Reload
       DirView2.Reload
   End 

Der Slash in (sStr2) würde bewirken, das zusätzlich ein Verzeichnis angelegt wird. Wählen sie in Dirview2 ein Verzeichnis aus und in Fileview1 eine Datei, klicken sie auf Button1.

Nachdem Reload der Dirviews sehen sie die kopierte Datei im Verzeichnis von Dirview2.

Beispiel 2: Ein Verzeichnis kopieren

   Public Sub Button1_Click()
   Dim sFile As String
   Dim sStr,sStr2 As String
       sStr = DirView1.Current & "/"
       sStr2 = DirView2.Current 
       For Each sFile In Dir(DirView1.Current)
       sFile = sStr & sFile
       Exec ["cp", "-v", sFile, sStr2] Wait 
       Next
       DirView1.Reload
       DirView2.Reload
   End

Sie können den EXEC-Befehl durch den SHELL-Befehl ersetzen:

   Shell "cp -v " & sFile & " " & sStr2 Wait

rm = Löschen unter Gambas

[Bearbeiten]

Beispiel 1: Löschen einer Datei mit Nachfrage

Sie benötigen auf ihrer Form:

  • Dirview
  • Fileview
  • Button
   Public Sub Button1_Click()
       Select Message.Question("Datei löschen?", "Ja", "Nein")
       Case 1
       Exec ["rm", "-r", DirView1.Current & "/" & FileView1.Current] Wait
       FileView1.Reload
       Case 2
       Return
       End Select
   End     

Beispiel 2: Löschen eines Ordners mit Nachfrage

   Public Sub Button1_Click()
       Select Message.Question("Ordner löschen?", "Ja", "Nein")
       Case 1
       Exec ["rm", "-r", DirView1.Current] Wait
       DirView1.Reload
       Case 2
       Return
       End Select
   End

Sie können den EXEC-Befehl durch den SHELL-Befehl ersetzen. Voher muß die Datei oder das Verzeichnis mit einem String deklariert werden.

Besonderheit mit rm und dem SHELL-Befehl:

   Eine Datei zb Meine Audio.datei wird rm nicht löschen, da rm diese Datei als zwei
   Dateien betrachtet. Die Datei müsste MeineAudio.datei heissen. Dies gilt nur mit 
   dem SHELL-Befehl. Mit EXEC wird rm auch Meine Audio.datei löschen.
   Dim sStr As String  
   sStr=Dirview1.Current & "/" & Fileview1.Current (Datei)
   sStr=Dirview1.Current (Verzeichnis)  
   Shell "rm -r " & sStr Wait

mv = Verschieben unter Gambas

[Bearbeiten]
  • 2 Dirviews
  • 2 Fileviews
  • 1 Button

Verschieben einer Datei mit mv

   Public Sub Button1_Click()
   Dim sFile As String
   Dim sStr As String
   Dim sStr2 As String
       sStr = DirView1.Current & "/"
       sStr2 = DirView2.Current & "/"
       sFile = sStr & FileView1.Current 
       Shell "mv -i " & sFile & " " & sStr2 Wait
       DirView2.Reload
       DirView1.Reload
   End


Laden der Kompressions-Komponente

[Bearbeiten]

Um mit Gambas komprimierte Datei zu erstellen, brauchen Sie die Gambas-Komponente gb.compress. Sie können diese über die Gambas-Projektseite zuschalten. Dazu klicken Sie auf den Menüpunkt Projekt und dann weiter auf Eigenschaften. Von den dort angebotenen Reitern wählen Sie Komponenten. Suchen Sie aus der Liste gb.compress heraus und versehen Sie die Box davor mit einem Häkchen.

Siehe auch Komponenten

Beispielprogramm

[Bearbeiten]

Im folgenden Beispiel wird eine Textdatei erzeugt. Diese wird unkomprimiert abgespeichert. Dann wird sie komprimiert und gespeichert. Die komprimierte Datei wird geladen und ausgegeben. Dann wird die komprimierte Datei wieder entkomprimiert und mit PRINT im Direktfenster ausgegeben.

Sie brauchen:

  • 1 Textarea
  • 7 Befehlsfelder (Commandbuttons)

um das Programm in Gang zu bringen.

Der Quellcode:

' Gambas class file
PUBLIC DateiTxt AS String
PUBLIC DateiZip AS String
PUBLIC DateiUnzip AS String

PUBLIC SUB Form_Open()
  Textarea1.Text = ""
  ME.Text = "Kompression mit Gambas"
  DateiTxt = System.Home & File.Separator & "ziptest.txt"
  DateiZip = System.Home & File.Separator & "ziptest.txt.gz"
  DateiUnzip = System.Home & File.Separator & "unziptest.txt"
END 

PUBLIC SUB Button1_Click()
  s AS String 
  sp AS String 
  n AS Integer 
  s = " Dies ist ein Test "

  FOR n = 1 TO 10 
    s = s & Str(n)
    sp = sp & s
  NEXT

  PRINT sp
  TextArea1.Text = sp
END

PUBLIC SUB Button2_Click()
  'Testdatei speichern
  File.Save( DateiTxt, TextArea1.Text )
  CATCH 
  IF ERROR THEN RETURN
END

PUBLIC SUB Button3_Click()
  DIM Cp AS Compress
  'DIM Cp AS NEW Compress
  Cp = NEW Compress
  Cp.Type = "zlib"
  Cp.File ( DateiTxt, DateiZip, Cp.Max )
END

PUBLIC SUB Button4_Click()
  DIM sLine AS String
  sLine = File.Load(DateiZip)
  'Die Datei muss existieren, 
  'sonst kann sie nicht geladen werden. 
  PRINT sLine
  'TextArea1.Text = sline
END

PUBLIC SUB Button5_Click()
   DIM UCp AS Uncompress
   UCp = NEW Uncompress
   UCp.Type = "zlib"
   UCp.File ( DateiZip, DateiUnzip )  
END

PUBLIC SUB Button6_Click()
   DIM sLine AS String
   sLine = File.Load(DateiUnzip)
   'Die Datei muss existieren, 
   'sonst kann sie nicht geladen werden. 
   PRINT sLine
   'TextArea1.Text = sline
END

PUBLIC SUB Button7_Click()
  ME.Close 
END


In den mitgelieferten Beispielen finden sich mehrere Spiele

[Bearbeiten]
  • DeepSpace
  • RobotFindsKitten
  • Snake
  • Solitaire

Die Türme von Hanoi

[Bearbeiten]

Kommt demnächst, Siehe auch: http://www.vb-kurs.cagaertig.de/hanoi.htm

Sprint eine Minispiel für 2

[Bearbeiten]

Ein einfaches Spiel für 2 Spieler. Wer denn letzten Stein setzt, hat gewonnen.

Man braucht:

  • 40 Textboxen (stöhn)
  • 2 Textareas
  • 4 Commandbuttons

Quellcode (Quick and dirty):

Diese Programmierung ist stark verbesserungsbedürftig. Es liegt eine typische Anfängerlösung vor. Trotzdem kann man sie erst einmal stehen lassen, denn sie funktioniert. Als Hausaufgabe kann man jetzt ans verbessern gehen.

Verbesserungen

[Bearbeiten]

Durch die vielen Textboxen lohnt es sich hier besonders die Textboxen in einem Array unterzubringen, dadurch kann man den Programmcode stark vereinfachen. Man braucht jetzt nur noch:

  • 2 Textboxen
  • 4 Commandbuttons

Quellcode: Sprint2 Form1.class

TicTacToe

[Bearbeiten]

Im folgenden Programm wird eine ganze einfache Version des Spiels für 2 Spieler gezeigt.

Man braucht dazu folgende Steuerelemente auf der Form

  • 9 Textboxen
  • 2 Textareas
  • 4 Commandbuttons

Quellcode:

Die Gliederung ist noch verbesserungsbedürftig. Das Programm arbeitet mit zwei Unterprogrammen wechsel und gewonnen. Die ganze Programmierung kann sicher noch stark verbessert werden. Man könnte beispielsweise ein Array für die Textfelder einbauen. Als erste lauffähige Lösung kann man obiges Programm aber durchaus brauchen und sollte sie aus didaktischen Gründen stehen lassen. Sinnvolle Verkürzungen sind für Anfänger schwer zu verstehen und sollten Schritt für Schritt weiter unten erfolgen.

Verbesserungen

[Bearbeiten]

Wenn wir jetzt, wie oben angemerkt, die Textboxen in einem Array unterbringt, kann man den Programmcode vereinfachen. Man braucht jetzt nur noch:

  • 2 Textboxen
  • 4 Commandbuttons

Quellcode: TicTacToe2 Form1.class

[Bearbeiten]


Konverter (Text zu HTML-Code)

[Bearbeiten]

Dieses Programm verwandelt Text in Html-Zeichencode.

Sie Benötigen dazu:

  • 1 Form
  • 1 Button
  • 1 Textlabel
  • 2 Textboxen
Ergebnis AS String

PUBLIC SUB Button1_Click()
  i AS Integer
  Ergebnis = ""

  'Umwandlung vom "utf-8" Zeichensatz zum "ISO-8859-1" Zeichensatz
  Textbox2.Text = Conv$(Textbox1.Text, "utf-8", "ISO-8859-1")
  
  FOR i = 1 TO Len(Textbox2.Text)
  '"Len" gibt die Länge des übergebenen Strings zurück

    Ergebnis = Ergebnis & Chr$(38) & "#" & Asc( Textbox2.Text, i ) & ";"
    '"Asc" gibt den ASCII-Code des Zeichen an der angegebenen Stelle des Stings zurück
    'Chr$(38) ergibt das & Zeichen, hier nur verwendet um mögliche
    'Darstellungsprobleme im Browser zu vermeiden
  NEXT
  
  Textbox2.Text = Ergebnis
END

PUBLIC SUB TextBox1_Enter()
  Button1_Click
END

So sieht es dann aus:

Text zu HTML-Code

Youtube Downloader

[Bearbeiten]

Ermöglicht das Runterladen von Youtubevideos anhand eines Youtubelinks. Die Komponenten gb.net,gb.net.curl,gb.desktop,gb.gui,gb.form sind notwendig.

Hier die Form

# Gambas Form File 2.0

{ Form Form
  MoveScaled(0,0,38.5714,8.5714)
  Text = ("YoutubeDownloader")
  Border = Window.Fixed
  { TextBox1 TextBox
    MoveScaled(1,1,21,3)
    ToolTip = ("Here goes the link")
    Text = ("")
  }
  { PictureBox1 PictureBox
    MoveScaled(23,1,14.1429,7.1429)
  }
  { Button1 Button
    MoveScaled(1,5,21,3)
    ToolTip = ("click here if you are ready to download")
    Text = ("Download")
  }
}

Hier der Quellcode

' Gambas class file
CONST PICTURENAME AS String = "youtube.jpg"
CONST YOUTUBE AS String = "http://www.youtube.com"

PUBLIC SUB Form_Open()
  DIM pic AS Picture
  
  pic = Picture.Load(Application.Path & "/" & PICTURENAME)
  pic.Resize(100, 50)
  PictureBox1.Picture = pic
  Application.MainWindow.Icon = pic
END

PUBLIC SUB Button1_Click()
  getYoutubeFile(TextBox1.Text)
END

PUBLIC SUB PictureBox1_MouseDown()
  Desktop.Open(YOUTUBE)
END

' Öffnet den Standardbrowser mit dem Video dessen 
' Youtubeurl als Parameter übergeben wird
PUBLIC SUB getYoutubeFile(url AS String)  
  DIM contents AS String
  
  url = parseYoutube(url)
  IF url = NULL THEN 
    Message.Error("Error: problems with parsing the page!")
    RETURN 
  END IF 

  Desktop.Open(url)
END

' parsed eine Youtubeseite um den tatsächlichen Lageort des Videos zu finden
PUBLIC FUNCTION parseYoutube(url AS String) AS String
  DIM contents AS String
  DIM tmp AS String
  DIM tmp2 AS String
  DIM tval AS String
  DIM id AS String 

  ' seite laden
  contents = getFile(url)
  IF contents = NULL THEN 
    RETURN NULL
  END IF 

  ' tval
  tmp = String.InStr(contents, "\"t\": \"", 0) + String.Len("\"t\": \"")
  tmp2 = String.InStr(contents, "\", ", tmp)
  tval = String.Mid(contents, tmp, tmp2 - tmp)
    
  ' id
  tmp = String.InStr(url, "v=", 0) + String.Len("v=")
  id = String.Mid(url, tmp)
    
  RETURN "http://www.youtube.com/get_video?video_id=" & id & "&t=" & tval 
END

' Lädt eine Seite runter und gibt diese als String zurück
PUBLIC FUNCTION getFile(url AS String) AS String
  DIM h AS HttpClient
  DIM buffer AS String
  
  buffer = NULL
  h = NEW HttpClient AS "h"
  h.URL = url
  h.Get() 
  
  DO WHILE h.Status <> 0
    WAIT 0.01
  LOOP

  IF h.Status >= 0 THEN
    IF Lof(h) THEN 
      READ #h, buffer, Lof(h)
    END IF 
  END IF

  RETURN buffer
END


Lernprogramm zum Addieren ( Zusammenzählen)

[Bearbeiten]

Mit diesem kleinen Lernprogramm können Sie Addieren ( Zusammenzählen) lernen

Sie brauchen für das Programm eine grafische Form und

  • 6 Textboxen
  • 3 Commandbuttons

Das Programm erzeugt 2 Zufallszahlen a und b. Diese werden addiert mit dem Ergebnis c = a + b. In einer Textbox (hier: textbox5) gibt der Nutzer sein Ergebnis d ein. Diese wird durch den Befehl TESTEN mit dem wahren Ergebnis c überprüft.

Sie sollten die Commandbuttons folgendermassen bezeichnen:

  • Button1 = Ende
  • Button2 = Neue Aufgabe
  • Button3 = Testen

Ändern Sie den Text der Commandbuttons im Eigenschaftsfenster entsprechend um.

Das Programm vergleicht d mit dem korrekten Ergebnis c in einem Unterprogramm bewertung und gibt das Ergebnis in einer der Textboxen aus. Die Gesamtzahl der Aufgaben , die Zahl der richtigen Aufgaben und die Zahl der falschen Aufgaben wird in 3 weiteren Textboxen ausgegeben.

Der Code dazu:

' Gambas class file
PUBLIC a AS Integer
PUBLIC b AS Integer
PUBLIC c AS Integer 
PUBLIC SUB Form_Open()
z AS Integer 
'zahl der Aufgaben
r AS Integer
'zahl der richtigen Aufgaben
f AS Integer
'Zahl der falschen Aufgaben
z = 0
r = 0
f = 0
Textbox1.Text = ""
TextBox2.Text = Str(z)
TextBox3.Text = Str(r)
TextBox4.Text = Str(f)
Textbox5.Text = ""
Textbox6.Text = ""
END
PUBLIC SUB Button1_Click()
ME.Close
END
PUBLIC SUB Button2_Click()
z AS Integer 
r AS Integer
f AS Integer
d AS Integer
z = Val(textbox2.text)
z = z + 1
Randomize()
   ' Rem Zähler für die Zahl der Aufgaben
   a = Int(Rnd(1) * 10)
   'Rem Zufalls Zahl holen
   b = Int(Rnd(1) * 10)
   'Rem zweite Zufallszahl holen
   c = a + b 
   PRINT c
   textbox1.Text = " Addiere " & Str$(a) & " und " & Str$(b) & " überprüfe das Ergebnis"
textbox2.Text = Str(z)
END
PUBLIC SUB Button3_Click()
d AS Integer 
d = Val(Textbox5.text)
bewertung
CATCH 
IF ERROR THEN message.Info("Bitte geben Sie ihr Ergebnis in der Textbox neben dem Button TESTEN ein!")
END
SUB bewertung ()
r AS Integer
d AS Integer
f AS Integer
r = Val(textbox3.text)
d = Val(textbox5.text)
f = Val(textbox4.text)
IF d = c THEN textbox6.Text = "Richtig: "  & Str$(a) & " + "  & Str$(b) & " = " & Str(c)
IF d = c THEN r = r + 1
textbox3.Text = Str(r)
IF d <> c THEN textbox6.Text = "Falsch !! Richtig wäre gewesen "
IF d <> c THEN textbox6.Text = textbox6.Text & Str$(a)& " + " & Str$(b) & " = " & Str$(c)
IF d <> c THEN f = f + 1
textbox4.Text = Str(f)
END

Haben Sie das Programm in gang gebracht ? Was hier fehlt ist ein Übersichtsbild der Form. Das wird noch nachgeliefert. Wenn Sie die Variablen d,r,f,z noch als public vor den Unterprogrammen deklarieren, können Sie den Code noch deutlich vereinfachen.

Jetzt versuchen Sie einmal das Programm zu variieren:

  • Erstellen Sie ein neues Programm mit Zufallszahlen bis 100.
  • Erstellen Sie ein neues Programm mit der Multiplikation als Ergebnis.

Lernprogramm zum Subtrahieren ( Abziehen)

[Bearbeiten]

Mit diesem kleinen Lernprogramm können Sie subtrahieren ( Abziehen) lernen

Sie brauchen für das Programm eine grafische Form und

  • 3 Textboxen
  • 3 Commandbuttons

Das Programm erzeugt 2 Zufallszahlen a und c. Diese werden von einander abgezogen mit dem Ergebnis c = a - b. In einer Textbox (hier: textbox5) gibt der Nutzer sein Ergebnis d ein. Diese wird durch den Befehl TESTEN mit dem wahren Ergebnis c überprüft.

Sie sollten die Commandbuttons folgendermassen bezeichnen:

  • Button1 = Ende
  • Button2 = Neue Aufgabe
  • Button3 = Testen

Ändern Sie den Text der Commandbuttons im Eigenschaftsfenster entsprechend um.

Das Programm vergleicht d mit dem korrekten Ergebnis c in einem Unterprogramm bewertung und gibt das Ergebnis in einer der Textboxen aus.

Im Unterschied zum Addier-Lernprogramm erfolgt keine Zählung der Aufgaben.

Der Code dazu:


' Gambas class file
PUBLIC a AS Integer
PUBLIC b AS Integer
PUBLIC c AS Integer 
PUBLIC d AS Integer
PUBLIC SUB Form_Open()
Textbox1.Text = ""
Textbox5.Text = ""
Textbox6.Text = ""
END
PUBLIC SUB Button1_Click()
 ME.Close
END
PUBLIC SUB Button2_Click()
 Randomize()
   a = Int(Rnd(1) * 10)
   'Rem Zufalls Zahl holen
   c = Int(Rnd(1) * 10)
   'Rem zweite Zufallszahl holen
   b = a - c 
   textbox1.Text = " Subtrahiere " & Str$(a) & " minus " & Str$(b) & " und überprüfe das Ergebnis"
END
PUBLIC SUB Button3_Click()
 d = Val(Textbox5.text)
 bewertung
 CATCH 
 IF ERROR THEN message.Info("Bitte geben Sie ihr Ergebnis in der Textbox neben dem Button TESTEN ein!")
END
SUB bewertung ()
 IF d = c THEN textbox6.Text = "Richtig: "  & Str$(a) & " - "  & Str$(b) & " = " & Str(c)
 IF d <> c THEN textbox6.Text = "Falsch !! Richtig wäre gewesen "
 IF d <> c THEN textbox6.Text = textbox6.Text & Str$(a)& " - " & Str$(b) & " = " & Str$(c)
END

Wieso wurde die Zahl c als Zufallszahl definiert und nicht b ? Wie kann man das Programm ändern , so daß keine negativen Zahlen für b herauskommen können ? Hier fehlt eine Schleife , so daß gilt c < a. Dann wird auch b immer eine positive Zahl sein.

Lernprogramm zum Multiplizieren

[Bearbeiten]

Mit diesem kleinen Lernprogramm können Sie Multiplizieren ( Malnehmen) lernen

Sie brauchen für das Programm eine grafische Form und

  • 6 Textboxen
  • 3 Commandbuttons

Das Programm erzeugt 2 Zufallszahlen a und b. Diese werden malgenommen mit dem Ergebnis c = a * b. Das Sternchen ist in der Computersprache das Zeichen der Multiplikation. In einer Textbox (hier: textbox5) gibt der Nutzer sein Ergebnis d ein. Dieses wird durch den Befehl TESTEN mit dem wahren Ergebnis c verglichen.

Sie sollten die Commandbuttons folgendermassen bezeichnen:

  • Button1 = Ende
  • Button2 = Neue Aufgabe
  • Button3 = Testen

Ändern Sie den Text der Commandbuttons im Eigenschaftsfenster entsprechend um.

Das Programm vergleicht d mit dem korrekten Ergebnis c in einem Unterprogramm bewertung und gibt das Ergebnis in einer der Textboxen aus. Die Gesamtzahl der Aufgaben , die Zahl der richtigen Aufgaben und die Zahl der falschen Aufgaben wird in 3 weiteren Textboxen ausgegeben.

Das Programm läßt sich auch ohne Maus bedienen. Deswegen wurden die Keypress Unterprogramme hinzugefügt. Etwas wirr funktioniert die Backspacetaste in der Textbox für die Ergebniseingabe. Deswegen wurde hier eine Umleitung programmiert.

Der Code dazu:

' Gambas class file
PUBLIC a AS Integer
PUBLIC b AS Integer
PUBLIC c AS Integer 
PUBLIC r AS Integer
PUBLIC d AS Integer
PUBLIC f AS Integer
PUBLIC z AS Integer 
PUBLIC SUB Form_Open()
 z = 0
 r = 0
 f = 0
 Textbox1.Text = ""
 TextBox2.Text = Str(z)
 TextBox3.Text = Str(r)
 TextBox4.Text = Str(f)
 Textbox5.Text = ""
 Textbox6.Text = ""
 Button2.Default = TRUE
END
PUBLIC SUB Button1_Click()
 ME.Close
END
PUBLIC SUB Button2_Click()
 textbox5.Text =""
 textbox5.SetFocus
 z = Val(textbox2.text)
 z = z + 1
 Randomize()
   a = Int(Rnd(1) * 10)
   'Rem Zufalls Zahl holen
   b = Int(Rnd(1) * 10)
   'Rem zweite Zufallszahl holen
   c = a * b 
   'PRINT c
   textbox1.Text = " Multipliziere " & Str$(a) & " und " & Str$(b) & " und überprüfe das Ergebnis"
  textbox2.Text = Str(z)
END
PUBLIC SUB Button3_Click() 
 d AS Integer 
 d = Val(Textbox5.text)
 Button2.Default = TRUE
 bewertung
 CATCH 
 IF ERROR THEN message.Info("Bitte geben Sie ihr Ergebnis in der Textbox neben dem Button TESTEN ein!")
END
SUB bewertung ()
r = Val(textbox3.text)
d = Val(textbox5.text)
f = Val(textbox4.text)
IF d = c THEN textbox6.Text = "Richtig: "  & Str$(a) & " mal "  & Str$(b) & " = " & Str(c)
IF d = c THEN r = r + 1
textbox3.Text = Str(r)
IF d <> c THEN textbox6.Text = "Falsch !! Richtig wäre gewesen "
IF d <> c THEN textbox6.Text = textbox6.Text & Str$(a)& " mal " & Str$(b) & " = " & Str$(c)
IF d <> c THEN f = f + 1
textbox4.Text = Str(f)
END
PUBLIC SUB TextBox5_KeyPress()
 t AS String 
 l AS Integer 
 IF key.Code >= 48 AND key.Code <= 57 THEN 
  Textbox1.text = Textbox1.text
 ELSE IF key.Code = key.Return THEN 
  Button3.setfocus
  Button3.Default = TRUE
 ELSE IF key.Code = key.Backspace THEN 
  t = textbox1.Text
  l = Len(t)
  t = Left$(t, l)
  textbox1.Text = t
  'etwas widersinnige Funktion von Backspace
 ELSE IF key.Code = key.Delete THEN 
  Textbox1.Text = ""
 ELSE 
  STOP EVENT 
 ENDIF 
END
PUBLIC SUB Button3_KeyPress()
 IF key.Code = key.Return THEN Button2.setfocus
END

Lernprogramm für die Vergleichszeichen >< und ist gleich

[Bearbeiten]

Mit diesem kleinen Lernprogramm können Sie die Bedeutung der Vergleichszeichen trainieren

  • < kleiner als
  • > größer als
  • = ist gleich

Sie brauchen für das Programm eine grafische Form und

  • 5 Textboxen
  • 5 Commandbuttons

Die Form wurde F genannt. Sie können aber auch einfach den Namen Form1 beibehalten.

Das Programm erzeugt 2 Zufallszahlen. Diese werden verglichen und man muß das richtige Zeichen > oder < oder = wählen. Sie sollten die Commandbuttons folgendermassen bezeichnen:

  • Button1 = Ende
  • Button2 = Neue Aufgabe
  • Button3 = >
  • Button4 = "="
  • Button5 = <

Ändern Sie den Text der Commandbuttons im Eigenschaftswindow entsprechend um.

Das Programm vergleicht die Eingabe über die Tasten >,< und = mit dem korrekten Ergebnis in einem Unterprogramm bewertung und gibt das Ergebnis in einer der Textboxen aus. Diese Ergebnistextbox wurde bewert genannt. Sie müssen den Namen der Textbox mit F4 in den Eigenschaften entsprechend verändern.

Der Code dazu:

' Gambas class file
PUBLIC a AS Integer
PUBLIC b AS Integer
PUBLIC c AS Integer 
PUBLIC d AS Integer 
PUBLIC z AS Integer 
PUBLIC r AS Integer
PUBLIC f AS Integer
PUBLIC SUB Form_Open()
 z = 0
 r = 0
 f = 0
 TextBox2.Text = Str(z)
 TextBox4.Text = Str(f)
 TextBox3.Text = Str(r)
END
PUBLIC SUB Button1_Click()
 ME.Close
END
PUBLIC SUB Button2_Click()
 z = z + 1
 ' Zähler für die Zahl der Aufgaben
 Randomize()
   a = Int(Rnd(1) * 10)
   'Rem Zufalls Zahl holen
   b = Int(Rnd(1) * 10)
   'Rem zweite Zufallszahl holen
   IF a > b THEN c = 62
   ' Rem Ascii Code für Größer als
   IF a = b THEN c = 61
   IF a < b THEN c = 60
   textbox1.Text = " Vergleiche " & Str$(a) & " und " & Str$(b) & " und setzte das richtige Zeichen >,< oder = "
   textbox2.Text = Str(z)
END
PUBLIC SUB Button3_Click()
 d = 62
 'Ascii Code für > 
 bewertung
END
PUBLIC SUB Button5_Click()
d = 60
bewertung
END
PUBLIC SUB Button4_Click()
d = 61
bewertung
END
SUB bewertung ()
 IF d = c THEN bewert.Text = "Richtig: "  & Str$(a) & " " & Chr$(c) & " " & Str$(b)
 IF d = c THEN r = r + 1
 textbox3.Text = Str(r)
 IF d <> c THEN bewert.Text = "Falsch !! Richtig wäre gewesen "
 IF d <> c THEN bewert.Text = bewert.Text & Str$(a)& " " & Chr$(c) & " " & Str$(b)
 IF d <> c THEN f = f + 1
 textbox4.Text = Str(f)
END

Harry's Rechentrainer

[Bearbeiten]

ACHTUNG : Programm noch in Arbeit !!

Mit diesem Programm soll man die Grundrechnungsarten trainieren können.

Form und Steuerelemente

[Bearbeiten]

Sie brauchen dazu eine neue Form und

  • 2 Textboxen
  • 2 Textlabelfelder
  • 2 Commandbuttons
' Gambas class file
Zahl1 AS Integer
Zahl2 AS Integer 
Ergebnis AS Integer
Antwort AS Integer
PUBLIC SUB StartAdditionen_Click()
  Randomize() 
  Zahl1 = Int(10*Rnd())+1
  Zahl2 = Int(10*Rnd())+1
  Ergebnis = Zahl1+Zahl2
  Antwort = AntwortTextBox.Text
  AusgabeRechnungLabel.Text=Zahl1 &" + " &Zahl2 & " = "  'Anzeige der Rechnung
  TextLabelFedback.Text = Ergebnis 'Ausgabe nur zur Kontrolle
  AntwortTextBox.SetFocus
END
PUBLIC SUB OkButton_Click()
 IF Antwort = Ergebnis THEN
 TextLabelFedback.Text= "Richtig"
 ELSE
 TextLabelFedback.Text = "Falsch"
 ENDIF
END
PUBLIC SUB AntwortTextBox_keypress()
 IF key.Code=key.Enter THEN 
 TextLabelFedback.Text = Ergebnis 'Ausgabe nur zur Kontrolle
 ENDIF
END


Eine Datei herunterladen

[Bearbeiten]

Um eine Datei herunterzuladen verwendet man Http, für Gambas gibt es dementsprechend die Klasse HttpClient. Diese ermöglicht einem mit den beiden typischen Methoden Post und Get Websites anzufordern. Hier ein Beispiel welches eine Website herunterlädt und den Quellcode der Seite ausgibt (erfordert das Einbinden der Komponenten gb.net und gb.net.curl):

PUBLIC SUB Main()
  DIM contents AS String
  contents = getFile("http://gambas.sourceforge.net/")
  IF contents = NULL THEN 
    PRINT "Fehler beim herunterladen!"
  ELSE
    PRINT contents
  END IF
END

' Lädt eine Seite runter und gibt diese als String zurück
PUBLIC FUNCTION getFile(url AS String) AS String
  DIM h AS HttpClient
  DIM buffer AS String
  
  buffer = NULL
  h = NEW HttpClient AS "h"
  h.URL = url
  h.Get() ' Mit der Get-Methode die Website anfordern
  
  DO WHILE h.Status <> 0
    WAIT 0.01
  LOOP

  ' Wenn die Antwort OK ist gehts weiter
  IF h.Status >= 0 THEN
    ' Wenn die Datei was beinhaltet...
    IF Lof(h) THEN 
      ' lade sie runter -> in den string buffer
      READ #h, buffer, Lof(h)
    END IF 
  END IF

  RETURN buffer
END


Erweiterter Taschenrechner

[Bearbeiten]

Formular


' Gambas class file
PUBLIC ergebnis AS Variant
PUBLIC speicher AS Variant
PUBLIC rechz AS Byte
PUBLIC SUB Button1_Click()
 Textbox1.Text = textbox1.Text & "1"
END
PUBLIC SUB Button2_Click()
 Textbox1.Text = textbox1.Text & "2"
END
PUBLIC SUB Button3_Click()
 Textbox1.Text = textbox1.Text & "3"
END
PUBLIC SUB Button7_Click()
 Textbox1.Text = textbox1.Text & "4"
END
PUBLIC SUB Button8_Click()
 Textbox1.Text = textbox1.Text & "5"
END
PUBLIC SUB Button9_Click()
 Textbox1.Text = textbox1.Text & "6"
END
PUBLIC SUB Button13_Click()
 Textbox1.Text = textbox1.Text & "7"
END
PUBLIC SUB Button14_Click()
 Textbox1.Text = textbox1.Text & "8"
END
PUBLIC SUB Button15_Click()
 Textbox1.Text = textbox1.Text & "9"
END
PUBLIC SUB Button18_Click()
 Textbox1.Text = textbox1.Text & "0"
END
PUBLIC SUB Button19_Click()
 Textbox1.Text = textbox1.Text & ","
END
PUBLIC SUB Button4_Click()
 rechz=1
 ergebnis=Val(Textbox1.Text)
 Textbox1.Text=" "
END
PUBLIC SUB Button10_Click()
 rechz=2
 ergebnis=Val(Textbox1.Text)
 Textbox1.Text=" "
END
PUBLIC SUB Button16_Click()
 rechz=3
 ergebnis=Val(Textbox1.Text)
 Textbox1.Text=" "
END
PUBLIC SUB Button21_Click()
 rechz=4
 ergebnis=Val(Textbox1.Text)
 Textbox1.Text=" "
END
PUBLIC SUB Button22_Click()
 rechz=5
 ergebnis=Val(Textbox1.Text)
 Textbox1.Text=" "
END
PUBLIC SUB Button20_Click()
 IF rechz=1 THEN
   ergebnis=ergebnis + Val(Textbox1.Text)
   textbox1.Text=ergebnis
 ELSE IF rechz=2 THEN
   ergebnis=ergebnis - Val(Textbox1.Text)
   textbox1.Text=ergebnis
 ELSE IF rechz=3 THEN
   ergebnis=ergebnis * Val(Textbox1.Text)
   textbox1.Text=ergebnis
 ELSE IF rechz=4 THEN
   ergebnis=ergebnis / Val(Textbox1.Text)
   textbox1.Text=ergebnis
 ELSE IF rechz=5 THEN
   ergebnis=ergebnis ^ Val(Textbox1.Text)
   textbox1.Text=ergebnis
 CATCH
 message.Error("Bitte nicht durch 0 teilen!")
 END IF
END
PUBLIC SUB Button12_Click()
 ME.Close
END
PUBLIC SUB Button5_Click()
 speicher=" "
 textbox2.BackColor=&HD9ECEB&
END
PUBLIC SUB Button11_Click()
 textbox1.Text=speicher
END
PUBLIC SUB Button6_Click()
 rechz=0
 ergebnis=" "
 textbox1.Text=" "
END

Berechnung der Miete

[Bearbeiten]

‘Gambas class file
PUBLIC SUB Button1_Click()
 DIM a1 AS Integer
 a1 = Val(textbox1.Text)
 IF rb1.Value=TRUE THEN
  a1=a1*4
 ELSE IF rb2.Value=TRUE THEN
  a1=a1*7
 ELSE IF rb3.Value=TRUE THEN
  a1=a1*10
 END IF
 textlabel7.Text=a1
END
PUBLIC SUB Button3_Click()
  ME.Close
END
PUBLIC SUB Button2_Click()
 Textlabel7.Text=” “
 textbox1.Text=” “
 rb3.Value=TRUE
END
PUBLIC SUB Form_Open()
 ME.Caption=”Berechnung der Miete”  --- Überschrift des Fensters
END


Fahrenheit und Celsius Umrechner

' Gambas class file
' Fahrenheit und Celsius Umrechner
PUBLIC Ergebnis AS Variant
PUBLIC SUB Button1_Click()
ME.Close
END
PUBLIC SUB Button2_Click()
IF RadioButton1.Value= TRUE THEN ergebnis= Val(textbox1.Text)*9/5+32 
IF RadioButton2.Value= TRUE THEN ergebnis= (Val(textbox1.Text)-32)/9*5 
Label1.Text=ergebnis
END
PUBLIC SUB Button3_Click()
textbox1.Text=" "
Label1.Text=" "
END


Dies Programm ist ein einfacher Potenzrechner. Es nutzt das mathematische Zeichen ^ für die Hochrechnung. Beispiel: 23= 2*2*2 = 8

2^3 = 8 


' Gambas class file
PUBLIC SUB Button1_Click()
 DIM Pota1 AS Integer
 DIM Pota2 AS Integer
 DIM Pota3 AS Integer

 IF textbox2.Text = 0 THEN
   label1.Text = 1
 ELSE
   Pota1 = Textbox1.Text
   Pota2 = Textbox2.Text
   Pota3 = Pota1^Pota2
   label1.Text = Pota3
 END IF
END
PUBLIC SUB Button2_Click()
 Textbox1.Text =""
 Textbox2.Text ="" 
 label1.Text =""
END
PUBLIC SUB Button3_Click()
 ME.Close 
END


Es folgen zwei Beispiele zur Schleifenprogrammierung an Hand der Zinsrechnung.

Einfache Schleife

[Bearbeiten]
' Gambas class file
PUBLIC kapital AS Float
PUBLIC zins AS Float
PUBLIC dauer AS Integer
PUBLIC SUB Button3_Click()
 ME.Close  
END
PUBLIC SUB Button2_Click()
 Textbox1.text = ""  
 Textbox2.text = ""
 Textbox3.text = ""
END
PUBLIC SUB Button1_Click()
 DIM X AS Integer
 kapital=textbox1.Text
 zins=textbox2.text
 dauer=textbox3.Text
 FOR x = 1 TO dauer STEP 1
   kapital= kapital+(kapital*zins/100)
 NEXT
 label1.Text= "Endkapital " &  Round (kapital,-2) & " Euro"
END
PUBLIC SUB Label1_MouseDown() 
END
PUBLIC SUB Form_Open()
END

Erweitere Schleife

[Bearbeiten]
PUBLIC euro AS Float
PUBLIC prozent AS Float
PUBLIC SUB Button3_Click()
  ME.Close
END
PUBLIC SUB Button2_Click()
 Textbox1.Text = ""
 Textbox2.Text = ""
END
PUBLIC SUB Button1_Click()
 DIM Jahre AS Integer
 euro=Val(Textbox1.Text)
 prozent=Val(Textbox2.Text)
 DO WHILE euro < 1000000
   euro = euro+(euro*prozent/100) 
   Jahre=Jahre+1
 LOOP
 textlabel5.Text= "Nach " & Jahre & " Jahre sind sie Millionaer und haben ein Kapital von " & euro & " Euro."
END
PUBLIC SUB TextBox1_KeyPress()
END


Blutgasanalyse

[Bearbeiten]

Die Blutgasanalyse ist in der Medizin schnell und wichtig. Wie kann man die Meßwerte interpretieren ? Was noch fehlt ist der Lactatwert und die Hämoglobinwerte.

Der Programmcode

' Gambas class file
PUBLIC SUB Button7_Click()
ME.Close
END
PUBLIC SUB Button2_Click()
textbox1.text = 7
textbox2.text = 30
textbox3.text = -10
textbox4.text = 90
END
PUBLIC SUB Button3_Click()
textbox1.text = "7,6"
textbox2.text = 40
textbox3.text = 10
textbox4.text = 90
END
PUBLIC SUB Button6_Click()
textbox1.text = "7,4"
textbox2.text = 40
textbox3.text = 0
textbox4.text = 90
END
PUBLIC SUB Button4_Click()
textbox1.text = "7,4"
textbox2.text = 30
textbox3.text = 0
textbox4.text = 50
END
PUBLIC SUB Button5_Click()
textbox1.text = "7,1"
textbox2.text = 65
textbox3.text = 0
textbox4.text = 50
END
PUBLIC SUB TextBox1_KeyRelease()
 IF key.Code = key.Return THEN textbox2.setfocus
END
PUBLIC SUB TextBox2_KeyRelease()
IF key.Code = key.Return THEN textbox3.setfocus
END
PUBLIC SUB TextBox3_KeyRelease()
IF key.Code = key.Return THEN textbox4.setfocus
END
PUBLIC SUB TextBox4_KeyRelease()
IF key.Code = key.Return THEN button1.Default = TRUE
IF key.Code = key.Return THEN button1.setfocus
END
PUBLIC SUB Button1_Click()
' befehl3.SetFocus
DIM pc AS Float
DIM po AS Float
DIM be AS Float
DIM ph AS Float
DIM ergeb AS String
DIM b AS String
IF textbox1.text = "" THEN textbox1.text = 0
IF textbox2.text = "" THEN textbox2.text = 0
IF textbox3.text = "" THEN textbox3.text = 0
IF textbox4.text = "" THEN textbox4.text = 0
ph = Val(textbox1.text)
pc = Val(textbox2.text)
be = Val(textbox3.text)
po = Val(textbox4.text)
' PRINT ph,pc,be,po
ergeb = metabol(ph,pc,be)
b = sauerstoff(po,pc)
ergeb = ergeb & Chr$(13) & Chr$(10) & b
textarea1.text = ergeb
' PRINT ergeb
END
PUBLIC FUNCTION metabol(ph AS Float,pc AS Float,be AS Float) AS String
' Rem *****************************
' Rem * AUSSAGE 1 PH,BE,PCO2 *
' Rem *****************************
DIM a1 AS String
DIM a2 AS String
DIM a3 AS String
DIM a4 AS String
DIM a5 AS String
DIM a6 AS String
DIM a7 AS String
DIM a8 AS String
DIM a9 AS String
DIM a10 AS String
DIM a11 AS String
DIM a12 AS String
DIM e AS String
a1 = "Werte nicht mit dem Leben vereinbar"
a2 = "Metabolische Azidose " & Chr$(13) & Chr$(10) & "respiratorisch kompensiert Hyperventilation !"
a3 = "Metabolische Azidose nicht kompensiert"
a4 = "Respiratorische Azidose nicht kompensiert"
a5 = "Respiratorische + Metabolische Azidose "
a6 = "Hyperkapnie + Kompensatorische Alkalose"
a7 = "Ausgeglichener Säure Basen Haushalt "
a8 = "Metabolische Alkalose"
a9 = "Hyperventilation"
a10 = "Werte nicht plausibel "
a11 = "Hyperkapnie"
a12 = "metabolische Azidose"
' Rem * BEDINGUNGEN PH,BE,PCO2 *
IF be > 50 THEN 
e = a1 
RETURN e
ELSE IF be < -50 THEN 
e = a1
RETURN e
ELSE IF ph > 7.9 THEN 
e = a1
RETURN e
ELSE IF ph < 6.5 THEN 
e = a1
RETURN e
ELSE IF pc < 1 THEN 
e = a1
RETURN e
ELSE IF pc > 120 THEN 
e = a1
RETURN e
ELSE IF ph < 7.35 AND be > -4 AND pc < 35 THEN 
e = a10
RETURN e
ELSE IF ph < 7.45 AND be < -3 AND pc < 35 THEN 
e = a2
RETURN e
ELSE IF ph < 7.35 AND be < -3 AND pc > 35 THEN 
e = a3
RETURN e
ELSE IF ph < 7.35 AND be < 4 AND pc > 45 THEN 
e = a4
RETURN e
ELSE IF ph < 7.35 AND be < -3 AND pc > 45 THEN 
e = a5
RETURN e
ELSE IF ph > 7.34 AND be > 3 AND pc > 44 THEN 
e = a6
RETURN e
ELSE IF ph < 7.45 AND ph > 7.35 AND be > -5 AND be < 5 AND pc > 35 AND pc < 45 THEN 
e = a7
RETURN e
ELSE IF ph > 7.45 AND be > 3 THEN 
e = a8
RETURN e
ELSE IF ph > 7.45 AND be < -5 THEN 
e = a10
RETURN e
ELSE IF ph < 7.35 AND be < -5 THEN 
e = a12
RETURN e
ELSE IF pc < 36 THEN 
e = a9
RETURN e
ELSE IF pc > 44 THEN 
e = a11
RETURN e
END IF
END
PUBLIC FUNCTION sauerstoff(po AS Float,pc AS Float) AS String
DIM b AS String 
' Rem ******************************
' Rem * PO2 *
' Rem ******************************
IF po > 700 THEN 
b = "Werte nicht mit dem Leben vereinbar"
RETURN b
ELSE IF pc > 300 THEN 
b = "Werte nicht mit dem Leben vereinbar"
RETURN b
ELSE IF po < 1 AND pc < 1 THEN 
b = "Werte nicht mit dem Leben vereinbar"
RETURN b 
ELSE IF po < 1 THEN 
b = "Werte nicht mit dem Leben vereinbar"
RETURN b 
ELSE IF pc < 1 THEN 
b = "Werte nicht mit dem Leben vereinbar"
RETURN b 
ELSE IF po > 100 THEN 
b = "Hyperventilation durch Beatmung oder Sauerstoffgabe ??"
RETURN b
ELSE IF po < 55 AND pc < 35 THEN 
b = "Hypoxie und Hyperventilation Lungenembolie?"
RETURN b
ELSE IF po < 55 THEN 
b = "Hypoxie Beatmungspflichtig ?"
RETURN b
ELSE IF po < 75 THEN 
b = "Hypoxie "
RETURN b
ELSE IF pc > 50 THEN 
b = "Hyperkapnie "
RETURN b
END IF 
END
PUBLIC SUB ToggleButton1_Click()
DIM Help AS String
IF TextArea2.Visible = FALSE THEN 
ToggleButton1.Text = "Info weglöschen"
Help = "Autor: " & Chr(13) & Chr(10)
Help = "Rho = Reiner Hoffmann " & Chr(13) & Chr(10)
Help = Help & "www.madeasy.de" & Chr(13) & Chr(10)
TextArea2.Visible = TRUE
TextArea2.text = Help
ELSE 
TextArea2.Visible = FALSE
ToggleButton1.Text = "Info anschauen"
ENDIF
END
PUBLIC SUB Form_Open()
textbox1.setfocus
END

EKG-Befundung

[Bearbeiten]

In der Medizin muß man immer wieder dieselben Textbausteine zu einem Befund zusammenfügen. Um dies zu beschleunigen und einen sauber lesbaren Befund zu bekommen, wurde dieses Programm geschrieben.

Man braucht dazu:

  • Eine Klasse als Startklasse mit dem Namen t
  • 4 Formen

Code für die Klasse t:

' Gambas class file
STATIC PUBLIC t AS String
STATIC PUBLIC SUB Main()
form1.show 
END

Code für die Form1:

PUBLIC SUB Form_Open()
'Clipboard.Clear 
' Zwischenablage löschen. 
Textarea2.Visible = FALSE
Textarea2.Text = ""
ME.Text = "EKG - Befundung"
' Beim Beenden ist der Text im Zwischenspeicher, Leider nicht
textarea1.Text = ""
textarea1.Text = t.t 
END
PUBLIC SUB Button1_Click()
 Clipboard.Copy (Textarea1.Text)
 ME.Close
END
PUBLIC SUB Button2_Click()
textarea1.text = t.t 
Clipboard.Copy (Textarea1.Text)
END
PUBLIC SUB Button24_Click()
 t.t = t.t & "Sonst normales RuheEKG"
textarea1.Text = t.t
 Clipboard.Copy(t.t)
END
PUBLIC SUB Button3_Click()
  t.t = t.t & "Sinusrhythmus" & Chr(10)
END
PUBLIC SUB Button10_Click ()
t.t = t.t & "Herzfrequenz 50 - 60/min" & Chr(10)
END 
PUBLIC SUB Button11_Click ()
t.t = t.t & "Herzfrequenz 40 - 50/min" & Chr(10)
END 
PUBLIC SUB Button12_Click ()
 t.t = t.t & "==> Tachyarrhythmie" & Chr(10)
END
PUBLIC SUB Button13_Click ()
 t.t = t.t & "=> Bradyarrhythmie" & Chr(10)
END 
PUBLIC SUB Button14_Click ()
 t.t = t.t & "Normallagetyp, normales Ruhe EKG " & Chr(10)
 textarea1.Text = t.t
 Clipboard.Copy(t.t)
END
PUBLIC SUB Button15_Click ()
     t.t = t.t & "==> Tachykardie > 120/min " & Chr(10)
END
PUBLIC SUB Button16_Click ()
 t.t = t.t & "==> Bradykardie < 30/min  !!" & Chr(10)
END 
PUBLIC SUB Button17_Click ()
 t.t = t.t & "=> Bradykardie < 40/min" & Chr(10)
END 
PUBLIC SUB Button4_Click ()
 t.t = t.t & "Herzfrequenz 60 - 80/min" & Chr(10)
END 
PUBLIC SUB Button5_Click ()
 t.t = t.t & "Herzfrequenz 80 - 100/min" & Chr(10)
END 
PUBLIC SUB Button6_Click ()
 t.t = t.t & "==> Herzfrequenz 100 - 120/min !!" & Chr(10)
END 
PUBLIC SUB Button7_Click ()
 t.t = t.t & "Absolute Arrhythmie" & Chr(10)
END 
PUBLIC SUB Button8_Click ()
 t.t = t.t & "Vorhofflimmern" & Chr(10)
END 
PUBLIC SUB Button9_Click ()
 t.t = t.t & "Vorhofflattern" & Chr(10)
END 
PUBLIC SUB Button19_Click()
 t.t = t.t & "Linkslagetyp, normales Ruhe EKG " & Chr(10)
 textarea1.Text = t.t
 Clipboard.Copy(t.t)
END
PUBLIC SUB Button18_Click()
 t.t = t.t & "Steillagetyp, normales Ruhe EKG " & Chr(10)
 textarea1.Text = t.t
 Clipboard.Copy(t.t)
END
PUBLIC SUB Button20_Click()
   t.t = t.t & "==> Tachykardie > 150/min " & Chr(10)
END
PUBLIC SUB Button21_Click()
t.t = t.t & "einzelne Kammerextraschläge" & Chr(10)
END
PUBLIC SUB Button22_Click()
t.t = t.t & "einzelne Vorhofextraschläge" & Chr(10)
END
PUBLIC SUB Button23_Click()
'zur Rhythmusform
END
PUBLIC SUB Button25_Click()
  Textarea1.Text = ""
END
PUBLIC SUB Button27_Click()
  t.t = ""
END
PUBLIC SUB ToggleButton1_Click()
 DIM Help AS String
 IF TextArea2.Visible = FALSE   THEN 
 ToggleButton1.Text = "Info weglöschen"
 Help = "Rho = Reiner Hoffmann " 
 TextArea2.Visible = TRUE
 TextArea2.text = Help
 ELSE 
 TextArea2.Visible = FALSE
 ToggleButton1.Text = "Info anschauen"
ENDIF
END
PUBLIC SUB Button28_Click()
Textarea1.text = Textarea1.text &  "Dieses Programm wurde mit Gambas erstellt" & Chr(10)
Textarea1.text = Textarea1.text &  "Es dient der EKG Befundung." & Chr(10)
Textarea1.text = Textarea1.text &  "Angeklickte Kürzel werden zusammengeklebt."  & Chr(10)
Textarea1.text = Textarea1.text &  "Der Gesamttext wird im Zwischenspeicher abgelegt."  & Chr(10)
Textarea1.text = Textarea1.text &  "Mit STRG und V- Taste kann der Text "  & Chr(10)
Textarea1.text = Textarea1.text &  "an beliebiger Stelle in jedem anderen Programm eingefügt werden."
END
PUBLIC SUB Button26_Click()
Form1.Close
Form2.Show
END

RöntgenThoraxbefundung

[Bearbeiten]

LangzeitEKG-Befundung

[Bearbeiten]

Endoskopiebefundung

[Bearbeiten]

Ultraschallbefundung

[Bearbeiten]

Aufnahmebefund

[Bearbeiten]

Kurzarztentlassbrief

[Bearbeiten]

CT-Befundung

[Bearbeiten]

QT-Zeit

[Bearbeiten]

Umrechnung Herzfrequenz - RR Abstand

[Bearbeiten]

Gambas und SVG

[Bearbeiten]

Gambas sollte Unterstützung für SVG Icons und Grafiken haben. Bis jetzt finde ich nichts.

Nach Angaben im Changelog von Gambas kann das Picture Steuerelement SVG Dateien laden.

The Picture class can manage SVG files now ! Its interface has gained a Type property and behaves a bit differently.

Dies kann man mit der Picturebox überprüfen. Es funktioniert nicht, sondern nur für folgende Bildformate: JPEG, PNG, BMP, GIF und XPM. Siehe PictureLoad ( Bild Laden ) Gambas:_Bilder#Laden_Sie_ein_Bild_mit_Dialog_in_eine_Picturebox

Ein SVG File wird bislang nur als Textfile in eine Textarea geladen.

Vielleicht muß man die Gambas XML Komponenten dazuladen:

  • gb.xml.libxml - XML tools based on libxml
  • gb.xml.libxml.rpc - XML-RPC client based on libxml and libcurl
  • gb.xml.libxml.xslt - XSLT tools based on libxslt

Ich würde die Frage auch hier posten:

Quellen

[Bearbeiten]

Scalable Vector Graphics -- or SVG -- is the new XML-based graphics standard from the W3C that will enable Web documents to be smaller, faster and more interactive.

Siehe


Mit Gambas werden eine Reihe von Beispielprogrammen installiert. Diese kann man sich im Quelltext anschauen und dadurch über die Programmierung einiges lernen. Diese Programme sind aber für Anfänger meist schon zu schwer. Im folgenden werden diese Beispielprogramm in Miniprogramme zerlegt und kommentiert.

Siehe auch: [2]

Blights

[Bearbeiten]

Blights ist eine Blinkleiste mit mehreren kleinen Lichtern die per Zufall blinken.

Was kann man aus dem Programm lernen?

Wie bindet man eine Grafik ein?

[Bearbeiten]

Dazu ein einfaches Beispiel angelehnt an Blights.

Man startet ein neues Gambasprojekt blights0 und platziert auf der Form eine Picturebox und 2 Commandbuttons.

Dann gibt man folgenden Code ein:

PUBLIC SUB Button1_Click()
  PictureBox1.Picture = Picture["bloff.xpm"]
END

PUBLIC SUB Button2_Click()
  PictureBox1.Picture = Picture["blon.xpm"]
END

Startet man das Programm, dann passiert gar nichts, da die 2 Grafiken bloff.xpm und blon.xpm fehlen. Diese klaut man sich aus Blights und kopiert, sie sich ins eigene Projektverzeichnis.

Starten Sie Ihre Shell. Der Button mit der Muschel.

Gehen Sie in das Verzeichnis des obigen Projektes, etwa mit

cd gambas/blights0

Versuchen Sie dann zunächst folgendes:

locate bloff.xpm

Funktioniert dies nicht, weil das Programm locate bei ihnen nicht installiert ist, dann geben Sie stattdessen folgendes ein:

find / -name bloff.xpm 2>/dev/null

(Dabei ist dann allerdings etwas Geduld erforderlich.) Als Ausgabe erhalten Sie schließlich etwas in der Art:

/opt/gambas/share/gambas/examples/Basic/Blights/bloff.xpm
/usr/share/doc/packages/gambas/examples/Basic/Blights/bloff.xpm

Jetzt markieren Sie eines der Verzeichnise mit der Maus und können die Dateien kopieren. Dabei hilft Ihnen die Zwischenablage und das Einfügen mit der mittleren Maustaste bzw. der Rolltaste der Maus.

cp /opt/gambas/share/gambas/examples/Basic/Blights/bl* .

Sie sich mit einem Malprogramm eigene Bilder erstellen. Ein Trick wäre auch das Clipboard. Man kann die Blightsanzeige mit Strg und der der Drucktaste als Screenshot in den Zwischenspeicher laden und dann in einem Malprogramm die Bildchen ausschneiden.

Wie schaltet man eine Grafik an und aus?

[Bearbeiten]

Snake

[Bearbeiten]

Webbrowser

[Bearbeiten]

Datenbankanbindung

[Bearbeiten]