Gambas: Druckversion: Hilfe

Aus Wikibooks


Was kann man tun, wenn man beim Programmieren mit Gambas nicht mehr weiter kommt?

Mitgelieferte Hilfe-Funktion[Bearbeiten]

Bei jeder Gambas-Installation wird ein umfangreiches Hilfesystem mitinstalliert. Diesen Hilfebrowser kann man gut nutzen, wenn man bei Programmierproblemen nicht mehr weiter weiß. Mit F1 wird dieser Hilfe Browser aufgerufen:

Der Hilfebrowser von Gambas

Sehr brauchbar ist das alphabetische Verzeichnis der Gambas-Befehle. Oft findet sich zu einem Befehl auch ein kleines Beispielprogramm.

Sehr hilfreich ist auch der Aufruf der Komponenten im Hilfebrowser.

Klickt man beispielsweise die Komponete gb.qt an, so erhält man eine Übersicht aller Klassen dieser sehr wichtigen Gambas-Grafikkomponente.

Die Komponete gb.qt im Hilfebrowser

Jetzt kann man wieder durch das Anklicken der dort angebotenen Klassen weitere Hilfe erhalten.

Hat man beispielsweise die Klasse Clipboard angeklickt, erscheint eine Hilfetext zum Thema.

Dieser Text listet dann alle Eigenschaften (Properties), alle Methoden (Ereignisse) und alle Konstanten dieser Klasse auf.

Die Klasse Clipboard im Hilfebrowser

Ein Nachteil des Hilfebrowsers von Gambas ist, daß alle Texte in Englisch geschrieben sind.

Hilfe im Internet[Bearbeiten]

gambasdoc.org[Bearbeiten]

Der Hilfebrowser wird von den Gambas Nutzern selbst gepflegt und verbessert. Man kann ihn über gambasdoc.org im Internet aufrufen und alle Themen einsehen.

Diskussionsforen[Bearbeiten]

Unter dieser Webadresse findet man ein sehr umfassendes englischsprachiges Diskussionsforum zum Thema Gambas. Auch Benoit Minisini ist immer wieder in diesem Forum vertreten.

Hier entsteht derzeit ein deutschsprachiges Forum.

Gambas Wikibook FAQ[Bearbeiten]

Auch über das hier vorliegende Buch können Sie Hilfe zum Thema Gambas bekommen. Beschreiben Sie ihr Problem hier: Gambas: Fragen

Gambas Index[Bearbeiten]

Eine Suchmöglichkeit nach Stichworten für das Gambas Wikibook findet sich hier: Google Wikibook Gambas


Offene Fragen[Bearbeiten]

Wenn Sie Schwierigkeiten mit Gambas haben, schreiben sie ihr Problem einfach an den Ende dieses Textes. Aus Ihren Schwierigkeiten können andere lernen und man kann Lektionen und Beispiele entwickeln, die die Probleme klären. Lernen kann man am besten an überwundenen Problemen und in der Diskussion mit erfahrenen Nutzern, denen man beim Programmieren über die Schulter schauen kann.

Diskussionen zu Gambas finden sich auch hier im Netz: http://sourceforge.net/mailarchive/forum.php?forum=gambas-user

Einige der Fragen, die dort gestellt werden , sollen im folgenden Teil aufgearbeitet und dabei ins Deutsche übersetzt werden.


Gib es eine Möglichkeit mit Gambas eine Website zu steuern? Also z.B. mit Usernamen und Passwort einloggen und dort über einige Links weiter in ein feld text einfügen, eine natelnummer einfügen und anschließend den Link senden anklicken....

Cursor an das Ende eines Textes?[Bearbeiten]

Wie kann ich in einem TextArea den Cursor an das Ende des Textes setzen? ( TextArea1.Selection = Len(TextArea1.Text) funktionert nicht )

Antwort Siehe Gambas:_Textarea#Wie_kann_man_mit_dem_Cursor_an_das_Ende_des_Textes_in_der_Textarea_springen_.3F

PUBLIC SUB Button1_Click()
 textarea1.pos = Len(textarea1.text)
 'Der Cursor geht ans Ende des Textes 
END

Wie kann ich mehrere Variablen in eine Datei schreiben und bei Bedarf (z.B. Programmstart) wieder einlesen?[Bearbeiten]

Hier ist eine komplette, funktionierende Lösung. Damit werden 5 Textteile, die mit Kommas getrennt abgespeichert wurden, später wieder aufgerufen und den Feldern zugeordnet:

Das Speichern in eine Datei[Bearbeiten]

"ZusFeld" ist eine verdeckt angeordnete TextArea zur Aufnahme des Array. Sie wird mit dem String "ZUS" gefüllt. Der Inhalt des ersten Feldes ist die Variable für den Dateinamen "NAME". Im home-Verzeichnis des Nutzers ist danach die Datei "NAME" gespeichert, die als Inhalt die durch Komma getrennten Werte, der 5 Felder enthält.


Dim ZUS AS String
DIM NAME AS String

ZusFeld.Clear
ZUS = Name.Text & Chr(44) & Feld2.Text & Chr(44) & Feld3.Text & Chr(44) & Feld4.Text & Chr(44) & Feld5.Text & Chr(10)
ZusFeld.Text = ZUS 
NAME = Name.Text 
 
File.Save(system.home & "/" & NAME ,ZusFeld.Text)

Man kann die Felder auch mit Chr(10) trennen, um sie nachher mit LineInput einzeln einzulesen und anderen Variabeln zuzuordnen.

Das Laden der Werte aus der Datei[Bearbeiten]

Die ComboBox enthält in diesem Falle die Namen mehrerer Wertlisten. "Name.Text = name" an Stelle von "Name.Text = Liste[0]" würde durch die Variablenübernahme aus der ComboBox an dieser Stelle auch funktionieren.


DIM name AS String 
DIM Liste AS String[] 
DIM i AS Integer 

name = ComboBox2.Text 
ZusFeld.Text = File.Load(system.home & "/" & name)
Liste = Split(ZusFeld.Text , ",") 
FOR i = 0 TO 4 
Name.Text = Liste[0] 
Feld2.Text = Liste[1] 
Feld3.Text = Liste[2] 
Feld4.Text = Liste[3] 
Feld5.Text = Liste[4] 
NEXT 
END

Wie kann man das Clipboard = Zwischenablage für eine Grafikspeicherung nutzen?[Bearbeiten]

Wie kann ich abfragen welcher Tab in in einem Tabstrip aktiv ist?[Bearbeiten]

Testformular besteht aus einen Button, einem Tabstrip und einer Textbox. In der Textbox steht nach dem klick auf den Button dann der Name des aktiven Tabs.

PUBLIC SUB Button1_Click()
 Textbox1.Text = Tabstrip1.Text
END

Was bedeutet das h in vielen GambasCode Beispielen?[Bearbeiten]

'Gambas class file
PRIVATE §hProcess AS Process

First, I suggest putting comments before the code they explain. I think it is the tradition.

  • "h" tells you that the variable will receive an object handle.
    • h sagt einem, dass die Variable ein Objekt handle bekommen wird
  • "Process" tells you that it will be a process.
    • Process besagt, dass dieses handle von einem Prozess sein wird.
  • And the type of the variable confirms that it will be an object of Process class.
    • Und der TYP der Variablen bestätigt, es wird ein Objekt einer Prozess-Klasse.

Wie kann ich die Größe von Fonts feststellen ?[Bearbeiten]

how can i get the actuell pixel values of font.heigth and font.width (in same pixelvalue as

ME.x and ME.y) so i can set an correct size to button or labels

x=font.width("This is an teststring to see how many pixels this string are long")
y=font.height("H")
That is device dependent (i.e. it"s different between the screen 
and the printer) so you use Draw.TextHeight and Draw.TextWidth 
to get those values.  I think you might have to have a 
Draw.Begin active when you call those methods.

Wie kann man eine Zeile in einem Editor teilen und wieder zusammenfügen?[Bearbeiten]

From: Maria Graciela Cesar <mgcesar@ya...> how cut a line in editor? Wie kann man eine Zeile in einem Editor teilen und wieder zusammenfügen? 2004-10-21 03:50

Hi everybody. I have been using gambas for a while and I still can find the way to do the next: I wanna write a sentence in several lines. In visual basic you can use the connectors + and &. So you write a long line in several lines. I dont know if you can do this in gambas (and if it"s a stupid question) Thanks

Ich möchte gern einen Satz aus mehreren Zeilen zusammenbauen. In VB kann man dazu die Befehle + und & benutzen. So kann man eine lange Zeile aus mehreren kurzen zusammenbauen. Kann man das auch in Gambas ?

Antwort: Im Prinzip ja , aber: Das Pluszeichen + wird in Gambas nur für mathematische Operationen benutzt. Alle String( = Text)additionen werden mit dem & Zeichen durchgeführt.

Beispiel:

 Print "Dies ist ein Satz" & " der mit einem Nebensatz ergänzt wurde." 
 Print 3 + 5

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

Wie kann man eine Funktion im Terminal Modus programmieren?[Bearbeiten]

Bei der Programmierung von Funktionen im Terminal Modus kommt es immer wieder zu Fehlermeldungen. Im Grafikmodus funktioniert es einwandfrei.

Vergleiche http://de.wikibooks.org/wiki/Gambas:_Erste_Schritte#Drittes_Programm:_Programme_im_Terminalfenster_ohne_Grafik

Wie kann man in eine Textbox nur mit Grossbuchstaben schreiben?[Bearbeiten]

Hallo ! Ich habe ein echtes Problem, an dem ich schon mehrere Stunden hänge und auch im Internet nichts gefunden habe.....

Ich möchte in eine Textbox nur mit Grossbuchstaben schreiben. Wenn ich also z.B. "a1b2c3d" eingebe, soll in der Textbox "A1B2C3D" erscheinen... Wie macht man sowas?

Erster Hinweis http://www.madeasy.de/7/prgklein.htm

Im Terminalmdous schaut ein Programmcode für Ucase und Lcase so aus:

STATIC PUBLIC SUB Main()
DIM a AS String 
a = "Test"
PRINT a
PRINT LCase(a)
PRINT UCase(a)
END

Ergebnis im Direktfenster:

Test
test
TEST

Etwas schwieriger ist es möglicherweise, die Zahlen von den Buchstaben zu trennen. Aber Gambas bezieht Ucase und Lcase offensichtlich nur auf Buchstaben nicht auf Zahlen, wie folgendes Beispiel zeigt:

' Gambas class file

STATIC PUBLIC SUB Main()
DIM a AS String 
a = "Test1234"
PRINT a
PRINT LCase(a)
PRINT UCase(a)
END

Ergebnis im Direktfenster:

Test1234
test1234
TEST1234

Es ist etwas schwieriger, wenn die Großschreibung direkt bei der Eingabe auftauchen soll. Leicht kann man es sich machen, wenn man erst die Eingabe auch mit kleinen Buchstaben erlaubt und dann den ganzen Text zb einer Textbox mit Ucase hochsetzt und weiterverarbeitet.

Man braucht einen Commandbutton und eine Textbox, um das Programm in gang zu bringen. Das Beispiel läuft im Grafikmodus.

PUBLIC SUB Button1_Click()
DIM gros AS String
gros = TextBox1.Text 
' Zu ändernde Zeichenfolge. 
Texboxt1.Text = UCase$(gros) 
' In Großbuchstaben ändern. 
END

Vielleicht geht es auch noch einfacher:

PUBLIC SUB Button1_Click()
Textbox1.Text = UCase$(Textbox1.Text) 
END

Und siehe da, es klappt.

Als einfachste Lösung ist es das CHANGE Event zu nutzen:

PUBLIC SUB textbox_Change()
textbox.text = UCase$(textbox.text)
END

Das Change Event wird bei jeder veränderung der textbox aufgerufen und schreibt den Text gleich in Großbuchstaben. Damit sind zusätzliche Buttons oder ähnliches nicht nötig, da der Text sofort umgewandelt wird.

Direktausgabe Fenster verkleinern[Bearbeiten]

Wie kann man das Direktausgabefenster und das Formfenster bei automatisch ablaufenden Programmen aus dem Code heraus, so platzieren, dass sie sich nicht überlappen.

Ein einfacher Trick ist das Formularfenster im Entwurfsmodus von links oben nach rechts zu verschieben. Oder Sie geben

PUBLIC SUB Form_Open()
 ME.X = 500
 ME.Y = 1
END

In Ihren Code ein. Wie man das Direktfenster kleiner bekommt, weiß ich auch nicht.

Neues Verzeichnis anlegen, Verzeichnis kopieren[Bearbeiten]

Wie kann man unter Gambas

  • ein Verzeichnis erstellen
  • ein Verzeichnis kopieren

Copy .. to ... klappt ja leider nur bei Dateien. Mit Dir(...,"*.*") bekommt man auch nur die Dateien.

Da die Gambas GUI auch mit Gambas erstellt wurde und für jedes Gambasprojekt ein neues Verzeichnis erstellt wird, ist es prinzipiell möglich, dies zu machen. Nur wie?

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 im offenen Gambasprojet Fenster ein 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 "/home/ihrname/test"
END

Ersetzen Sie den Pfad ihrname mit Ihrem eigenen Verzeichnisnamen.

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.

PUBLIC SUB Button1_Click()
 TRY MKDIR "/home/ihrname/test"
 IF ERROR THEN
   message.box("Mist, hat nicht geklappt!")
 ENDIF
END

Verzeichnis 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 "/home/ihrname/.gambas/gambas.conf" TO "/mnt/save/gambas.conf.save"

Ersetzen Sie in dem Beispiel ihrname durch den Namen ihres 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 Gambas: Dateien

Wie ganze Verzeichnisse mit Gambas2 kopiert oder verschoben werden können wird nachstehend geschildert:

Wir benötigen eine Form mit zwei DirView Anzeigen für die Auswahl des Quell- und des Zielverzeichnisses. Des weiteren benötigen wir 4 Befehlsbutton.

Mit dem ersten Button kopieren wir alle Dateien des ausgewählten Verzeichnisses. Mit zweiten Button werden nur die neueren Dateien kopiert und mit dem dritten wird ein Verzeichnis an eine andere Stelle verschoben. Der vierte Button dient lediglich zum Beenden des Programmes.

Da Gambas mit dem copy-Befehl keine vorhandenen Dateien überschreibt, wird für die Kopie aller Dateien ein eventuell bereits vorhandenes Zielverzeichnis zunächst gelöscht. Anschließend werden die Dateien kopiert.

Aus Zeitgründen ist es bei großen Verzeichnissen sinnvoll, nur neuere Dateien zu kopieren. Für diesen Fall werden die Dateien im Zielverzeichnis nicht gelöscht. Erkennt Gambas, dass eine Datei schon vorhanden ist, werden die Daten der letzten Speicherung miteinander verglichen. Ist die zu kopierende Datei neuer als die vorhandene, wird die vorhandene Datei gelöscht und durch die neuere ersetzt.

Das Verschieben eines Verzeichnisses erfolgt wie das Kopieren aller Dateien. Es wird lediglich zusätzlich das Quellverzeichnis gelöscht.

Hier ist der komplette Code der Form:

 PUBLIC SUB Form_Open()
   DirView1.Root = "/"  'angezeigtes Startverzeichnis
   DirView2.Root = "/"
 END 
 PUBLIC SUB cmdEnd_Click()
   ME.close  
 END
 PUBLIC SUB cmdCopyAll_Click()
   ' wenn vorhanden: Zielverzeichnis löschen
   BasisModule.Folder_delete(DirView2.Current & DirView1.Current)
   ' Quellverzeichnis in das Zielverzeichnis kopieren
   BasisModule.Folder_kopieren(DirView1.Current, DirView2.Current)
 END
 PUBLIC SUB cmdCopyNew_Click()
   ' Quellverzeichnis in das Zielverzeichnis kopieren
   ' nur neuere Datein werden kopiert
   BasisModule.Folder_kopieren(DirView1.Current, DirView2.Current)
 END
 PUBLIC SUB cmdMove_Click()
   ' wenn vorhanden Zielverzeichnis löschen
   BasisModule.Folder_delete(DirView2.Current & DirView1.Current)
   ' Quellverzeichnis in das Zielverzeichnis kopieren
   BasisModule.Folder_kopieren(DirView1.Current, DirView2.Current)
   ' Quellverzeichnis löschen
   BasisModule.Folder_delete(DirView1.Current)
 END

Des weiteren wird ein Modul mit dem Namen BasisModule benötigt, indem sämtliche Routinen für die obigen Aufgaben hinterlegt sind. (Die Routinen können auch in der Form enthalten sein, ich denke mit dem Modul ist es übersichtlicher) Erzeugen Sie das Modul und kopieren Sie den nachfolgenden Code.

 ' Gambas module file
 PUBLIC SUB Folder_kopieren(folderFrom AS String, folderTo AS String)
 DIM file AS String
 DIM fileTemp AS String
 DIM info AS stat
 DIM info1 AS stat
 DIM fileFrom AS String
 DIM fileTo AS String
 DIM folderTemp AS String[]
 DIM j AS Integer
 FOR EACH file IN RDir(folderFrom, "*")
   fileFrom = folderFrom & "/" & File
   fileTo = folderTo & fileFrom
   TRY COPY fileFrom TO fileTo
   IF ERROR.Code = 38 THEN  ' Datei ist vorhanden 
      'Überprüfung ob Quell- oder Zieldatei neuer ist 
      info = Stat(fileFrom)   
      info1 = Stat(fileTo)
      IF info.LastModified > info1.LastModified THEN
         ' Quelldatei ist neuer
         ' Zieldatei wird gelöscht
         KILL fileTo
         ' Quelldatei kopieren
         COPY fileFrom TO fileTo
      END IF
   END IF    
   IF ERROR.Code = 45 THEN  'Ziel-Verzeichnisse existieren nicht
       folderTemp = Split(fileTo, "/")
       FOR j = 0 TO folderTemp.Count - 2
           fileTemp = fileTemp & "/" & folderTemp[j]
           TRY MKDIR Right$(fileTemp, Len(fileTemp) - 1)
           TRY COPY fileFrom TO fileTo
      NEXT
   END IF
   fileTemp = ""
 NEXT
 END
 PUBLIC SUB File_delete(folder AS String)
 DIM file AS String
 DIM file_ AS String
 'alle Dateien löschen
   FOR EACH file IN RDir(folder, "*")  ' *.* nur Dateien mit Endung werden gelöscht  
   file_ = folder & "/" & File         ' * auch Dateien ohne Endung werden gelöscht
   TRY KILL file_ 
 NEXT
 END 
 PUBLIC SUB Folder_delete(folder AS String)
 DIM file AS String
 DIM file_ AS String
 DIM folderTemp AS String[]
 DIM i AS Integer
   ' zunächst alle Dateien löschen
   File_delete(folder) 
   ' alle Unterverzeichnisse löschen 
   FOR EACH file IN RDir(folder)
     file_ = folder & "/" & File
     folderTemp = Split(file_, "/")
     TRY RMDIR file_
     IF error.code = 0 AND file_ = folder THEN
        RETURN 
     END IF    
     IF error.code = 0 THEN ' Verzeichnis wurde gelöscht
       i = 1
       DO
           'versuchen das oder die Elternverzeichnis zu löschen
           file_ = Left(file_, Len(file_) - Len(folderTemp[folderTemp.Count - i]) - 1)
           TRY RMDIR file_
           IF error.code = 0 AND file_ = folder THEN 
               RETURN 
           END IF     
           i = i + 1
       LOOP UNTIL error.code = 42 OR error.code = 38 'Verzeichnis nicht leer
     END IF
   NEXT
 END

Wie kann man das Home Verzeichnis des aktuellen Benutzers abfragen?[Bearbeiten]

Der Befehl Application.home funktioniert dazu leider nicht. Auch 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

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.

Wie nutzt man den DateDiff Befehl?[Bearbeiten]

... I don"t know how to call the DateDiff() function. Could somebody give me a short example?

Of which class DateDiff is a method?

Der DateDiff Befehl stammt aus Visual Basic. Er errechnet die Differenz zwischen 2 Datumseingaben. Man braucht dazu die Gambas gb.vb Komponente Siehe Gambas: Komponenten

Anführungszeichen um einen Text herum[Bearbeiten]

Ich möchte gern eine Textausgabe erzeugen, die mit Anführungszeichen eingeschlossen wird. Beispiel:

Aus /home/user/file_name.asm soll "home/user/file_name.asm" werden. Wie geht das?

Lösung:

button1.text = chr(34) & "home/user/file_name.asm" & chr(34)

Gambas Editor, nicht dokumentierte Funktionen[Bearbeiten]

Hallo, ich arbeite an einem kleinen Programm, das den GambasEditor nutzt. Leider ist dieser in der Gambas Hilfe kaum dokumentiert. Wer kann mir folgende Eigenschaften und Methoden erklären:

  • - Frozen
  • - Highlight
  • - Lineheight
  • - Positions
  • - Showchange
  • - Showcurrent
  • - Showproc
  • - Symbols
  • - Userelief
  • - Analyze
  • - Ensurevisible

Tabindex in gambas[Bearbeiten]

Wie funktioniert die Tabtaste in einer Form? Kann man die Reihenfolge der angesprungenen Steuerelemente verändern? Gibt es so etwas wie den Tabindex in VB?

Am besten arbeitet man mit dem Befehl:Setfocus

Beispiel: Man hat mehrere Textboxen und man möchte eine mit der Tabtaste überspringen.

PUBLIC SUB TextBox1_KeyPress()
Textbox2.SetFocus
END

Laut B.Minisini heißt der "TabIndex" in Gambas ZOrder. Diese ZOrder verändert man über die IDE.

Beispiel: Beim Erstellen der Form die Textbox markieren. Dann rechte Maus Taste im Menü > “Anordnung“ > “In den Vordergrund“ klicken nächste Textbox auswählen. in der selben Reihenfolge wird dann mit Tabtaste gesprungen.

Die ZOrder ist keine Object Eigenschaft (textBox im obigen Beispiel).

Wenn man die ZOrder mittels Code ändern will, muß man die Raise() oder Lower() Methode der Control Klasse benutzen.

Eine andere Möglichkeit, den Durchlauf des Fokus bei der Betätigung der Tabulatortaste zu beeinflussen: Man verläßt Gambas und öffnet das zu verändernde Formular mit einem Editor (Dateiname: Formularname.form im entsprechenden Projektverzeichnis). Hier ist der XML-Quelltext zu sehen. Jetzt ändert man die Reihenfolge der Objekte entsprechend der gewünschten Tabulator-Durchlaufreihenfolge, indem ein kompletter Block eines Objektes mit seinen Eigenschaften, verschoben wird. Ein Block ist an den geschweiten Klammern zu erkennen. Hier muß darauf geachtet werden, den Block nicht außerhalb eines übergeordneten Blockes (beispielsweise durch einen Rahmen entstanden) zu verschieben. Gambas arbeitet den Quelltext in Bezug auf die ZOrder von oben nach unten ab. Diese Methode hat gegenüber der eher unübersichtlichen Methode über die Gambas-IDE den Vorteil, bei Formularänderungen, wo beispielsweise nur ein Feld hinzugefügt wird, nicht noch einmal für alle Objekte die Ordnung festlegen zu müssen

Beispiel (ZOrder/TabIndex: 1.Nachname, 2.Vorname):

 { Nachname TextBox
   Move(128,32,448,24)
   Text = ("")
 }
 { Vorname TextBox
   Move(128,80,448,24)
   Text = ("")
 }

Umsortiert (ZOrder/TabIndex: 1.Vorname, 2.Nachname):

 { Vorname TextBox
   Move(128,80,448,24)
   Text = ("")
 }
 { Nachname TextBox
   Move(128,32,448,24)
   Text = ("")
 }

Zip Files[Bearbeiten]

Wie kann man mit Gambas auf ein Archiv (zip, tar, Jar etc.) bzw. auf die darin enthaltenen Dateien zugreifen kann?

Antwort siehe Gambas: Kompression

Processabfrage mit Gambas[Bearbeiten]

Wenn man den output eines Befehles der Process_Read() enthält, auslesen will, dann bekommt man nur einen Prompt ( Eingabe ) zurück.

Beispiel:

SHELL command WAIT FOR READ WRITE AS myProcess
PUBLIC SUB Process_Read()
'        reads the line into a variable
'
        if the variable is "user prompt:" then
                WRITE getUserInput()
        end if
 END

Dieses Beispiel funktioniert nicht, wie kann man es funktionstüchtig bekommen?

Wie funktionieren Hotkeys?[Bearbeiten]

Wenn man Hotkeys in einem Projekt nutzen will, wird man vielleicht folgenden Code benutzen:

Public sub Form_KeyPress ()

If key.code = ... then
Something happens

Leider funktioniert das nicht richtig. Ist die Form leer, dann klappt es. Sind andere Steuerelemente vorhanden, funktioniert es nicht mehr. Wieso???

Bis jetzt gibt es kein Interface für globale Unterbrechungen mit dem Keyevent ( Tastenereignis) in QT. QT liegt Gambas zugrunde.

Dennoch gibt es einen Trick, um das Problem zu lösen.

Wenn man ein Menu in der Form angelegt hat, dann funktionieren die Tastenkürzel des Menüs auch global. Man kann also ein verstecktes Menu zur Form hinzufügen, in welches man die gewünschten Hotkeys einfügt.

Siehe Gambas: Menü

Image in Picture umwandeln und umgekehrt[Bearbeiten]

In Gambas gibt es 2 Möglichkeiten Bilder zu bearbeiten: Image und Picture Was ist der Unterschied zwischen beiden? Wie kann man ein Image in ein Picture umwandeln und umgekehrt? Das Problem tritt zum Beispiel auf wenn man den Inhalt des Zwischenspeichers (in diesem fall ein Bild) in Gambas darstellen will? Siehe Gambas: Bilder

Wie kann man den Inhalt einer DrawingArea wieder einem Image zuordnen?[Bearbeiten]

Eurozeichen in Gambas[Bearbeiten]

Wenn man ein Euro Zeichen in eine TextArea einliest und dann folgendes versucht

t$ = Conv$(TextArea.Text, Desktop.Charset, "ISO-8859-1")

bekommt man die Fehlermeldung "Bad string conversion".

Lösung: Das Eurozeichen existiert im Zeichensatz ISO-8859-1 nicht, erst in ISO-8859-15 ist es zu finden

Kann man in Gambas wie in VB mit den Zeichen $ etc deklarieren?[Bearbeiten]

IF zeile compiliert nicht in einer Zeile . Wieso?[Bearbeiten]

Folgender Befehl IF x = 3 THEN TRY MKDIR "temp_folder" compiliert nicht in einer zeile . Wieso passiert das?

Replacebefehl[Bearbeiten]

Warum funktioniert folgender Code nicht?

Dim a as string
Dim b as string
a = "Test"t"
b= Replace$(a, """, "\"")

b sollte "Test\"t" werden

Das Zeichen \ ist ein spezielles Zeichen. Versuchen Sie


b= Replace$(a, """, "\\"")

Siehe Gambas:_Textbearbeitung#Der_Replace_Befehl_-_Zeichenersetzen

Programmierbares Hilfesystem?[Bearbeiten]

Gibt es unter Gambas ein programmierbares Hilfesystem wie zb .chm in vb?

Nein, nicht direkt. Dafür bietet GNU/Linux einige Möglichkeiten

  • das KDE Hilfe System,
  • das GNOME Hilfe System,
  • man pages ( der Konqueror stellt sie sehr schön dar!)
  • html Seiten, die direkt einen Webbrowser aufrufen

Dialog Pfad merken[Bearbeiten]

Wie kann man es erreichen, daß sich Gambas den einmal geöffneten Dialog Pfad merkt?

Siehe zb Gambas:_Bilder#Laden_Sie_ein_Bild_mit_Dialog_in_eine_Picturebox

Datenbank: Variablen mit Feldname statt Feldname?[Bearbeiten]

Wenn man eine Datenbank öffnet, kann man mit einem Result-Handle auf die einzelnen Felder zugreifen, insbesondere mit der .edit-methode. Leider scheint der Result-Handle nur Namen zu unterstützen, aber keine Variablen.

Beispiel (nicht lauffähig, nur zur Demonstration):


DIM name AS String
DIM sFeldVorname AS String="vorname"
DIM sFeldNachname AS String="nachname"
.
.
sql_string = "SELECT * FROM kunde WHERE vorname LIKE " & name
.
.
rs = cn.EXEC(sql_string)
rs!sFeldVorname="Hugo"
rs!sFeldnachname="Müller"

---
Die Felder 'vorname' und 'nachname' existieren im Table.
Das SQL-Statement ist nur zur Demonstration, real funktioniert es auch mit der .edit-Methode nicht. rs!vorname und rs!nachname funktionieren, wenn aber deren Werte in den Variablen 'sFeldVorname' bzw. 'sFeldNachnache' übergeben werden sollen, nicht.
Wie verwendet man also Variablen als Feldname ?
Schon mal als Try&Error abgetan: rs!"Feldname",rs!["Feldname"],rs![Feldname],rs!(Feldname),rs!("Feldname")

Eine Lösung könnte folgerndermaßen aussehen:
rs[Feldname] einfach das Rufzeichen und die Anführungszeichen weglassen.


Gambas[Bearbeiten]

Lernprogramme Basic[Bearbeiten]


Wenn Sie eine Programmidee oder einen Programmwunsch haben, denn Sie selbst nicht in Gambas realisieren können, weil Sie keine Zeit oder nicht genügend Gambas Know How haben, dann schreiben Sie es hier her.

Vielleicht findet sich ja jemand , der das Ganze realisiert.

Abbildung: Der kleine g und der große G

Irgendwie fühlte sich der kleine g bei seiner Arbeit ständig beobachtet.

Ich würde gern einen Index erstellen.[Bearbeiten]

Wie kann ich dies realisieren?

Was soll der Index indizieren ? Eine Datenbank ? Etwas genauere Informationen sind notwendig um hier zu helfen.

-Der Index soll ebenso wie die Gambas Hilfe ein Tutorial in einem Hilfefenster anzeigen.

Unter http://de.wikibooks.org/wiki/Gambas:_Html steht ein Gambas Html Browser. Wenn man die Hilfeseiten als HTML Seiten erstellt, kann man ihn schön als Hilfetutorial nutzen.

Zeilen oder Zeichenkette aus Datei ausschneiden[Bearbeiten]

Ich lese eine ganze Datei mit READ ein und suche später nach einen bestimmten String. Bei dessen auftreten lese ich die ganze Zeile ein. Nun möchte ich diese Zeile löschen und die nachfolgende an die vorherige Zeile anfügen, sodaß meine Datei nicht unnötig groß wird. Läßt sich dies mit den derzeitigen Befehlscode bewerkstelligen? Ich finde auch keinen Befehl mit dem ich eine bestimmte Zeile ansprechen kann, um an diese noch einen Zeichenstring anzuhängen.

Rho: Ich fange einmal an das Problem zu zerlegen. Als erstes habe ich den READ Befehl genauer beschrieben.

Siehe http://de.wikibooks.org/wiki/Gambas:_Datei#Daten_einlesen_mit_READ

Zur weiteren Lösung des Problems müßte es aber etwas konkreter beschrieben werden. Ein Beispiel wäre hilfreich.


Benötigt werden: CommandButton, TextArea und ID.txt-File.

Als Bsp folgendes Programm:


 i AS Integer
 ii AS Integer
 hfile AS File
PUBLIC SUB Form_Open()
OPEN "ID.txt" FOR READ AS #hFile
 READ #hFile,tar1.Text,Lof(hFile)                        
END
PUBLIC SUB cmd1_Click()
  i = Instr(tar1.Text, "A")
  IF i > 0 THEN
  ii = Instr(tar1.Text, "\n",i)
  IF ii > 0 THEN 
    tar1.Text = Mid(tar1.Text,i,ii-i)
  ENDIF
 ENDIF
END


In "ID.txt" stehen mehrere Zeichenstrings mit je nachfolgendem CR. Nun möchte ich einen davon ausschneiden. Jedoch den geänderten Text nicht in einer TextArea ablegen, sondern wieder in ID.txt abspeichern. Fehlermeldung bei öffnen der File mit CREATE oder WRITE kommt ein "Access Forbitten". Zugriffsrechte der File wurden aber auf "all" gesetzt. Gibt es Befehle die dies vereinfachen, oder besser gesagt an benötigte Zeile springen diese ausschneiden und nachfolgende Zeile hochrücken?


Weiteres Beispiel wäre:
ListBox, CommandButton

txt as String
PUBLIC SUB cmd1_Click()
 txt = libx1[0].Text
 libx1.Remove(0)
END
PUBLIC SUB Form_Open()
  libx1.Add("aaaaa\n")
  libx1.Add("bbbbb\n")
  libx1.Add("aaaaa\n")
  libx1.Add("bbbbb\n")
  libx1.Add("aaaaa\n")
END


Dies scheint mir die Beste Möglichkeit zu sein, jedoch erhebt sich die Frage welche Methode die geringste Bearbeitungszeit benötigt oder das Programm verlangsamt sollte die ListBox auch noch angezeigt werden. Die Liste könnte dabei sogar bis über 100 Einträge beinhalten.


Das Gambas Wikibook als Html Buch auf dem eigenen Rechner[Bearbeiten]

Man kann sich das Gambas Wikibook recht einfach als verknüpfte HTML Seiten auf dem eigenen Rechner einrichten.

Verzeichnis /wiki/ einrichten[Bearbeiten]

Damit die Verknüpfung korrekt funktioniert müssen Sie auf ihrem Rechner ein Verzeichnis /wiki einrichten. Öffnen Sie dazu unter KDE eine Konsole, und erstellen Sie dort ein Verzeichnis:

mkdir /home/BENUTZER/wiki

Dabei BENUTZER jeweils durch Ihren Benutzernamen ersetzen. Anschließend in das neue Verzeichnis wechseln:

cd /home/BENUTZER/wiki

Alle Dateien aus dem Wikibook Gambas kopieren[Bearbeiten]

Dann kopieren Sie aus dem Wikibook die folgende Datei in dieses Verzeichnis:

wget -nv -O index.html 'http://de.wikibooks.org/w/index.php?title=Spezial%3APrefixindex&namespace=0&from=Gambas'

Aus dieser Datei die Adressen der restlichen Seiten extrahieren und downloaden:

wget -nv -c $(cat index.html | tr '"' '\n' | egrep '^/wiki/Gambas' | sort -u | sed 's#^#http://de.wikibooks.org#')  

Zum Schluss die Links anpassen:

for i in $(ls); do sed 's#href="/wiki/Gambas#href="./Gambas#g' $i > $i.temp; mv $i.temp $i; done

Dann können Sie die Übersicht als Gambas Hilfebrowser auf ihrem Rechner einrichten. Um immer die neuesten Seiten aus dem GambasWikibook herunterzuladen, wiederholen Sie die letzten drei Schritte.

Gambas-Programm[Bearbeiten]

Das zuvor beschriebene Verfahren funktioniert schon recht gut, ist aber unbequem. Und schließlich ist dies hier ein Lehrbuch zur Gambas-Programmierung, was also könnte näherliegen, als ein entsprechendes Programm zu schreiben.

Erstellen Sie mit dem Wizard ein neues grafisches Projekt, nennen Sie es Wikibook_Download, wählen Sie einen Speicherort und schließen sie den Wizard ab.

Erstellen Sie eine neue Form Form1. Platzieren Sie die folgenden Steuerelemente auf der Form:

  • 4 Button
  • 2 TextLabel
  • 2 TextBox
  • 1 TextArea
  • 1 ProgressBar

Zuletzt noch das Codefenster öffnen und den folgenden Quellcode einfügen: Wikibook Download Form1.class

Wikibook Download

Dann können Sie das Programm starten.

Aufruf über den Konqueror[Bearbeiten]

Das Ganze wird dann über den Konqueror aufgerufen. Auch andere Wikibücher können Sie so lokal auf Ihrem Rechner verfügbar machen.

Richten Sie dazu auf Ihrem Desktop die Seite /wiki/Gambas mit der rechten Maustaste als Neu erstellen, Datei und Verknüpfung zu Adresse (URL) ein. Geben Sie unter der Adresse /home/BENUTZER/wiki/Gambas ein.

Vielleicht suchen Sie sich dann noch ein schönes Symbol bei den Eigenschaften heraus.

Unter Windows funktioniert der Aufruf mit dem Explorer nicht korrekt.