Zum Inhalt springen

Gambas: Fragen

Aus Wikibooks



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.