PxForms Anywhere v.1.2.0
1. What is PxForms Anywhere?
2. How it works
3. Supported features
4. Unsupported features
5. What the form running via Internet must not do
6. Flow of operations
7. PxForms interface methods
8. PxForms engine components
9. PxForms engine methods description
10. Assorted topics
11. PxForms Sample application
12. How to create your own application, powered by PxForms
1. What is PxForms Anywhere?
PxForms Anywhere is an engine written in OPAL and JavaScript for using in Corel
Paradox/Paradox runtime v.8-11. PxForms uses revolutionary technique which allows
to run normal Paradox forms and reports via Internet/Intranet in a browser window.
No need for Paradox on clients' computers! No need to install any software on
clients' computers - they only need a browser, which is, of course, already installed!
Using PxForms, you can easily create WEB-enabled applications using existing
Paradox forms without knowlege of HTML and JavaScript. You can create WEB-enabled
multiform applications in a few days - just make minor adjustments in your existing
Paradox forms and use the Sample application from PxForms package with a few
lines of its code changed!
Moreover, by giving access to your applications via Internet/Intranet, you significantly increase data security - users have no direct access to tables, and can change data only via forms according to their rights. In fact, you get a Client/Server application.
PxForms supports the following browsers on the client's side:
- Internet Explorer 5.01 and above
- Netscape 6 and above
- all versions of Mozilla.
- FireFox 1.0 and above
2. How it works
To run PxForms applications via Internet, you need to have a server computer,
running CWS (Corel WEB Server). In the PxForms sample application CWS is embedded
to the Webserv.fsl form. When a user runs a form on the server, PxForms opens
this form (hidden), parses its structure, composes an HTML page which reflects
the form's look and sends it to the browser. Then, the browser image of the form
and actual form on the server exchange information when needed. Only changed
data travel between server and browser.
You can use the whole Sample application as a starting point for you own applications.
3. Supported features
- Reproduces almost exact look of any Paradox form
- Supports all UIobjects except crosstabs, OLEauto servers, slope lines and
ellipses
- Supports all field types except OLE, Binary and Bytes. Formatted Memo and
Graphic fields editing isn't supported
- Works with form's datamodels of any complexity
- Supports the following UIobject properties (including their runtime altering
by form's code): visibility, tabstop, readonly, enabled, color, text color,
text alignment, all font parameters, borders color, text in text objects, tooltips
- Windows System colors on a client side computer
- UIobjects moving (changing position) at runtime
- Changing size of UIobjects at runtime
- UIobjects' drag'n'drop
- Data viewing and editing
- Runtime changing of field objects binding and datamodel's tables
replacement
- Runtime deletion of UIobjects (except of Record type) and creation
of Text, Box and line objects.
- Built-in navigation (Next/Prev record/recordset, Home, End), Locate, LocateNext,
LocatePrior, View/Edit toggle, Lock/Unlock record, Insert/Delete record
- Main form's menu bar
- Popup menus
- ChangeValue code execution support for all types of fields
- PushButton code execution support
- MouseRightDown/MouseRightUp code execution support
- MouseDown/MouseUp/MouseClick code execution support for text, graphical
and pushbutton objects
- KeyPhysical code execution support for all types of fields
- Modal dialog forms
- Multiform applications
- Reports (PxForms converts them to RTF or PDF format)
- Embedding HTML and Javascript code in Paradox forms
4. Unsupported features
- Multirecord/Tableframe uiobjects inside another Multirecord/Tableframe, if the parent multirecord object isn't 1x1 (or parent tableframe has more than one row). Generally this works, but not always due to poor implementation in Paradox.
- Running of delivered forms (though, see pviSuperCache method below).
5. What the form running via Internet must not do
- It must not show any Paradox built-in dialog windows (msginfo and similar) - use their PxForms equivalents (see below).
- It must properly handle errors (try-onfail) to prevent error message dialog windows.
- It must not prevent its hiding and losing/setting focus.
- It must not block its closing.
- It must not change uiobject names at runtime.
- It must not open reports/other forms directly - only via interface provided (see below).
- It must have a non-blank title and must not change this title at runtime.
6. Flow of operations
When the client sides user requests to open form, PxForms library handles this request, opens form and calls form's pviFormStartup (if exists). The form obtains via this method an information about the current user name, the form-caller (important for modal dialog forms), about the user's session private directory, which is set by the application. Also, the form may adjust visible buttons on the toolbar and it's title in the browser.
After the form is opened, it is displayed in browser. If the user clicks one
of toolbar buttons, moves the cursor to another record, clicks buttons, changes
value of a list, combo, checkbox or radiobutton field which has NewValue or ChangeValue method attached, changes value
of labeled or unlabeled field which has ChangeValue method attached, right-clicks on an object
which has MouseRightUp or MouseRightDown method attached, clicks on a text or graphical uiobject which has MouseClick, MouseDown or MouseUp method attached, the corresponding request is being sent
to the server. On the server side the PxForms library handles this request in
the following sequence:
- Commits all changed fields values (if they exist)
- Posts and unlocks record, if needed (the form's OPAL code can block postrecord if needed)
- Calls form's pviBeforeAction method (if exists), notifying the form about the action requested. At this point the form can allow or disable the requested action execution. See description of pviBeforeAction below.
- Executes requested action (if it wasn't disabled by pviBeforeAction).
- Calls form's pviAfterAction method (is exists). In this method the form may request additional actions. See description of pviAfterAction below.
- Collects all information about changed data and UIobjects properties and sends this information to the browser. Only changed data and properties are being transmitted to minimize traffic.
7. PxForms interface methods
The methods below may be (optionally) placed in your application's forms for extended interaction with PxForms library.
pviFormStartup(UserName string, SessPrivDir string, callerTitle string, var hasPrintButton logical, var hasLocateButtons logical, var hasNavigationButtons logical, var hasEditButtons logical, var warnOnRecordDelete logical)
- pviFormStartup is being called immediately after the form startup. This method should be at the form's level.
- UserName is those name the user entered in the
login screen
- SessPrivDir - the current user session private directory
- callerTitle is a unique title of the form, which called current form. Especially useful for attaching a modal dialog forms to a parent form to return values to it. Blank, if the form was called from an HTML page other then PxForms Anywhere form.
- hasPrintButton, hasLocateButtons, hasNavigationButtons, hasEditButtons - set this values to False to remove corresponding buttons from the form's toolbar. By default all these parameters are set to True.
- warnOnRecordDelete - If True, the user will be asked for confirnation if he tries to delete a record. By default is set to True.
pviGetCharSet() string
- pviGetCharset is being called after the form startup immediately after pviFormStartup. If this method exists, it should return the desired charset for the HTML form (default - iso-8859-1). This method should be at the form's level.
pviBeforeAction(actionId string, Value1 string, var mess string) logical
- pviBeforeAction is being called before each
action request, sent to the form from the browser, will be executed. If the
method returns false, action will be cancelled. This method should be at the form's level.
- actionId may be: next,
prev, nextset, prevset, end, home, locate, locatenext, locateprior, toggleedit,
togglelock, ins, del, lockrecord, pushbutton,
mouserightup, mouseclick, callback or blank string in case of simple
refresh request. Note, lockrecord appears only
for existing not locked records when the user tries to lock record or to change
it (in this case pviBeforeAction is being called twice - for the first time with actionId=lockrecord, and with another actionId for the second time). If the user tries to lock a record for changes, and pviBeforeAction
returns False, all changes made by the user will be undone.
- Value1 may be:
- Yes or No in
case the previous question request was sent via
pviAfterAction (see below).
- The value provided by the user in case of previous input
request was sent via pviAfterAction (see
below)
- The value selected in popup menu by the user, preceded by the double ampersand
&&, in case of previous menu
request was sent via pviAfterAction (see below)
- Value to locate for locate, locatenext
and locateprior actions
- An optional parameter for callback request (see "Progress bar" demo form for example)
- mess is the current message which will be shown
in browser (may be blank or not at the moment of this method is called). May
be changed by form in this method
- See general example in Demo.fsl form
pviAfterAction(var mess string, var RequestedAction string, var Value1 string, var Value2 string)
- pviAfterAction is being called before all changes
in form's data and properties will be collected and sent to browser. This method
should be at the form's level.
- mess is the current message which will be shown
in browser (may be blank or not). May be changed by the form in this method
- RequestedAction may be blank or have one of
the following values:
- form - opens form, which full name with path
must be in Value1. If Value2=modal,
form will be opened as a modal dialog. If Value2=close,
the form-caller will be closed after opening requested form. The form full
name in Value1 may follow by:
- ;XcoordInPixels;YCoordInPixels - the form
will be opened at these coordinates
- ;center - the form will be opened centered
relative to screen
- ;fcenter - the form will be opened centered
relative to the form-caller
- ;mouse - the form will be opened at the
mouse position
- report - opens report, which full name with
path must be in Value1. If a full table name
follows the report name (separated by comma) this table is considered as a
master table for this report. If Value2=PDF,
report will be sent to browser as PDF file, otherwise - as RTF.
- html - opens HTML page (actually, any file),
which URL must be in Value1. If this URL is not
preceded by http:// or https://, it is considered as a path relative to the
site root (defined in CWS properties). If Value2=close,
the form-caller will be closed after opening requested page. If Value2=callback,
immediately after opening the requested file callback (see below) request
is being sent to the server, which allows to implement chain opening of multiple
files.
- question - asks the user the question (actual
question string must be in Value1). Response
(Yes or No) will
be returned via pviBeforeAction (see above)
- input - asks the user to input something (actual
question string must be in Value1, initial input
value in Value2). Response string will be returned
via pviBeforeAction (see above)
- menu - shows a popup menu. Menu items must
be in Value1, separated by semicolons (;).
Background color may be optionally set via Value2.
Response string (selected item, preceded by the double ampersand &&)
will be returned via pviBeforeAction (see above)
- mainmenu - invokes form's pviMenu method, allowing dynamically change form's menu. If Value2=repeat, the pviAfterAction method would be called again, allowing the form to request another action.
- close - request to close itself. If mess contains
some text, this text will be shown to the user just before the browser window
with this form will be closed. If the form was called from another form, the
form must pass an information to the form-caller (if needed) before issuing
close request. Immediatly after the form is closed,
the browser window with the form-caller will issue refresh request if the
closed for was modal dialog.
- callback - immediately reinitiates data exchange
with the server. May be used for implementing progress bar for long processes
- see "Progress bar" demo form - Progress.fsl. An optional parameter may be transferred
to pviBeforeAction (see above) via Value1.
- deleteui - reflects in a browser deletion of an UIobject and all objects inside it (OPAL code in the form should first perform actual UIobject deletion using delete() method). The full name of the object to be deleted (obtained via .fullname property) should be in Value1. Note, deletion of the Record type uiobjects isn't supported. If Value2=repeat, the pviAfterAction method would be called again, allowing the next object deletion. See example in demoui.fsl
- addui - reflects in a browser creation of a new UIobject in the form (OPAL code in the form should first perform actual UIobject creation using create() method). The full name of the newly created object (obtained via .fullname property) should be in Value1. Note, only creation of objects of Text, Box and Line types is supported. If Value2=repeat, the pviAfterAction method would be called again, allowing the next object creation. See example in demoui.fsl
- See general example in Demo.fsl form
pviAddToolbarText()
- This method allows to add a short text (possibly formatted using HTML tags)
to right from the toolbar buttons on the top of a form. This method should be
at the form's level.
- Each line in the method should start with double semicolons ;;
pviChildFormOpened(var
Child form, ChildOrigTitle
string)
- When a form (form-caller) requests to open another (child) form via pviAfterAction, the method pviChildFormOpened (if exists) of the form-caller will be called immediately after the child form is opened. The form-caller can use this method, for example, to pass additional parameters to the child form. This method should be at the form's level.
- Child - handle to the child form
- ChildOrigTitle - original title of the child form.
pviDragDropProperties()
- Define this method at form's level if it's needed to allow drag'n'drop for
uiobjects on the form. Then, to allow drag'n'drop for particular uiobject, either
define pviDragDrop method for this object, or give
this object name which begins with draggable_ prefix.When
the user drops the object after dragging, PxForms moves actual uiobject to the
new position and tries to call pviDragDrop method
for this object. If this method doesn't exist for the given uiobject, PxForms
tries to call pviDragDropByName method if it's
defined at form's level. See description of these methods below. Note that an
uiobject can be dragged only inside its container object.
- This method can optionally contain the following lines for setting dragging
properties (each line should start with double semicolons ;;):
- ;;threshold=N where N is a positive small
integer. This integer represents the number of pixels for which the user had
to move mouse after pressing the left mouse button before the actual dragging
begins. If this line is absent, the default threshold is 0 pixels.
- ;;shift - allows dragging only
if the user holds down Shift key while pressing the left mouse button.
- ;;ctrl- allows dragging only
if the user holds down Control key while pressing the left mouse button.
- ;;alt- allows dragging only
if the user holds down Alt key while pressing the left mouse button.
- ;;cursoratmouseover - if this
line is present, the mouse cursor changes its shape to "move shape"
when it's over a draggable object. By default, the cursor changes it's shape
when the dragging begins.
- See Demo.fsl form for examples
pviDragDrop(oldPosition
point, flags longint)
- If this method is defined for an uiobject, it's being called when the user
drops this uiobject after dragging . At the moment of this method call the uiobject
is already at its new position.
- oldPosition - position of the object before
dragging
- flags - reserved
pviDragDropByName(uiFullName
string, oldPosition point, flags
longint)
- If this method is defined at form's level, it's being called when the user
drops an uiobject after dragging (but only if there is no pviDragDrop
method defined for this uiobject - see above). At the moment of this method
call the uiobject is already at its new position.
- uiFullName - the full name of uiobject which
was moved
- oldPosition - position of the object before
dragging
- flags - reserved
pviDynamicTabs()
- If this method exists in the form (no need to put any code in this method), PxForms uses dynamic loading of Notebook Pages. This significantly (up to several times for complex forms) decreases the initial loading time for forms, containing many Notebooks or NotePage UIobjects. This method should be at the form's level.
pviHTMLElementEvent()
- This method allows to attach client-side Javascript event handlers to the form's UIobjects. See "HTML demo form - 2" (/PXFDEMO/demohtm2.fsl) for examples. This method should be at the UIobject's level.
- The method should contain Javascript code. Each line should start with double semicolons ;;
- Never redefine onFocus, onBlur, onClick, onChange and onKeyPress for any types of fields unless you are absolutely sure what you're doing. Redefining of these events may cause complete inoperability of the form. Syntax errors in Javascript code can also make the form inoperable.
- See example in DemoHTM2.fsl form
pviHTMLElementStyle()
- This method allows to redefine the look of UIobjects, for example to create buttons with non-windows colors, etc. See "HTML demo form - 2" (/PXFDEMO/demohtm2.fsl) for examples. This method should be at the UIobject's level.
- The method should contain elements of HTML style definition. Each line should start with double semicolons ;;
- See example in DemoHTM2.fsl form
pviHTMLGlobalBody()
- This method allows to add HTML code to the HTML form's <BODY> tag, for example to define background image see "HTML demo form - 2" (/PXFDEMO/demohtm2.fsl) for examples. This method should be at the form's level.
- Each line in the method should start with double semicolons ;;
- See example in DemoHTM2.fsl form
pviHTMLGlobalJavascript()
- This method allows to add global Javascript functions for using them from the code, defined in the pviHTMLElementEvent methods. This method should be at the form's level.
- The method should contain Javascript code. Each line should start with double semicolons ;;
- See example in DemoJS.fsl form
pviHandleKeys()
- This method allows to define hot keys which will cause data exchange between
HTML form and server. This method is applicable only for fields. When the user
presses one of defined keys, PxForms generates keyPhysical event for the corresponding
fiels on the Paradox form. See "Keytrap demo" (/PXFDEMO/demokey.fsl)
for examples. This method should be at the UIobject's level.
- Each line in the method should start with double semicolons ;;
and contain comma-separated hot keys definition in the XX-CA format,
where:
- XX can be:
- virtual key code as in OPAL vCharCode method
- k for any key
- a for any alphanumeric key
- l for any letter key
- d for any digit key
- C - 1 if Ctrl-key must be pressed, otherwise
- 0
- A - 1 if Alt-key must be pressed, otherwise
- 0
- Examples of key definitions:
- k-01 - any Alt-key combination
- d-00 - any digit key without Ctrl and Alt
- 32-10 - Ctrl-space
- 119-00 - F8
- 119-10 - Ctrl-F8
- See example demokey.fsl form
pviJSexec() string
- This method (if exists at the form level) should return a string containing valid JavaScript code (or blank string). The method is called at the end of processing of each request to the server (after pviAfterAction). The obtained JavaScript code will be executed by browser. JavaScript code may call functions, defined in pviHTMLGlobalJavascript method. Warning! Syntax errors in Javascript code can make the form inoperable.
- See example in DemoJS.fsl form
pviMenu(var mainMenu stringArray, var popupMenus stringArray, var actions stringArray)
-
This method (if exists at the form level) allows to create a menu bar at the top of the form. It is called immediately after the form is launched, and may be called if needed at any time using pviAfterAction method (RequestedAction=mainmenu). stringArray type should be defined at form's level as following:
Type
stringArray=array[] string
endType
- When the user selects an item from the menu, the form's menuAction method is invoked with the corresponding menuaction ID.
- mainMenu - array of the main menu items
- popupMenus - array of subitems for each main menu item (separated by semicolons). If there are no subitems for a given main menu item, the corresponding element of popupMenus should be blank.
- actions - array of Paradox menuaction IDs for menu item. Each element of the actions array should contain menuaction IDs for each subitem of the corresponding main menu item (separated by semicolons).
- See example in Demo.fsl form
pviNoTitlebar()
- If this method exists in the form (no need to put any code in this method),
no Titlebar (the blue bar below the toolbar) will be shown in a browser. This
method should be at the form's level.
pviNoToolbar()
- If this method exists in the form (no need to put any code in this method),
no Toolbar (the buttons bar on top of the form) will be shown in a browser.
This method should be at the form's level.
-
If this method exists in a form, a status bar is added to the bottom of the form in a browser. By default, it's a single line. If the first line in this method contains a digit, preceeded by double semicolons (for example, ;;2), the number of status lines increases accordingly. After every data exchange between a browser and the server this status bar shows a text returned by this method (the text may contain HTML tags). Several special case-sensitive placeholders can be used to display special parameters (see example Demo HTML Form - demohtml.fsl):
- %fs - initial size of the HTML form
- %ft - initial form generation time
- Parameters of the last data exchange between a browser and the server:
- %bs - bytes sent to the server
- %br - bytes received from the server
- %dt - total data transmission time (both to and from the server)
- %pt - time of the request prosessing on the server
- %rt - time of the processing received data in a browser
- %tt - total request prosessing time (actually it's a sum of %dt, %pt and %rt)
- See example in DemoHTML.fsl form
-
If this method exists in the form (no need to put any code
in this method), PxForms caches this form using Super Cache. Actually, at the
very first start (at this time the form must be non-delivered .fsl) PxForms
parses the form, deliveres it and put delivered version in the internal cache.
For all subsequent form's starts the form source file (.fsl) isn't needed.
In fact, the form could be absent on a disk at all. Note, for supporting both
lines of browsers (IE and Mosilla/Netscape), the undelivered form should be
started twice - using both browsers.
Using this feature, you can distribute your PxForms applications without source.
To transfer PxForms internal cache to another computer, just copy the content
of /REPOS/FORMS folder.
8. PxForms engine components
PxForms core library has PxfXX.ldl name, where XX corresponds to the Paradox
version. It uses several other libraries:
- PxfsXX.ldl - support library
- Pxfd.lsl - DLL calls
- Fsapi.lsl - file system functions
Also, PxForms engine contains a number of HTML forms, which are in the SITE
and REPOS subdirectories. Don't change anything in these forms unless you're
absolutely sure what you do. Changing these forms may result in the whole
PxForms engine becoming inoperative.
PxForms engine contains to tables:
- Land.db - text of all messages. You can translate this table to desired language for your applications.
- ErrorLog.db - all errors are being logged by the engine to this table
9. PxForms engine methods description
PxfXX.fdl has the following public methods (in alphabetical order):
pxfChkModalDlg() string
If the user tried to open form or report, which can't be opened due to absence of some tables, the Paradox error dialog "Do you want to replace table in datamodel...." appears. This method checks the presence of this error dialog and closes it by calling pxfFormRecover (see below). This method must be exactly in those place, where it is in the Sample application.
pxfFormAddToQueue(FormTitle stringarray)
Adds a form to a queue of forms to be closed when the user is being disconnected due to timeout (exceeding of allowed inactivity period).
pxfFormClose(request oleauto, response oleauto, var connForms string)
Handles request to close form and adds a form to the queue of forms to be
closed. See pxfFormConstruct for parameters description.
pxfFormConstruct(request oleauto,response oleauto, id string, pathToForm string, winTitle string, connIpriv string, connLang string, connName string, var connForms string)
Creates HTML image of Paradox form. Parameters:
- request - CWS Request object
- response - CWS Response object
- id - current user's session identificator (see hCheckLog method of the main application library PxfApp.lsl)
- pathToForm - the full form file name with path or alias
- winTitle - desired title of the browser window. If blank, the form title will be used.
- connIpriv - session's private directory (see hCheckLog method of the main application library PxfApp.lsl)
- connLang - desired charset of HTML page
- connName - user's login name (see hCheckLog method of the main application library PxfApp.lsl)
- connForms - a comma separated list, containing titles of forms which are currently opened by the user (see hCheckLog method of the main application library PxfApp.lsl).
pxfFormContent(request oleauto, response oleauto, connIpriv string, connLang string)
Handles requests from a form, running in browser. See pxfFormConstruct
for parameters description.
pxfFormRecover(request oleauto, response oleauto, connLang string)
See description for pxfChkModalDlg
pxfFormsQueueCleanUp() logical
Closes the first form in the "closing queue". This special method is needed because normal formVar.close() often causes GPV when called inside CWS event handlers. This method must be exactly in those place, where it is in the Sample application.
pxfGetVersion() string
Returns the PxForms core library version
pxfLibInit(CWSFormTitle string, libDir string, siteRootdir string, siteHTMLdir string) logical
Library initialization code. Is being called from the CWS (webserv.fsl) initialization code. Parameters:
- CWSFormTitle - title of the CWS form (webserv.fsl)
- libDir - path to the library
- siteRootdir - path to the site root directory (in the sample app - SITE subdirectory)
- siteHTMLdir - path to the HTML repository directory (in the sample app - REPOS subdirectory)
pxfRegister(rname string, rpass longint)
This method must be called with the registration information to prevent nag screens. In the Sample application the call of this method is in the SetParams method of the Pxfapp.lsl library. Parameters:
- rname - registration name
- rpass - serial number
pxfReport(request oleAuto, response oleAuto, id string, pathToReport string, repFormat string, warnOnSize number, connLang string, connName string, connIPriv string)
Opens report and sends it to user. Parameters:
- pathToReport - the full report file name with path or alias
- repFormat - desired report output file name (without path). May have RTF or PDF extention. PDF report format is allowed only if PDF995 printer driver is installed on the server (http://www.pdf995.com). Note, RTF reports can't be obtained if the server works under Paradox 8.
- warnOnSize - if the size of the resulting report file exceeds this value (in bytes), the user will be asked for downloading confirmation.
- Other parameters - see description for pxfChkModalDlg
10. Assorted topics
- Embedding HTML code in Paradox forms
PxForms allows to embed HTML code in the forms. To do it, place a text UIobject on the form, and type in desired HTML code, preceeded by &HTML keyword. Also, you can change this HTML code dynamically at runtime. Demo HTML form (demohtml.fsl) demonstrates an example of this technics. - Transferring graphic objects
By default, all graphic UIobjects are converted by PxForms to the .GIF format
before transferring to browser. However, if a graphic object has the name started
with JPG_, PNG_ or
BMP_ prefix, it's content will be transferred in
the corresponding format.
If a graphic object has the name started with GIF_RxxxGxxxBxxx_ prefix, where xxx are the RGB color components, the corresponding color in the image is considered as transparent. For example, an object with the name GIF_R255G255B255_somename will be transparent in areas painted by white color. - Ignoring objects
If an UIobject name in the form starts with nopxf_ prefix, this objects is completly ignored by PxForms and will not be shown in the browser. - Embedding the current date/time object in the forms
PxForms allows to embed the current date/time indicator in the forms. To do it, place a text UIobject on the form, and type in desired datetime format description, preceeded by &TIMESTAMP keyword. The following specifiers are valid (note, the specifiers are case-sensitive):- %DN - day of week name
- %MN - month name
- %D - day as 1
- %DD day as 01
- %M - month as 1
- %MM - month as 01
- %Y - two-digits year
- %YY - four-digits year
- %H - hours as 1 (12-hours system)
- %HH - hours as 01 (12-hours system)
- %h - hours as 1 (24-hours system)
- %hh - hours as 01 (24-hours system)
- %m - minutes as 1
- %mm - minutes as 01
- %s - seconds as 1
- %ss - seconds as 01
- %N - AM/PM sign
For example, the following string &TIMESTAMP %DD/%MM/%Y %hh:%mm:%ss gives you something like 22/03/05 13:03:01
Demo form (demo.fsl) demonstrates an example.
- Arrive method precautions
If for a field inside tableframe arrive method is defined, it's strongly recommended to place as the first line of this method the following:
if eventInfo.reason=RefreshMove then return endIf
11. PxForms Sample application
PxForms Sample application offers the following features:
- User's authentication
- OPAL code and HTML templates, which can be easily used for building your own applications
The Sample application contains:
- PxForms core components
- Server form - webserv.fsl (with source)
- Main application library - Pxfapp.lsl (with source)
- Login page - /Site/login.htm
- Main HTML page - /Repos/main.htm
- Access table (contains login names and passwords) - access.db
- Active users table - uactive.db
- Access log table - log.db
12. How to create your own application, powered by PxForms
The easiest
way is the following:
- Customize the login HTML form (/Site/login.htm) look if needed
- Replace HTML content of /Repos/main.htm between <!--
Custom code. Place what you need below --> and <!--
End of custom code. --> lines to change buttons for your startup form.
Do not change the rest of this form!
- Adjust your Paradox forms' code so it meets PxForms
specifications.
- Translate messages in lang.db if needed