Die vorgestellten drei Projekte nutzen in unterschiedlichen Varianten einfache und verschachtelte Collections.
Das erste Projekt nutzt zwei Klassen mit erstaunlichen Ergebnissen und könnte die Basis für viele Projekte sein, bei denen eine Funktion interaktiv über eine geeignete Eingabe-Komponente (→ TextBox) bereitgestellt wird.
Es wird eine Zeichenkette – die eine mathematische Funktion repräsentiert – eingelesen sowie eine reelle Zahl als Argument x. Der Funktionswert f(x) wird berechnet und ausgegeben:
Abbildung 7.5.1.1.1: Programmoberfläche (Ausschnitt) für das Projekt 1
Public Function f(myFunction As String, x As Float) As Float Dim cContext As New Collection cContext["x"] = x Return Eval(myFunction, cContext) End ' f(..) ' Kürzere Alternative: ' → Inline-Collection ' Public Function f(myFunction As String, x As Float) As Float ' Return Eval(myFunction, ["x": x]) ' End ' f(..) Public Sub btnCalculate_Click() Print "f("; vbArgument.Value; ") = "; f(txbFunction.Text, vbArgument.Value) End ' btnCalculate_Click()
Ausgabe:
f(0,123456) = -0,16957085489025
So richtig praxisnah wird es, wenn man nicht die Funktionswerte einer Funktion sondern einer Funktionsklasse berechnen kann. Dafür muss die Funktion im Funktionsterm mindestens einen Parameter enthalten.
Das folgende Projekt setzt im Quelltext wieder auf die Verwendung der Klasse Collection und im Gegensatz zum Projekt 1 jetzt aber auf die Klasse Expression:
' Gambas class file Public Sub Form_Open() vlbParamA.Type = vlbParamA.Number vlbParamA.SetFocus vlbParamB.Type = vlbParamB.Number vlb_X.Type = vlb_X.Number vlb_Y.Type = vlb_Y.Number vlb_Y.ReadOnly = True ' Initialisierung - Startwerte (Funktion, 2 Parameter): txbFKlasse.Text = "a*sin(x)-cos(b*x)+Pi(0.25)" ' Vorgabe-Funktion vlbParamA.Value = +0.125 vlbParamB.Value = -2.5 vlb_X.Value = 0.525 End ' Form_Open() Public Sub btnShowResult_Click() ComputeY() End ' btnComputeY_Click() Public Sub btnClose_Click() FMain.Close End ' btnClose_Click() Private Function Compute(sExp As String, fParamA As Float, fParamB As Float, f_X As Float) As Float Dim fFunktionswertY As Float Dim cEnvironment As New Collection Dim myExpression As New Expression ' ALTERNATIVE: ' cEnvironment.Add(fParamA, "a") ' cEnvironment.Add(fParamB, "b") ' cEnvironment.Add(f_X, "x") cEnvironment["a"] = fParamA ' Dem Symbol a wird der Wert vlbParameterA.Value zugewiesen cEnvironment["b"] = fParamB ' Dem Symbol b wird der Wert vlbParameterB.Value zugewiesen cEnvironment["x"] = f_X ' Dem Symbol x wird der Wert vlbArgumentX.Value zugewiesen myExpression.Environment = cEnvironment myExpression.Text = sExp Try fFunktionswertY = myExpression.Value If Error Then Message.Error("Fehlertext: " & gb.NewLine & Error.Text) Else Return fFunktionswertY Endif ' ERROR ? End ' Function(..) Public Sub ComputeY() vlb_Y.Value = Compute(txbFKlasse.Text, vlbParamA.Value, vlbParamB.Value, vlb_X.Value) End ' btnComputeY_Click()
Abbildung 7.5.1.2.1: Programmoberfläche für das Projekt 2
Ein Paradebeispiel für die Verwendung von Collections ist die Komponente gb.settings. Die gesamte Settings-Datei, die von einer Instanz der Settings-Klasse verwaltet wird, ist intern in einer Zwei-Ebenen-Hierarchie von Collections enthalten.
Es wird vereinfachend angenommen, dass die Konfigurationsdatei *.conf bereits vorhanden ist und nur ausgelesen sowie angezeigt werden soll. Es kann empfohlen werden, sich den adaptierten Quelltext im vorgestellten Projekt mehrfach genau durchzulesen, um die Wirkung der zwei relevanten Prozeduren zu ergründen.
Sie finden das vollständige Projekt als Archiv im Download-Bereich.
Abbildung 7.5.1.3.1: Programmoberfläche für das Projekt 3