Auch in diesem Projekt werden die Themen 'Prozess-Steuerung' und 'Prozess-Daten' im Zusammenhang mit dem Einsatz der Instruktionen SHELL und EXEC aufgegriffen. Es wird die Basis für eine GUI für den interaktiven Konsolen-Client 'mysql' vorgestellt.
Abbildung 21.3.5.1: Basis-GUI für das Konsolen-Programm 'mysql'
Sie können das Projekt in vielfältiger Weise zu Ihrer GUI für den Konsolen-Client 'mysql' ausbauen, die sich an den zu bearbeitenden Aufgaben sowie an den eigenen Vorstellungen orientiert. Folgende Erweiterungen wären denkbar:
In diesem Projekt können Sie nicht nur den Konsolen-Client 'mysql' einsetzen, sondern auch die Konsolen-Clients 'sqlite3' für SQLite3 oder 'psql' für Postgres-Datenbanken, sofern Sie diese Clients installiert haben.
Abbildung 21.3.5.2: Basis-GUI für das Konsolen-Programm 'sqlite3'
In den folgenden Abschnitten wird der Konsolen-Client 'mysql' eingesetzt:
Abbildung 21.3.5.3: GUI nach dem Start des Clients 'mysql'
Nach dem Start des externen Programms 'mysql' sehen Sie den Namen des externen DB-Clients und die PID des gestarteten Prozesses sowie den Begrüßungstext des Datenbank-Clients in der Ausgabe-Komponente. Danach arbeiten Sie wie in einer normalen Konsole – mit dem Unterschied, dass Sie jetzt alle Ausgaben mit dem Gambas-Programm unter den o.a. Aspekten von Programm-Erweiterungen bearbeiten können:
Abbildung 21.3.5.4: Anzeige einer Abfrage – Client 'mysql'
Einige Besonderheiten kennzeichnen das vorgestellte Projekt:
Wie bei allen Komponenten üblich, wurde auch der HistoryBox von den Autoren ein Icon spendiert, das Sie in der IDE im Fenster Eigenschaften unter 'Form' sehen. Das Icon muss im Projektverzeichnis in einem unsichtbaren Ordner .hidden/control als Bild vom Typ 'png' eingefügt werden, damit es in der IDE im virtuellen Ordner 'Projekt' zu sehen ist.
Abbildung 21.3.5.5: Der DB-Client wurde beendet
Es gibt einige Programme – wie die vorgestellten DB-Clients – die ihre Fehlerausgaben permanent auf die Standard-Ausgabe umlenken. Somit entfällt bei diesen Programmen diese Prozedur:
Public Sub myProcess_Error(sFehler As String) ' … End ' myProcess_Error(..)
Der Quelltext wird vollständig angegeben:
' Gambas class file Private $hProcess As Process ' Private sDBClientName As String = "sqlite3" ' Private sStartParameter As String = "" Private sDBClientName As String = "mysql" Private sStartParameter As String = "-f -n -vvv -u root -pYourMySQLPassword4SQLRoot" Public Sub Form_Open() FMain.Center FMain.Resizable = True FMain.Arrangement = Arrange.Vertical txaOutput.Expand = True txaOutput.Clear HBoxSpacing.Height = 8 HBox.Spacing = True HBox.Height = 24 pDynamicPanel.Expand = True txbHistoryEingabe.Foreground = Color.Gray txbHistoryEingabe.Alignment = Align.Center txbHistoryEingabe.Text = "*** SQL-Anweisung eingeben und mit ENTER-Taste aktivieren ***" txbHistoryEingabe.ReadOnly = True txbHistoryEingabe.History = New History(50) SetLEDColor("orange") End ' Form_Open() Public Sub btnProcessStart_Click() ProcessStart() FMain.Text = "Datenbank-Client " & Upper(sDBClientName) & " : PID = " & $hProcess.Id txbHistoryEingabe.Alignment = Align.Normal End ' btnProcessStart Public Sub btnTextAreaClear_Click() txaOutput.Clear txbHistoryEingabe.SetFocus End ' btnTextAreaClear Public Sub btnClose_Click() FMain.Close End ' btnClose_Click() '******************************************************************************************* Public Sub ProcessStart() Dim sCommand As String txbHistoryEingabe.Foreground = Color.Black txbHistoryEingabe.Clear txaOutput.Clear sCommand = sDBClientName & Chr(32) & sStartParameter $hProcess = Shell sCommand For Input Output As "myProcess" txaOutput.Insert(gb.NewLine) txbHistoryEingabe.ReadOnly = False txbHistoryEingabe.SetFocus btnProcessStart.Enabled = False SetLEDColor("green") End ' ProcessStart() Public Sub myProcess_Read() Dim sPuffer As String txaOutput.Insert(gb.NewLine) sPuffer = "" Read #$hProcess, sPuffer, Lof($hProcess) Select sDBClientName Case "mysql" sPuffer = Replace(sPuffer, "mysql>", "System-User: " & User.Name & " # >" & gb.NewLine) Case "sqlite3" sPuffer = Replace(sPuffer, "sqlite>", gb.NewLine & "System-User: " & User.Name & \ " # >" & gb.NewLine) End Select txaOutput.Insert(sPuffer & gb.NewLine) End ' hProcess_Read() ' Public Sub myProcess_Error(sFehler As String) ' Diese Prozedur kann entfallen, da Fehler-Ausgaben sowohl beim MySQL-Client ' als auch beim SQLite3-Client intern auf die Standard-Ausgabe umgelenkt werden! ' End ' myProcess_Error(..) Public Sub myProcess_Kill() txaOutput.Insert(gb.NewLine) txaOutput.Foreground = Color.Red txaOutput.Insert("Rückgabewert vom Programm '" & sDBClientName & "' = " \ & $hProcess.Value & gb.NewLine) Select Case $hProcess.State Case 0 txaOutput.Insert("Prozess (PID = " & $hProcess.Id & ") wurde normal beendet." & gb.NewLine) Case 1 txaOutput.Insert("Prozess (PID = " & $hProcess.Id & ") wurde gestoppt!" & gb.NewLine) Case 2 txaOutput.Insert("Prozess (PID = " & $hProcess.Id & ") wurde beendet!" & gb.NewLine) End Select ' $hProcess.State SetLEDColor("red") End ' myProcess_Kill() Public Sub WriteToMyProcess(sInput As String) If $hProcess Then If $hProcess.State = $hProcess.Running Then Print #$hProcess, sInput Endif ' Running ? Endif ' Process started ? End ' WriteToMyProcess(sInput As String) Public Sub txbHistoryEingabe_Activate() If txbHistoryEingabe.Text = "" Then Return ' txbHistoryEingabe.Text = Trim(txbHistoryEingabe.Text) ---> Das erledigt die History-Box selbst WriteToMyProcess(txbHistoryEingabe.Text) ' txbHistoryEingabe.Clear ---> Das erledigt die History-Box selbst End ' txbHistoryEingabe_Activate() Public Sub txaOutput_Change() txaOutput.Pos = Len(txaOutput.Text) ' ---> Sprung in die letzte Zeile End ' txaOutput_Change() Public Sub SetLEDColor(sLEDColor As String) PictureBox1.Picture = Picture["LED/led_" & sLEDColor & ".svg"] End ' SetLEDColor(..) Public Sub Form_Close() If $hProcess Then txaOutput.SetFocus txaOutput.Clear txaOutput.Insert(gb.NewLine) $hProcess.Kill() Wait 2 Endif ' $hProcess ? End ' Form_Close()