AllBASIC Forum
BASIC Developer & Support Resources => Interpreters => Topic started by: JRS on January 14, 2011, 03:03:47 PM
-
It doesn't look like there is much interest in my VB6 under Linux presentation so I thought I would chat about Gambas instead. If you like VB classic, you're going to love Gambas. (sorry Windows users) Here is a chart building example to introduce some of the language concepts and use.
(http://gambasdoc.org/image/:logo)
Gambas (http://gambas.sourceforge.net/en/main.html) is a Basic development environment supporting the Basic programming language with object extensions. It includes an IDE, a BASIC compiler, an interpreter, an archiver and a graphical user interface component. Gambas is an interpreted language, with no "just-in-time" or other compilation to native code at all. Although not intended to be a Visual Basic clone, it has a visual rapid application development interface like VB. With Gambas, you can quickly design your program GUI with QT or GTK+, access MySQL, PostgreSQL, Firebird, ODBC and SQLite databases, pilot KDE applications with DCOP (http://api.kde.org/3.5-api/kdelibs-apidocs/dcop/html/index.html), translate your program into any language, create network applications easily, make 3D OpenGL applications, make CGI web applications, and so on...
What Is Gambas? (http://gambasdoc.org/help/doc/release?view) (VB on X)
Online Documentation (http://gambasdoc.org/help/)
Gambas vs.Visual Basic (http://gambasdoc.org/help/doc/diffvb) (Differences between the language implementations)
Supported operating systems include Linux and FreeBSD, OpenBSD.
(http://files.allbasic.info/Gambas/Gambas_chart_entry.png)
Entry Form Class
' Gambas class file
PUBLIC SUB btnClose_Click()
ME.Close
END
PUBLIC SUB btnDraw_Click()
DIM total AS Integer
total = 10
WITH FormChart
.value = NEW Float[]
.total = total
.value.Resize(total + 1)
TRY .value[1] = Val(textbox1.Text)
TRY .value[2] = Val(textbox2.Text)
TRY .value[3] = Val(textbox3.Text)
TRY .value[4] = Val(textbox4.Text)
TRY .value[5] = Val(textbox5.Text)
TRY .value[6] = Val(textbox6.Text)
TRY .value[7] = Val(textbox7.Text)
TRY .value[8] = Val(textbox8.Text)
TRY .value[9] = Val(textbox9.Text)
TRY .value[10] = Val(textbox10.Text)
.Show
END WITH
END
PUBLIC SUB Form_Open()
END
PUBLIC SUB TextBox6_KeyPress()
END
FormData.form
# Gambas Form File 2.0
{ Form Form
MoveScaled(29.75,16.375,50.375,43.25)
Text = ("Chart example")
Border = Window.Fixed
{ TextLabel1 TextLabel
MoveScaled(3,2,6.75,3.25)
Text = ("Data 1")
}
{ TextLabel2 TextLabel
MoveScaled(3,6,6.75,3.25)
Text = ("Data 2")
}
{ TextLabel3 TextLabel
MoveScaled(3,10,6.75,3.25)
Text = ("Data 3")
}
{ TextLabel4 TextLabel
MoveScaled(3,14,6.75,3.25)
Text = ("Data 4")
}
{ TextLabel5 TextLabel
MoveScaled(3,18,6.75,3.25)
Text = ("Data 5")
}
{ TextLabel6 TextLabel
MoveScaled(3,22,6.75,3.25)
Text = ("Data 6")
}
{ TextLabel7 TextLabel
MoveScaled(3,26,6.75,3.25)
Text = ("Data 7")
}
{ TextLabel8 TextLabel
MoveScaled(3,30,6.75,3.25)
Text = ("Data 8")
}
{ TextLabel9 TextLabel
MoveScaled(3,34,6.75,3.25)
Text = ("Data 9")
}
{ TextLabel10 TextLabel
MoveScaled(3,38,6.75,3.25)
Text = ("Data 10")
}
{ TextBox1 TextBox
MoveScaled(11,2,14,3)
Text = ("")
}
{ TextBox2 TextBox
MoveScaled(11,6,14,3)
Text = ("")
}
{ TextBox3 TextBox
MoveScaled(11,10,14,3)
Text = ("")
}
{ TextBox4 TextBox
MoveScaled(11,14,14,3)
Text = ("")
}
{ TextBox5 TextBox
MoveScaled(11,18,14,3)
Text = ("")
}
{ TextBox6 TextBox
MoveScaled(11,22,14,3)
Text = ("")
}
{ TextBox7 TextBox
MoveScaled(11,26,14,3)
Text = ("")
}
{ TextBox8 TextBox
MoveScaled(11,30,14,3)
Text = ("")
}
{ TextBox9 TextBox
MoveScaled(11,34,14,3)
Text = ("")
}
{ TextBox10 TextBox
MoveScaled(11,38,14,3)
Text = ("")
}
{ btnDraw Button
MoveScaled(30,2,19,4)
Text = ("&Draw it")
}
{ btnClose Button
MoveScaled(30,7,19,4)
Text = ("&Close")
}
}
(http://files.allbasic.info/Gambas/Gambas_chart.png) (http://files.allbasic.info/Gambas/Gambas_about.png)
Chart Class
' Gambas class file
' ======================================
' This example is to make a bar chart
' using DrawingArea
' may be it can help you to make a chart
' if you have any question you can send to
' yudi@kecoak.or.id
' Thank You
PUBLIC total AS Integer
PUBLIC value AS Float[]
PUBLIC SUB btnClose_Click()
ME.Close
END
PUBLIC SUB _new()
ME.Center
END
PUBLIC SUB Form_Open()
Draw_Chart
END
PUBLIC SUB Draw_Chart()
DIM i AS Integer
DIM skala_1 AS Integer
DIM skala_2 AS Integer
DIM distance_x AS Float
DIM distance_y AS Float
DIM width_draw AS Integer
DIM tot AS Integer
DIM colors AS Integer[]
DIM bottom AS Integer
DIM sumdata AS Integer
colors = NEW Integer[]
colors.Resize(total + 1)
FOR i = 1 TO total
sumdata = sumdata + value[i]
NEXT
IF sumdata = 0 THEN sumdata = 1
FOR i = 1 TO total
value[i] = (value[i] / sumdata) * 10
NEXT
drwchart.Clear
draw.Begin(drwchart)
skala_1 = drwchart.ClientH / 11
distance_y = drwchart.ClientH - skala_1
bottom = distance_y + 8
FOR i = 0 TO 100 STEP 10
draw.ForeColor = color.black
draw.Text(i, 0, distance_y)
draw.Line(25, distance_y + 8, drwchart.clientw, distance_y + 8)
distance_y = distance_y - skala_1
NEXT
draw.Line(30, 0, 30, drwchart.ClientH)
skala_2 = (drwchart.ClientW - 30) \ 10
distance_x = skala_2 + 30
width_draw = skala_2 / 2
FOR i = 1 TO Total
draw.LineWidth = 1
draw.ForeColor = color.Black
draw.Text(i, distance_x - (width_draw / 2) - 4, drwchart.ClientH - 20)
draw.Line(distance_x - (width_draw / 2), 0, distance_x - (width_draw / 2), drwchart.ClientH - skala_1 + 8)
draw.LineWidth = width_draw
draw.ForeColor = color.RGB(i * 100, i * 10, i * 50)
colors[i] = draw.ForeColor
tot = skala_1 * value[i] + skala_1 - 8
draw.Line(distance_x - (width_draw / 2), bottom, distance_x - (width_draw / 2), drwchart.ClientH - tot)
distance_x = distance_x + skala_2
NEXT
DRAW.End
END
PUBLIC SUB btnAbout_Click()
DIM i AS String
i = "<h2>Example to make bar chart</h2>\n"
i = i & "This example has made by : " & Chr(10)
i = i & " Yudi Astira" & Chr(10)
i = i & " yudi@kecoak.or.id" & Chr(10)
i = i & " necrose #hdteam on Dal.Net" & Chr(10)
i = i & "Thank You"
message.Info(i, "&Close")
END
PUBLIC SUB drwChart_Draw()
END
FormChart.form
# Gambas Form File 2.0
{ Form Form
MoveScaled(0,0,72,50)
Background = &HFFEFBF&
Text = ("Example to make a Bar Chart")
Border = Window.Fixed
{ bg PictureBox
MoveScaled(1,1,70.25,43.375)
Background = &HFFFFFF&
Border = Border.Plain
}
{ drwChart DrawingArea
MoveScaled(2,2,69,41)
Background = &HFFFFFF&
Cached = True
}
{ btnClose Button
MoveScaled(56.25,45,15,4)
Text = ("&Close")
}
{ btnAbout Button
MoveScaled(39.875,45,15,4)
Text = ("&About")
Picture = Picture["graph.png"]
}
{ TextLabel1 TextLabel
MoveScaled(2,2,4,2.625)
Background = &HFFFFFF&
Text = ("(%)")
}
}
Hint: - Compiling from the command line.
- Navigate to your project folder ( the folder where all your .form, .class & .module files are located )
- Type the command gbc2 -a {full folder path}
- Type the command gba2 -o {full folder path}/myprojectname.gambas
- You will then have the myprogramname.gambas executable in the specified -o folder.
-
* There is no global variables in Gambas!
As a workaround, put them in your main module and declare them as PUBLIC. If you do not have a main module in your project, but a main form, then declare them as STATIC PUBLIC. To access these variables, you must use the name of the main module or form: MyMainModule.MyGlobalVariable or MyMainForm.MyGlobalVariable.
* To know if a string is empty, it is not necessary to use the Len() function. You can directly test it, as an empty string is FALSE and a non-empty string is TRUE.
For example, instead of doing :
IF Len(MyString) > 0 THEN ...
IF Len(MyString) = 0 THEN ...
You should do :
IF MyString THEN ...
IF NOT MyString THEN ...
* The LAST keyword returns the last control that has received an event. This is very useful when you want to write an event handler that is independent of any control name. For example, let's suppose you want to write a calculator program. You have defined ten buttons, one for each digit, each one in the same group "Digit". The Tag of each control is set to the digit drawn in the button. Your event handler may look like that :
PUBLIC SUB Digit_Click()
Display = Display & LAST.Tag
RefreshDisplay
END
* String functions Left$, Right$ and Mid$ have useful behaviors in Gambas. The second parameter of Left$ and Right$ is optional, and is one by default.
Left$("Gambas") returns "G"
Right$("Gambas") returns "s"
This second parameter can be negative, and then gives the number of characters not to extract.
Left$("Gambas", -2) returns "Gamb"
Right$("Gambas", -2) returns "mbas"
Likewise, the third argument of Mid$ can be negative, and then gives the number of characters from the end of the string not to extract.
Mid$("Gambas", 2, -2) returns "amb"
* You can use the DEBUG instruction to print debugging messages to the console (namely the standard error output). It behaves exactly like the PRINT instruction. These messages are prefixed with the class name, method name and line number of the DEBUG instruction. The debugging messages are automatically removed when creating an executable without debugging information.
* Error management in Gambas is done with the following instructions:
TRY tries to execute a statement without raising an error. The ERROR instruction is used just after to know if the statement was executed correctly.
TRY MyFile = OPEN "/etc/password" FOR WRITE
IF ERROR THEN PRINT "I cannot do what I want!"
* Error management in Gambas:
CATCH indicates the beginning of the error management part of a function or procedure. It is put at the end of the function code. The catch part is executed when an error is raised between the beginning of the function execution and its end. If an error is raised during the execution of the catch part, it is normally propagated.
SUB ProcessFile(FileName AS STRING)
...
OPEN FileName FOR READ AS #hFile
...
CLOSE #hFile
CATCH ' Executed only if there is an error
PRINT "Cannot process file "; FileName
END
FINALLY introduces the code executed at the end of the function, even if an error was raised during its execution. The finally part is not mandatory. If there is a catch part in the function, the finally part must precede it. If an error is raised during the execution of the finally part, it is normally propagated.
SUB ProcessFile(FileName AS STRING)
...
OPEN FileName FOR READ AS #hFile
...
FINALLY ' Always executed, even if a error is raised
CLOSE #hFile
CATCH ' Executed only if there is an error
PRINT "Cannot print file "; FileName
END
* - Current Directory
> If you have to start using things like 'EXEC [ "pwd" ] TO sPwd' to get
> the current dir it doesn't make sense to use a Gambas script.
>
There is no current directory in Gambas!
--
BenoƮt Minisini
-
Gambas components are shared libraries written in C or C++ that add new functions to the Gambas interpreter.
If you're a Linux (Ubuntu) user this is painless to install via synaptics installer (gnome default) . Building it from scratch is a challenge. (dependencies, time to compile this monster, ...)
The IDE/GUI designer is written in Gambas so you have a professional class example as a reference. It comes with sample programs to help you get started. (see attachments in the previous post for a few from the distribution)
-
Gambas can create GUI applications using either the Qt or Gtk toolkits. Here is a quick Gtk example and the project files it generated.
(http://files.allbasic.info/Gambas/Gambas_Gtk.png)
FMain.class
' Gambas class file
PUBLIC SUB _new()
END
PUBLIC SUB Form_Open()
END
FMain.form
# Gambas Form File 2.0
{ Form Form
MoveScaled(0,0,42,22)
Text = ("Gambas Gtk Window")
{ Label1 Label
MoveScaled(1,3,12,2)
Text = ("My Label")
}
{ TextBox1 TextBox
MoveScaled(14,3,19,3)
Text = ("")
}
{ Button1 Button
MoveScaled(14,10,14,5)
Text = ("&Quit")
}
}
-
The Gambas interpreter can be used as a console mode scripting language using the gbs2 program. (this isn't included by default and you need to install the Gambas Scripter)
scriptest.gambas
DIM x AS Integer
FOR x = 1 TO 10
PRINT x
NEXT
jrs@Laptop:~/gambas/test$ gbs2 scriptest.gambas
1
2
3
4
5
6
7
8
9
10
jrs@Laptop:~/gambas/test$
-
Ubuntu offers the Gambas 2.21 release via the Synaptic installer. A 2.22 release is available with a bunch of Gtk fixes. Another being a better compiling experience under Ubuntu 10.10 - what the author is now developing under.
Here is a good way to get what you need. (packages already installed and current will be skipped using the below apt install command line)
sudo apt-get install build-essential autoconf libbz2-dev libfbclient2 libmysqlclient-dev unixodbc-dev libpq-dev libsqlite0-dev libsqlite3-dev libgtk2.0-dev libldap2-dev libcurl4-gnutls-dev libgtkglext1-dev libpcre3-dev libsdl-sound1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libsage-dev libxml2-dev libxslt1-dev libbonobo2-dev libcos4-dev libomniorb4-dev librsvg2-dev libpoppler-dev libpoppler-glib-dev libasound2-dev libesd0-dev libdirectfb-dev libaa1-dev libxtst-dev libffi-dev kdelibs4-dev firebird2.1-dev libqt4-dev libglew1.5-dev libimlib2-dev libv4l-dev libsdl-ttf2.0-dev libgnome-keyring-dev libgdk-pixbuf2.0-dev
Success!
(http://files.allbasic.info/Gambas/Gambas_2.22.png)
I now have a current version of Gambas with all it's features enabled. This is a first for me as I have tried on CentOS many times before. (never a full build)
(http://files.allbasic.info/Gambas/Gambas_clock.png) (http://files.allbasic.info/Gambas/Gambas_game.png) (http://files.allbasic.info/Gambas/Gambas_game.gif) Click image for animated version.
Take some time to look Gambas over and I think you will be pleasantly surprised.
-
I only can say that is good becose there is no windows version.
Gambas works best on Linux because it's community supported and is a conglomeration of technologies. Windows promotes proprietary concepts, unfair competition, patients and greed.
I never wanna use such a program on windows.
You will want to stay away from Visual Basic as well. That is what Gambas is modeled after.