Inhaltsverzeichnis

5.8.1 Optionen und Argumente bei Gambas-Programmen

Für die Arbeit mit Optionen und Argumenten bei Gambas-Programmen, die dem Gambas-Interpreter gbx3 übergeben werden, stellt Gambas spezielle Klasseneigenschaften, eine Klasse und eine Komponente bereit:

5.8.1.1 Klasse Args

Diese Klasse Args (gb) implementiert ein Array, das die an ein Gambas-Programm auf der Konsole übergebenen Argumente enthält. Diese Klasse verhält sich wie ein statisches Nur-Lese-Array. Die folgende For-Each-Kontrollstruktur zum Beispiel durchläuft alle Argumente der Argument-Liste:

Dim sElement AS String
For Each sElement In Args
  Print sElement
Next

Den Programm-Namen ermitteln Sie zum Beispiel über das erste Element im Array Args (Index = 0):

Dim sArgumentPN As String 
sArgumentPN = Args[0] ' Programm-Name

Die native Klasse Args der Komponente gb verfügt nur über drei Eigenschaften:

EigenschaftDatentypBeschreibung
AllString[]Gibt eine Kopie aller Argumente als String-Array zurück.
CountIntegerGibt die Anzahl der in der Konsole übergebenen Argumente zurück.
MaxIntegerGibt Args.Count - 1 zurück.

Tabelle 5.8.1.1.1 : Eigenschaften der Klasse Args (gb)

Mit diesen Anweisungen

Print "Anzahl der Array-Elemente = "; Args.Count
Print "Liste aller Argumente:"
Print Args.All.Join(" | ")

sehen Sie nach dem Programm-Start diese Ausgaben in einer Konsole:

hans@linux:~$ gbx3 $HOME/E/ColorSelectA2 -- 50 120 30 
Anzahl der Array-Elemente = 4 
Liste aller Argumente: 
ColorSelectA2 | 50 | 120 | 30 
hans@linux:~$ 

5.8.1.2 Ausgewählte Eigenschaft der Klasse Application der Komponente gb

Von der Klasse Application interessiert im Zusammenhang mit Argumenten für Gambas-Programme nur die Eigenschaft Application.Args, die ein Array vom Daten-Typ Args (→ Kapitel 5.8.1.1) zurück gibt, das nur ausgelesen werden kann.

5.8.1.3 Komponente Args

Die Komponente gb.args ermöglicht Ihnen:

Die Klasse Args verfügt über diese fünf Methoden:

MethodeBeschreibung
Static Sub Begin ( [ Usage As String ] )Startet die Programm-Argument-Analyse. Usage ist ein optionaler Parameter, der einen Programm-Hilfetext repräsentiert.
Static Function End ( ) As String[]Beendet die Programm-Argument-Analyse und liefert alle Argumente, die nicht als Option interpretiert werden können, in einem String-Array.
Static Function Get ( ShortName As String, LongName As String [ , Description As String, ArgName As String ] ) As StringDie Funktion definiert eine Option vom Typ String, deren Parameter den Namen der Option (Kurz- und Lang-Format) und optional eine Beschreibung der Option enthält.
Static Function GetFloat ( ShortName As String, LongName As String [ , Description As String, ArgName As String, Default As Float ] ) As FloatDie Funktion definiert eine Option vom Typ Float, deren Parameter den Namen der Option (Kurz- und Lang-Format) und optional eine Beschreibung der Option sowie einen Vorgabewert enthält.
Static Function GetInteger ( ShortName As String, LongName As String [ , Description As String, ArgName As String, Default As Integer ] ) As Integer Die Funktion definiert eine Option vom Typ Integer, deren Parameter den Namen der Option (Kurz- und Lang-Format) und optional eine Beschreibung der Option sowie einen Vorgabewert enthält.
Static Function Has ( ShortName As String, LongName As String [ , Description As String ] ) As BooleanDie Funktion definiert eine Option ohne Parameter.

Tabelle 5.8.1.3.1 : Methoden der Klasse Args

Hinweise:

Es gilt – in Abhängigkeit von den Funktionsparametern der in der oberen Tabelle aufgeführten Funktionen – folgende Beschreibung:

5.8.1.4 Beispiel

Der folgende Quelltext ist ein Ausschnitt aus dem Quelltext eines Projekts, das im Kapitel 5.8.3 vorgestellt wird:

[1] Public sShape As String 
[2] Public aArguments As Variant[]
[3] 
[4] Public Sub Form_Open()  
[5]   FMain.Center 
[6]   FMain.Caption = "Gambas-Programm '" & Application.Name & "' mit 1 Option und 3 Argumenten" 
[7] 
[8]   Args.Begin(SetHelpContent()) 
[9]   ' Deklaration einer Gambas-Programm-Option: shape 
[10]     sShape = Args.Get("s", "shape", "StartPunkt? (j)a oder (n)ein", "j|n") 
[11]   aArguments = Args.End() ' Args.End() = Array der 'echten' Programm-Argumente  
[12] 
[13] *** 
[14]  
[15]   If Not sShape And aArguments.Count = 0 Then 
[16]      SetDefaultArguments() 
[17]   Else 
[18]      SetOptionAndArguments() ' Inklusive Analyse der Option und der 3 Argumente 
[19]   Endif 
[20]   
[21]   ShowMap() 
[22] End ' Form_Open() 
[23] 
[24] Private Function SetHelpContent() As String 
[25]   Dim sUsage As String 
[26]   
[27]   sUsage = gb.NewLine 
[28]   sUsage &= "Führt ein Gambas-Programm aus, um Karten von OpenStreetMap anzuzeigen" & gb.NewLine 
[29]   sUsage &= gb.NewLine 
[30]   sUsage &= "Aufruf: " & "gbx3 ProjektPfad " & "-- [Optionen] [-- <Breite> <Länge> <Zoom>]" 
[31]   sUsage &= "Usage : " & "gbx3 ProjectPath " & "-- [options]  [-- <latitude> <longitude> <zoom>]" 
[32]   sUsage &= gb.NewLine 
[33]   sUsage &= "Syntax:" & gb.NewLine 
[34]   sUsage &= "gbx3 ProjektPfad -- -s [j|n] [-- LAT LON ZOOM] (ohne °Einheit)" & gb.NewLine 
[35]   sUsage &= "gbx3 ProjektPfad -- --shape [j|n] [-- LAT LON ZOOM]" & gb.NewLine 
[36]   sUsage &= gb.NewLine 
[37]   sUsage &= "Format für die geografischen Koordinaten Breite (LAT) und Länge (LON)" & gb.NewLine 
[38]   sUsage &= "Dezimalgrad -90° < Breite° " & String.Chr(8804) & " +90°" 
[39]   sUsage &= " | -180° < Länge° " & String.Chr(8804) & " +180°" & gb.NewLine 
[40]   sUsage &= gb.NewLine 
[41]   sUsage &= "Beispiel 1: gbx3 $HOME/Map -- -s j -- 52,787969 11,752522 15" & gb.NewLine 
[42]   sUsage &= "Example 2 : gbx3 $HOME/Map -- --shape n -- 0.02 -90.01 7" & gb.NewLine & gb.NewLine 
[43]   sUsage &= "Der Zoom-Faktor liegt im Intervall: 1 " & String.Chr(8804) & " ZOOM " & \ 
[44]              String.Chr(8804) & " 18 ( ZOOM " & String.Chr(8714) & " Integer )." 
[45]   
[46]   Return sUsage 
[47]   
[48] End ' Function SetUsage()

Zur Demonstration ist an der Stelle *** dieser Quelltext-Abschnitt eingefügt worden:

' Kontrolle:
  Print "Wert der Option 'Shape' = "; sShape
  For i = 0 To Args.End().Max
    Print i + 1; ". Argument: Wert = "; Args.End()[i]
  Next
  Print "-----------------------------"
  For Each sElement In aArguments
    Print "Wert des Arguments = "; sElement
  Next

Kommentar:

Interessant ist die Syntax der folgenden Zeile:

hans@linux:~$ gbx3 $HOME/E/OSMapA -- --shape j -- 52.7904 1.0200 9 

Das sind die (alternativen) Aufrufe und die Ausgabe in der Konsole:

hans@linux:~$ gbx3 $HOME/E/OSMapA -- -s j -- 52.7904 1.0200 9
hans@linux:~$ gbx3 $HOME/E/OSMapA -- -shape j -- "52.7904" "1.0200" "9"  → Alternativer Aufruf
Wert der Option 'Shape' = j 
1. Argument: Wert = 52.7904 
2. Argument: Wert = 1.0200 
3. Argument: Wert = 9 
----------------------------- 
Wert des Arguments = 52.7904 
Wert des Arguments = 1.0200 
Wert des Arguments = 9 
hans@linux:~$ 

So rufen Sie die Programm-Hilfe auf:

hans@linux:~$ gbx3 $HOME/E/OSMapA -- --help 
hans@linux:~$ gbx3 $HOME/E/OSMapA -- -h 

Führt ein Gambas-Programm aus, um Karten von OpenStreetMap anzuzeigen 

Aufruf: gbx3 ProjektPfad -- [Optionen] [-- <Breite> <Länge> <Zoom>] 
Usage : gbx3 ProjectPath -- [options]  [-- <latitude> <longitude> <zoom>] 

Syntax: 
gbx3 ProjektPfad -- -s [j|n] [-- LAT LON ZOOM] (ohne °Einheit) 
gbx3 ProjektPfad -- --shape [j|n] [-- LAT LON ZOOM] 

Format für die geografischen Koordinaten Breite (LAT) und Länge (LON) 
Dezimalgrad -90° < Breite° ≤ +90° | -180° < Länge° ≤ +180° 

Beispiel 1: gbx3 $HOME/Map -- -s j -- 52,787969 11,752522 15 
Example 2 : gbx3 $HOME/Map -- --shape n -- 0.02 -90.01 7 

Der Zoom-Faktor liegt im Intervall: 1 ≤ ZOOM ≤ 18 ( ZOOM ∊ Integer ). 

Options: 
 -s --shape <j|n>                       StartPunkt? (j)a oder (n)ein 
 -V --version                           Display version 
 -h --help                              Display this help 
hans@linux:~$ 

Mehr war nach diesem Aufruf als Ausgabe auch nicht zu erwarten:

hans@linux:~$ gbx3 $HOME/E/OSMapA -- --version 
0.1.28 
hans@linux:~$

Auf zwei Besonderheiten bei der Eingabe von Optionen und Programm-Argumenten soll mit Beispielen kurz eingegangen werden.

Beispiel 1:
Da alle Argumente als Zeichenkette eingelesen werden, ist es bei bestimmten Zeichen in der Konsole notwendig, diese innerhalb der Zeichenkette zu maskieren:

hans@linux:~$ gbx3 $HOME/E/OSMapB -- --modus s -- 52°47\'20\'\'N 11°45\'36\'\'E 13 
hans@linux:~$ gbx3 $HOME/E/OSMapB -- --modus s -- "52°47'20''N" "11°45'36''E" "13" 

Beispiel 2:
Wenn eine Option definiert wurde, dann müssen Sie die zwei Doppelstriche vor der Liste der Optionen eingeben – auch dann, wenn Sie die fehlende Eingabe einer Option im Quelltext explizit behandeln:

hans@linux:~$ gbx3 $HOME/E/OSMapA -- -- 52.7904 1.0200 9 
Die Option 'shape' wird von 'nicht-definiert' auf j(a)  gesetzt. 
hans@linux:~$ 

Download