A simple calculator with PANORAMIC and FreeBASIC
By jdebord
Introduction
In the previous issue of this magazine we have shown how PANORAMIC can call functions from dynamically loaded libraries (DLL). Here we describe a calculator made with PANORAMIC and using a FreeBASIC DLL.
Passing a PANORAMIC string to a DLL
In this example we need to pass to the DLL a string which contains the mathematical expression to be evaluated (ex. "1+1"). For instance, a function in a FreeBASIC DLL could be written as follows:
function StrFunc(byref p as zstring ptr) as integer export
dim as string s = *p
....................
end function
The parameter p is a pointer to a null-terminated string. This pointer can be dereferenced inside the function and the resulting null-terminated string (*p) can be converted to a standard BASIC string (s) by a simple assignment.
This function can be called by the following PANORAMIC code:
dim s$, i%
s$ = "1+1"
i% = dll_call1("StrFunc", adr(s$))
The EVAL DLL
The DLL used in this example is a simplified version of the "Simple Expression Evaluator" (SEE), a math parser written by Aleksandar Ruzicic (a.k.a. krcko) and published some years ago in the FreeBASIC forum. This DLL is available at:
http://www.unilim.fr/pages_perso/jean.debord/tpmath/eval.zip
The DLL exports 3 functions:
- InitFunc
This function initializes the built-in DLL functions and returns their number. It is mandatory to call this function before using any of the built-in DLL functions.
PANORAMIC call:
dim i%
i% = dll_call0("InitFunc")
print i%, " functions initialized in the EVAL DLL"
For a list of functions and operators available in the DLL, see the documentation file readme.txt in the archive.
- SetVariable
This function sets a variable to a value. There are 26 variables available, from A to Z. The function returns the order number of the variable (1 for A, 2 for B etc.)
PANORAMIC call:
dim variable$, x, i%
variable$ = "x"
x = rnd(1)
i% = dll_call2("SetVariable", adr(variable$), adr(x))
print "Name of variable : ", variable$
print "Order number : ", i%
print "Value : ", x
- Eval
This function evaluates an expression passed as a character string and returns one of the following error codes:
- 0. no error
- 1. unexpected token
- 2. unbalanced braces
- 3. undefined variable
- 4. undefined function
PANORAMIC call:
dim expression$, result, i%
expression$ = "4 * atn(1)"
i% = dll_call2("Eval", adr(expression$), adr(result))
print "Expression : ", expression$
print "Result : ", result
print "Error code : ", i%
The PANORAMIC program
The following program uses the DLL to code a simple calculator with 4 variables:
' ---------------------------------------------
' Declarations
' ---------------------------------------------
dim i%, variable$, expression$, value, result
label On_Click_Button_12
' ---------------------------------------------
' Object description
' ---------------------------------------------
left 0,225
top 0,200
width 0,470
height 0,225
caption 0,"Calculator"
alpha 1
left 1,20
top 1,20
caption 1,"Variables :"
alpha 2
left 2,20
top 2,53
width 2,27
height 2,20
caption 2,"A = "
edit 3
left 3,50
top 3,50
text 3, "1"
alpha 4
left 4,20
top 4,83
width 4,28
caption 4,"B = "
edit 5
left 5,50
top 5,80
text 5, "2"
alpha 6
left 6,20
top 6,113
width 6,29
caption 6,"C = "
edit 7
left 7,50
top 7,110
text 7, "3"
alpha 8
left 8,20
top 8,143
width 8,28
caption 8,"D = "
edit 9
left 9,50
top 9,140
text 9, "4"
alpha 10
left 10,220
top 10,20
width 10,170
caption 10,"Enter a formula, then click Evaluate:"
edit 11
left 11,220
top 11,50
width 11,225
text 11, "A + B + C + D"
button 12
left 12,261
top 12,90
width 12,140
caption 12,"Evaluate"
on_click 12, On_Click_Button_12
alpha 13
left 13,220
top 13,143
width 13,62
caption 13,"Result = "
edit 14
left 14,270
top 14,140
width 14,170
text 14,""
' ---------------------------------------------
' Main program
' ---------------------------------------------
dll_on "eval.dll"
i% = dll_call0("InitFunc")
end
' ---------------------------------------------
' Subprogram
' ---------------------------------------------
On_Click_Button_12:
variable$ = "A" : value = val(text$(3))
i% = dll_call2("SetVariable", adr(variable$), adr(value))
variable$ = "B" : value = val(text$(5))
i% = dll_call2("SetVariable", adr(variable$), adr(value))
variable$ = "C" : value = val(text$(7))
i% = dll_call2("SetVariable", adr(variable$), adr(value))
variable$ = "D" : value = val(text$(9))
i% = dll_call2("SetVariable", adr(variable$), adr(value))
expression$ = text$(11)
i% = dll_call2("Eval", adr(expression$), adr(result))
text 14, str$(result)
return
Upon running, the program displays the calculator window. We can set the values of the four variables and enter a formula which may (or may not) depend on theses variables, then click the "Evaluate" button to get the result.

The compilation by PANORAMIC results in a huge executable which can be compressed by UPX to about 1/3 of its original size.
Conclusion
This simple example shows how PANORAMIC and FreeBASIC can be combined to develop GUI programs under Windows.
Acknowledgements
Many thanks to:
- "krcko" for writing SEE and releasing it under a very permissive license
- the members of the french PANORAMIC forum for their constant support