Gambas: Druckversion: Hilfe
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:
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.
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.
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.
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!)
- Geben Sie einmal man:/ an Ihrer Konqueroradressleiste ein.
- Siehe auch: Linux-Praxisbuch:_Linux_auf_dem_Desktop#Web-Browser
- 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]- Die Gambas Seite (englisch)
- Gambas Playground Online Programmieren
- Gambasforum
- Online-Buch zur Version 3.9 (Stand Juli 2017)
- Guter Übersichtsartikel in LinuxUser (April 2005)
- Älterer Übersichtsartikel in LinuxUser (November 2002)
- Einiges zum Thema Gambas in Deutsch, Miniprogramme
- Eine Einführung mit einem simplen Beispiel (zur Version 0.64)
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
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.