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:

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: