Back to Contents


New Features of the Language

See also: FAQ List.


Version 1.33

Major New Features

Feature Description
TypeInfo class A class to serialize program variables
Generic ODBC support A generic ODBC database driver is now available (code is odc).
MySQL 5. support MySQL version 5 is now supported.
Genero DB support Genero DB version 3.4 is now supported.
PostgreSQL 8.1 support PostgreSQL version 8.1 is now supported.
SQL Server 2005 support Microsoft SQL Server 2005 is now supported.
New license manager New license manager supporting strict licensing
FESQLC compiler ESQL/C compiler

Details

Binary mode in Channel class

The base.Channel class now supports a binary mode with the 'b' option, to control CR/LF translation when using DOS files.

New header files for C extensions

Distribution of Datetime.h, Interval.h, loc_t.h header files in FGLDIR/include/f2c.

Block fetch with SQL Server

You can now pre-fetch rows by block with SQL Server to get better performance. Use the following FGLPROFILE entry to specify the maximum number of rows the driver can pre-fetch:

dbi.database.<dbname>.msv.prefetch.rows = <count>

Version 1.32

Major New Features

Feature Description
PostgreSQL 8.0 support PostgreSQL version 8.0 is now supported (8.0.2 and higher).
File transfer functions Get/Put functions to transfer files from/to the front-end.

Details

Debugger enhancement

New debugger commands (watch with condition, whatis).

Preprocessor is now integrated in compilers

The preprocessor is now part of the compilers and is always enabled. Preprocessing directives start with an ampersand character (&).


Version 1.31

Major New Features

Feature Description
Front-end Protocol Compression Faster user interface communication
MySQL 4.1.x support MySQL version 4.1.x is now supported, 3.23 is de-supported.
Oracle 10g support Oracle version 10g is now supported.
Dynamic C extensions C extensions can be loaded dynamically, no need to re-link runner.

Details

fgl_width() function

New built-in function fgl_width to compute the column width of a string.

Interruption handling

Interruption handling with SSH port forwarding - only supported with GDC 1.31!

New Dialog method

New method ui.Form.setFieldStyle() to set a style for a field.

Front-end identification

Improved front-end identification when connecting to GUI client.


Version 1.30

Major New Features

Feature Description
Preprocessor Integrated preprocessor allows use of #include and #define/#ifdef macros.
Layout Enhancements New layout rules and form item attributes provide better control of form design.
Presentation Styles Decoration attribute can be defined in a style file to set fonts and colors.
Localization Support

Localization Support (multi-byte character sets)

Action defaults in forms

Action defaults can be specified in forms.
Dialog Control Dialog built-in class to provide better control over interactive instructions.
Sybase ASA Support New drivers to connect to Sybase Adaptive Server Anywhere V7 and V8.
PostgreSQL 7.4 support Support for PostgreSQL 7.4 with parameterized queries.

Details

Build information in 42m modules

The fglcomp compiler now adds build information in 42m modules. Compiler version of a 42m module can be checked on site by using the fglrun with the -b option:

$ fglrun -b module.42m
2004-05-17 10:42:05 1.30.2a-620.10 /devel/tests/module.4gl

MySQL 3.23 support for Windows platforms

A MySQL 3.23 driver is now provided for Windows platforms (was previously only provided on Linux).

Upshift/Downshift in Comboboxes

COMBOBOX fields now support UPSHIFT and DOWNSHIFT attributes, to force character case when QUERYEDITABLE is used.

Message compiler does not require output file any longer

The fglmkmsg tool now has the same behavior as other tools like fglcomp and fglform: If you give only the source file, the message compiler uses the same file name for the compiled output file, adding the .iem extension.

Breakpoint in source code

New BREAKPOINT instruction to stop a program at a given position when using the debugger. It is ignored when not running in debug mode.

Row highlighting in tables

New TABLE presentation style attribute highlightCurrentRow, to indicate if the current row must be highlighted in a specific mode. By default, the current row is highlighted during a DISPLAY ARRAY.

Method base.Array.appendElement()

New method base.Array.appendElement(), to append an element at the end of a dynamic array.

Compiled Localized String file extension = 42s

Compiled Localized String files now have the .42s extension. Previous extension was .4ls.

Assignment Operator

New assignment operator := has been added to the language. You can now assign variables in expressions:
IF ( i := (j+1) ) == 2 THEN

New fglcomp option for SQL

The fglcomp compiler now has a new option to detect non-standard SQL syntax:
fglcomp -W stdsql module.4gl

Compiler generates standard UPDATE syntax

The fglcomp compiler now converts static SQL updates like:

UPDATE tab SET (c1,c2)=(v1,c2) ...

to a standard syntax:

UPDATE tab SET c1=v1, c2=v2 ...

See also SQL Programming.

Defining color attributes for each table cell

The new method ui.Dialog.SetCellAttributes() lets you define colors for each cell of a table.

Form methods in ui.Window 

The ui.Window class provides new methods to create or get a form object.

Method base.StringBuffer.replace()

New method base.StringBuffer.replace(), to replace a sub-string in a string:

CALL s.replace("old","new",2)
Replaces two occurrences of "old" with "new"...

Methods base.Channel.readLine() and base.Channel.writeLine()

New methods to read/write complete lines in Channel built-in class: readLine() and writeLine().

Dynamic arrays used as data model in INPUT ARRAY / DISPLAY ARRAY

When using a dynamic array in INPUT ARRAY or DISPLAY ARRAY, the number of rows is defined by the size of the dynamic array. The SET_COUNT() or COUNT attributes are ignored.

TITLE attribute for fields

The new form field attribute TITLE can be used to specify a table column label with a localized string.

FGLLDPATH used during link

The FGLLDPATH variable is now used during link

Method ui.Dialog.setDefaultUnbuffered()

New class method ui.Dialog.setDefaultUnbuffered() to set the default for the UNBUFFERED mode.

Action Defaults applied by DVM

Action Defaults now applied at element creation by the runtime system. In previous versions this was done dynamically by the front-end. Now, changing an action default node at runtime has no effect on existing elements.

DATEEDIT supports DBDATE & FORMAT

The DATEEDIT field type now supports DBDATE/CENTURY settings and the FORMAT attribute.

New predefined action 'close'

New default action 'close' to control Window closing. You can now write the following to control window closing:

  ON ACTION close
See Windows and Forms.

Tabbing order in TABLEs during INPUT ARRAY

INPUT ARRAY using TABLE container now needs FIELD ORDER FORM attribute to keep tabbing order consistent with visual order of columns.

Preprocessor raises errors for invalid # macros

If enabled, the preprocessor now raises an error when # comments are used in the source. You must replace all # comments by -- comments before using the preprocessor.

ACCEPT xx instruction

New instructions ACCEPT INPUT / ACCEPT CONSTRUCT / ACCEPT DISPLAY to validate a dialog by program.

ON ACTION doit
   ACCEPT INPUT

ACCEPT / CANCEL dialog attribute

New dialog attribute ACCEPT / CANCEL to avoid creation of default actions 'accept' and 'cancel'.
See Record Input control instructions.

Preprocessor disabled by default

The Preprocessor is now disabled by default; there are no FGLPP / FGLPPOPTIONS environment variables, you must use the -p option of fglcomp/fglform.

INPUT ARRAY now has default 'append' action

New default action 'append' in INPUT ARRAY. Allows you to add a row at the end of the list.

Linker option -O removed

The linker option -O (optimize) is de-supported (was ignored before). You now get a warning if you use this option.

Method ui.Window.createForm()

New method ui.Window.createForm() to create an empty form object in order to build forms from scratch at runtime.

TopMenu attributes in .per

TopMenu definition in forms now allows attributes in parenthesis.

Specifying real field size in forms

The form layout syntax now allows you to specify the real width of form items. By default, BUTTONEDIT, COMBOBOX and DATEEDIT get a real width as follows:

  if nbchars>2 : width = nbchars - 2; otherwise width = nbchars
(Here nbchars is the number of characters used in the layout definition.)

Now you can specify the real width by using a dash '-' in the tag:

 1234567
[f01  - ]      width = 5, grid cells used = 7

This works also in hbox tags and screen arrays.

Version number in UI protocol

User interface protocol is now controlled with a version number, to check compatibility between the front end and runtime system.

C-like source preprocessor

New integrated preprocessor: The form and source compiler now integrates a preprocessor! You can use macros as in C, such as #include, #define, #ifdef, etc.

MENU node available in BEFORE MENU

Important remark: Before build 530 the MENU has attached the WINDOW when returning from the BEFORE MENU actions. Since build 530 the WINDOW must exist before the MENU statement. So now the MENU node is available in the BEFORE MENU block, but a WINDOW opened or made CURRENT in the BEFORE MENU block will NOT be used.

New HBox tags

Layout GRID now accepts HBox tags to group items horizontally.

Form layout extensions

New Table definition attributes

New ORIENTATION attribute for RADIOGROUPs

RADIOGROUP fields now support the attribute ORIENTATION = { VERTICAL | HORIZONTAL }.

Reviewed fglrun.setenv environment variables handling in FGLPROFILE.

Now, on Windows platforms only, the ix drivers automatically set standard Informix environment variables with ifx_putenv(). Values are taken from the console environment with getenv(). Additional variables can be specified with:

dbi.stdifx.environment.count = n
dbi.stdifx.environment.xx = "variable"

MENU COMMAND generates lowercase action name

The MENU COMMAND clause now generates action names in lowercase. This means, when you define COMMAND "Open", it will bind to all actions views defined with the name 'open'.

Method ui.Interface.loadTopMenu()

New ui.Interface.loadTopMenu() method to load a global topmenu.

ON CHANGE fired on click

The ON CHANGE block is now fired when the user clicks on a checkbox, radiogroup, or changes the item in a combobox.

New ui.Dialog built-in class

New ui.Dialog built-in class available with the DIALOG keyword in all interactive instructions. You can now activate/deactivate fields and actions during a dialog:

INPUT ...
     AFTER FIELD field1
     CALL DIALOG.setFieldActive("field2",rec.field1 IS NOT NULL)
     CALL DIALOG.setActionActive("check",rec.field1 IS NOT NULL)

New ui.Form methods

The ui.Form built-in class has new methods to handle form elements. The hidden attribute is now also managed at the model level, this allows you to hide form fields by name, instead of using the decoration node.

CALL myform.setElementHidden("formonly.field1",2)
CALL myform.setFieldHidden("field1",2) -- prefix is optional

Array sub-script operator now returns the sub-array

The [] array sub-script operator now returns the sub-array:

DEFINE a2 DYNAMIC ARRAY WITH DIMENSION 2 OF INTEGER
LET a2[5,10] = 123
DISPLAY a2.getLength() -- displays 5
DISPLAY a2[5].getLength() -- displays 10

Dynamic arrays passed by reference to functions

Dynamic arrays are now passed by reference to functions. You can change a dynamic array in a function when it is passed as an argument.

Control MDI children with ui.Interface

New methods are provided in ui.Interface to control the MDI children.

CANCEL INSERT in AFTER INSERT

In INPUT ARRAY, CANCEL INSERT now supported in AFTER INSERT, to remove the new added line when needed.

Toolbar and Topmenu now have the hidden attribute

Toolbar and Topmenu elements now have the hidden attribute so you can create them and hide the options the user is not supposed to see.

Warning: Hiding a toolbar or topmenu option does not prevent the use of the accelerator of the action. Use ui.Dialog.setActionActive()!

NEXT FIELD CURRENT

New keyword for NEXT FIELD: NEXT FIELD CURRENT. Gives control back to the dialog instruction without moving to another field.


Version 1.20

Major New Features

Feature Description
Debugger Integrated debugger with gdb syntax to interface with graphical tools like ddd.
Profiler The runtime system can now produce program profiling information to detect bottlenecks.
Localized Strings Internationalizes your application in different languages with localized strings.
Unbuffered Dialogs Interactive instructions support the UNBUFFERED mode, to synchronise data model and view automatically.  
Paged Display Array DISPLAY ARRAY can now work in buffered mode, to avoid loading a big array when you have a lot of rows to display.

Details

Paged Display Array

The DISPLAY ARRAY instruction now has a new ON FILL BUFFER block that can be used with dynamic arrays to feed the dialog with data rows on demand.

Action Defaults

Centralize default attributes for actions in Action Defaults files.

Client side settings saved for each programs

Client side settings are now saved in registry according to the 'name' attribute of UserInterface, which can be set with ui.Interface.setName() method. By default UserInterface.name is not set to the name of the program.

Program Profiler

The Program Profiler can be used to generate statistics of program execution, to find the bottlenecks in the source code.

APPEND ROW dialog attribute

New attribute APPEND ROW = TRUE/FALSE for INPUT ARRAY instruction. Defines if the user is allowed to add rows at the end of the list.

KEEP CURRENT ROW dialog attribute

New attribute KEEP CURRENT ROW = TRUE/FALSE for DISPLAY ARRAY and INPUT ARRAY instructions. Defines if the current row must remain highlighted when leaving the dialog. The default is FALSE.

UNHIDABLE attribute for image and labels

Image and labels now support the UNHIDABLE attribute for table columns.

TERMINATE REPORT / EXIT REPORT

New report instructions TERMINATE REPORT / EXIT REPORT. Use the EXIT REPORT statement to terminate a report within a REPORT definition. Both statements have the following effects:
- Terminate the processing of the current report.
- Delete any intermediate files or temporary tables that were created while processing the report.

TINYINT data type with SQL Server

SQL Server driver now supports the TINYINT data type.

Toolbars can be defined in forms

You can now define Toolbars in form specification files.

Topmenus can be defined in forms

You can now define Topmenus in form specification files.

Built version number

The FGL_GETVERSION() function returns the internal version number of the runtime system.

Get a help message text

The FGL_GETHELP() function returns the message text for a give help number.

Set the current row

The FGL_SET_ARR_CURR() function changes the current row in DISPLAY ARRAY or INPUT ARRAY.

Interruption handling

Users can now send an interruption request from the client to the program, to stop long running queries, reports and other BDL procedures, by testing the int_flag variable. The client is using an OOB signal.

StatusBar definition with style attribute

There is now a new window style attribute for statusbar layout specification. You can now set statusBarType attribute in the 4st style file for Windows, in order to control the display of status bars.

Field order form

New OPTIONS clause FIELD ORDER FORM provided to use the TABINDEX attribute to define the field tabbing order. FIELD ORDER FORM can also be used at the dialog level as dialog attribute.

Runtime system re-written in C

Runtime system has been re-written in pure C language, g++ 3.2 and corresponding gnu libs (libstdc++, libsupc++, ...) are no longer needed; a runner can be linked with a native cc compiler. See Installation and Setup.

Passing arrays as function parameter

Arrays can be passed as parameters, all elements are expanded.

Compiler supports now ANSI outer joins

You can now write static SQL statements using ANSI outer joins:

   SELECT .. FROM a LEFT OUTER JOIN b ON a.key=b.key

Methods for StringBuffer

New methods for StringBuffer class: base.StringBuffer.replaceAt() and base.StringBuffer.insertAt().

Default items created for COMBOBOX

For COMBOBOX form items, a default ITEMS list is created by fglform when an INCLUDE list is used.

Localized Strings

Localized Strings are now supported. You can identify strings to be localized, with the % notation:

 LAYOUT ( TEXT= %"custlist" )

UNBUFFERED dialogs

Dialogs can now use the UNBUFFERED attribute, that simplifies INPUT, DISPLAY ARRAY and INPUT ARRAY coding; input/display buffer is no longer used. When you set a variable, the value is automatically displayed to the field.

ON IDLE clause in dialogs

The ON IDLE clause can be used to execute a block of instructions after a timeout.

Order of INPUT ARRAY trigger execution

New logical order of execution for INPUT ARRAY triggers:
1. BEFORE INPUT
2. BEFORE ROW
3. BEFORE INSERT
4. BEFORE FIELD

New ui.ComboBox class

New ui.ComboBox class has been added, to configure COMBOBOX fields at runtime.

Predefined actions in lists: nextrow / prevrow

DISPLAY ARRAY and INPUT ARRAY instructions now automatically use two predefined actions nextrow and prevrow, which allow binding action views for navigation.

FOREACH infinite loop

FOREACH that raises an error no longer loops infinitely.

Record comparison

Operators equal (= or ==) and not equal (<> or !=) now can be used with records. All members will be compared. If two members are NULL the result of this member comparison results in TRUE.

ON CHANGE trigger

ON CHANGE field trigger in INPUT and INPUT ARRAY. Same as AFTER FIELD, but only fired if the value has changed.

Program icon

New image attribute in UserInterface node, for the program icon. Can be set with ui.Interface.setImage().

Form compilation warnings

New option -W for fglform to show warnings.

FORMAT attribute in LABELs

LABELs can now have a FORMAT attribute.

SQLSTATE and SQLERRMESSAGE

New SQLSTATE and SQLERRMESSAGE operators, to give SQL execution information.

Front End Function calls

You can now call predefined functions in the front-end, by using the ui.Interface.frontCall()method.
See also Front End Functions.

New ui.Form built-in class

New ui.Form built-in class to handle forms.

TABINDEX for tabbing order

New TABINDEX field attribute to define the tabbing order in forms.

LSTR operator

New LSTR operator to get a localized string by name:

  DISPLAY LSTR("custno_comment")

SFMT operator

New SFMT operator to format strings with parameters:

  DISPLAY SFMT("Could not find %1 in %2.",filename,dirname)

ON ROW CHANGE trigger

New ON ROW CHANGE clause in INPUT ARRAY. This trigger will be executed if at least one value in the row has been modified. The ON ROW CHANGE code is be executed just before the AFTER ROW clause.

New StringTokenizer class

The StringTokenizer class can be used to parse strings for tokens.

Faster linker

Linker is now faster when having program modules with a huge number of functions.

Global constants

CONSTANTs can now be defined as GLOBALs.

ON ACTION in MENUs

MENU instruction now supports ON ACTION clause, to write abstract menus as simple action handlers.

New Application class

The base.Application class provides an interface to the program properties.

New Channel class

New definition of the interface for Channels, now based on objects:

 DEFINE c base.Channel
 LET c = base.Channel.create()
 CALL c.openFile("data.txt","r")

Predefined 'help' action

New 'help' predefined action, to start help viewer for HELP clauses in dialog instructions.

 INPUT BY NAME .... HELP 12423 -- Creates action 'help'

Version 1.10

Major New Features

Feature Description
Dynamic User Interface The Dynamic User Interface is the major new concept in Genero. It is the basement for the new graphical user interface.
Interactive Instruction Extensions Classical interactive instructions such as INPUT, INPUT ARRAY, DISPLAY ARRAY, CONSTRUCT have been extended with new control blocks and control instructions.
Built-in Classes The language supports now built-in classes, a new object-oriented way to program in BDL.
Constant Definitions It is now possible to define constants, as in other languages.
Extended Form Files You can now define complex layouts with the extended PER files.
Dynamic Arrays DISPLAY ARRAY can now work in buffered mode, to avoid to load a big array when you have a lot of rows to display.

Details

XML utilities

A set of XML Utilities are provided in the runtime library as built-in classes.

String data type

A new STRING data type is now available, to simplify utility function coding.

Dynamic arrays

The language now supports dynamic arrays with automatic memory allocation.

Defining MDI containers

Defining Window Containers (MDI) is a simple way to group programs.

SCHEMA instruction

The new SCHEMA instruction allows you to specific a database schema without having an implicit connection when the program executes.