mirror of
https://github.com/postgres/postgres.git
synced 2025-10-16 17:07:43 +03:00
225 lines
11 KiB
HTML
225 lines
11 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
|
|
<HTML>
|
|
<HEAD>
|
|
<TITLE></TITLE>
|
|
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
|
<META NAME="GENERATOR" CONTENT="Mozilla/3.04Gold (X11; I; Linux 2.0.32 i586) [Netscape]">
|
|
</HEAD>
|
|
<BODY TEXT="#000000" BGCOLOR="#FFEBCD" LINK="#0000EF" VLINK="#51188E" ALINK="#FF0000">
|
|
|
|
<H1>FORMS</H1>
|
|
|
|
<P>
|
|
<HR WIDTH="100%"></P>
|
|
|
|
<P>This version (0.83) of PgAccess has changed a little the visual form
|
|
builder introduced since 0.82 version : variable handling, query-results
|
|
interface and control bindings naming convention. Please read it carefully,
|
|
download the database demo and practice a while before trying to design
|
|
your own forms.</P>
|
|
|
|
<P>For the moment, it has only some basic widgets : labels, entries, buttons
|
|
, listboxes , checkboxes and radiobuttons.</P>
|
|
|
|
<P>Also there is a pseudo query widget that allows you yo have access to
|
|
a query results. </P>
|
|
|
|
<P><B>How do you generate widgets :</B></P>
|
|
|
|
<OL>
|
|
<LI>select a widget from the toolbox by clicking the appropriate radiobutton</LI>
|
|
|
|
<LI>move to the canvas , point with the mouse at the desired location and
|
|
click the mouse button to begin</LI>
|
|
|
|
<LI>keeping the mouse-button pressed move the mouse in order to draw a
|
|
rectangle that will hold the widget</LI>
|
|
|
|
<LI>release the mouse-button </LI>
|
|
</OL>
|
|
|
|
<P>In the rectangle that you have designed it will appear the selected
|
|
object.<BR>
|
|
Move now to the attribute window to change some of its properties.</P>
|
|
|
|
<P>Renaming, resizing items are possible (for the moment) only by modifying
|
|
appropriate parameters in attribute window. You <B>must </B>press Enter
|
|
in the edit field after changing a value in order to be accepted. </P>
|
|
|
|
<P>You can also move items by dragging them or delete them by pressing
|
|
Del key after selecting them.</P>
|
|
|
|
<P>In attribute window, there are some fields named <B><TT><FONT SIZE=+1>Command
|
|
</FONT></TT></B>and <B><TT><FONT SIZE=+1>Variable</FONT></TT></B>. </P>
|
|
|
|
<P>The field <B><TT><FONT SIZE=+1>Command </FONT></TT></B>have meaning
|
|
only for Button widgets and holds the command that will be invoked when
|
|
the button is pressed. </P>
|
|
|
|
<P> The field <B><TT><FONT SIZE=+1>Variable </FONT></TT></B>have
|
|
meaning only for EditField , Label widgets , checkboxes and radiobuttons
|
|
and it is the name of the global variable that will hold the value for
|
|
that widget. For checkboxes the values are <B>t</B> and <B>f</B> (from
|
|
true and false) in order to simplify binding to logical data fields (PgAccess
|
|
0.82 used 0 and 1).</P>
|
|
|
|
<P> For radiobuttons, it is usual to assign the
|
|
same variable to the same radiobuttons within the same group. That variable
|
|
will contain the name of the widget of the radiobutton that has been pressed.
|
|
Let's presume that you have entered 3 radiobuttons named red, green and
|
|
blue, all of them having the same variable named color. If you will press
|
|
them, they will assign their names to global variable.</P>
|
|
|
|
<P> In order to make a simple test, put an entry
|
|
field and set it's variable to <B>v1</B> and a button who's command is
|
|
"set v1 whisky". Press the button "Test form" and click
|
|
on the button. In that entry should appear whisky. <BR>
|
|
Another test is defining in Script module a script called "My first
|
|
script" having the following commands: <BR>
|
|
<TT><FONT SIZE=+1>tk_messageBox -title Warning -message "This is my
|
|
first message!"</FONT></TT> <BR>
|
|
and then define a button who's command is <B><TT><FONT SIZE=+1>execute_script
|
|
"My first script"</FONT></TT></B>. </P>
|
|
|
|
<H2>Database manipulation</H2>
|
|
|
|
<P>Let's presume that our form have the internal name <B><TT>mf </TT></B>(my
|
|
form). He will be referred inside the Tcl/Tk source as <B><TT>.mf</TT></B>
|
|
<BR>
|
|
If you want to close the form in run-time you have to issue the command
|
|
<B><TT>destroy .mf</TT></B> </P>
|
|
|
|
<P>Also, any widget will have the name prefixed by <B><TT>.mf </TT></B>
|
|
We will have <B><TT>.mf.button1</TT></B> or <B><TT>.mf.listbox1</TT></B>
|
|
. </P>
|
|
|
|
<P>We can name the query widget <B><TT>qry</TT></B> for example. The complete
|
|
name will be <B><TT>.mf.qry</TT></B> then. <BR>
|
|
The <B><TT>Command </TT></B>property of the query widget must contain the
|
|
SQL command that will be executed. <BR>
|
|
When the form will be in run-time, automatically you will have acces to
|
|
the following procedures and functions : </P>
|
|
|
|
<P><B><TT>.mf.qry:open</TT></B> - opens the connection and execute the
|
|
query (returns nothing) <BR>
|
|
<B><TT>.mf.qry:setsql newsql</TT></B> - set the command query that will
|
|
be executed at the next <B><TT>.mf.qry:open<BR>
|
|
.mf.qry:nrecords</TT></B> - returns the number of records in the selected
|
|
query <BR>
|
|
<B><TT>.mf.qry:crtrecord </TT></B>- returns the current record number inside
|
|
the query result<BR>
|
|
<B><TT>.mf.qry:fields</TT></B> - returns a list of the fields in the result
|
|
set <BR>
|
|
<B><TT>.mf.qry:movefirst</TT></B> - move the cursor to the first record
|
|
in the recordset <BR>
|
|
<TT><B>.mf.qry:movelast</B> , <B>.mf.qry:movenext</B> , <B>.mf.qry:moveprevious</B>
|
|
</TT>- moves the cursor there<BR>
|
|
<B><TT>.mf.qry:moveto newrecno</TT></B> - move the cursor to that new record
|
|
number (first is 0)<BR>
|
|
<B><TT>.mf.qry:updatecontrols</TT></B> - update the variables inside the
|
|
designed form that have a particular name (I'll explain later) <BR>
|
|
<B><TT>.mf.qry:clearcontrols</TT></B> - clear the variables inside the
|
|
designed form binded to a query result<BR>
|
|
<TT><B>.mf.qry:fill listbox field</B> </TT>- fill the named listbox (whole
|
|
widget name as <B><TT>.mf.listbox1</TT></B>) with the all the values of
|
|
that field in the current queryresult<BR>
|
|
<B><TT>.mf.qry:close</TT></B> - close the connection (<B><FONT COLOR="#FF0000">if
|
|
you don't close the query result, you will loose some memory</FONT></B>)
|
|
</P>
|
|
|
|
<P>It's no need to close a query-result if you want to assign it a new
|
|
SQL command and open it again. That will be done automatically.</P>
|
|
|
|
<P>If you want to bound some controls to the fields of the recordset, you
|
|
will have to name their associate variable like that : </P>
|
|
|
|
<P><B><TT>mfqry(salary)</TT></B> to get the "salary" field ,
|
|
or <B><TT>mfqry(name)</TT></B> to get the "name" field. So, you
|
|
take the internale name of the form (without the leading point) and merge
|
|
it with the query-widget name and you will get a associative arrayname.
|
|
The values are given using the field name as a key in this associative
|
|
array.<BR>
|
|
<B><FONT COLOR="#FF0000">* WARNING *</FONT></B> The naming style has been
|
|
changed from 0.82 version of PgAccess and I cannot guarantee that it not
|
|
be changed again in the future. I'm just trying to make it as simple it
|
|
could be. The old style naming convention had some incompatibilities with
|
|
Tcl/Tk syntax.</P>
|
|
|
|
<P><B><FONT SIZE=+1><FONT COLOR="#9400D3">QUESTION</FONT> : </FONT></B>Do
|
|
you think that it would be more clear if the above functions and procedures
|
|
regarding a query-widget would be named in a similar manner as binded variable
|
|
controls ? That mean, <B><TT>mfqry:open</TT></B> and <B><TT>mfqry:updatecontrols</TT></B>
|
|
instead of <B><TT>.mf.qry:open</TT></B> and <B><TT>.mf.qry:updatecontrols</TT></B>
|
|
?</P>
|
|
|
|
<P>The only advantage of <B><TT>.mf.qry:open</TT></B> is that is much closer
|
|
to the Tk method of referring objects within a window and it may give to
|
|
the programmer the feeling that he is using a object-oriented widget. Since
|
|
I cannot use further for naming binded variables a similar manner (<B><TT>.mf.qry.salary)</TT></B>
|
|
it might be possible to abandon that naming convention .</P>
|
|
|
|
<P>Here it is a dumped <B><A HREF="formdemo.sql">sample database</A></B>
|
|
that contains a demo database. What should you do ?<BR>
|
|
Shift-click the above URL in order to download that tiny file (4 Kb). Create
|
|
a empty database and <B><TT>psql yourdatabase <formdemo.sql</TT></B></P>
|
|
|
|
<P>You should find a single table called "phonebook" a form called
|
|
"Phone book" and another "A simple demo form".</P>
|
|
|
|
<P>First of all enter and view the phonebook table in table view. Note
|
|
the fields and their values.<BR>
|
|
Open the "Phone book" form and enter a letter (a, e or i) in
|
|
the field to the left of "Find" button then press Find. It's
|
|
fine to enter one letter in order to get more records in query result.
|
|
You will get information about the number of records selected, in the listbox
|
|
you will see all the values of field "name" from the current
|
|
data set. Use buttons to move to first, next, previous or last record within
|
|
the record set.</P>
|
|
|
|
<P>In order to add a new record, press the "New" button in order
|
|
to get new, clean entries. Fill them with your data and press "Add
|
|
new" button. A new phonebook record will be added. Also, if you want
|
|
to update a record, change it's values in the displayed fields after finding
|
|
it and press "Update" button. The values will be updated in the
|
|
database BUT NOT IN THE CURRENT QUERY RESULT . If you want to see them
|
|
modified, make a new query trying to find it again.</P>
|
|
|
|
<P><FONT COLOR="#000080">Before using the results from a query you should
|
|
know that the information that has been retrieved could be found only in
|
|
your computer client memory. It has <B>no live connection</B> to the data
|
|
from the database. That's why it isn't possible to develop a simple update
|
|
function as interface to that query-result widget. More than that : a query
|
|
result could be obtained from a SQL command that return a non-updatable
|
|
data set !!! For example fields gathered from multiple tables or summary
|
|
fields. It isn't just simple to make an automatic update procedure. The
|
|
programmer must know how to make the update or the append procedure, sometimes
|
|
using key fields to point to the desired record or an OID. There are examples
|
|
in the demo database in "Phone book" form. It may be possible
|
|
that in the future, I will develop another pseudo-widget describing a table.
|
|
It would be more simple than to implement an update or append or even a
|
|
delete procedure.</FONT></P>
|
|
|
|
<P>There is in the demo database also another simple form called "A
|
|
simple demo form". It will show you how to handle variables from checkboxes,
|
|
radiobuttons, how to use listboxes, open another forms and so on. I think
|
|
they will help you.</P>
|
|
|
|
<P>In order to avoid naming user defined forms with a particular
|
|
name of another PgAccess form, I would recommend naming them as udf0, udf1
|
|
(user defined form 0 , 1 ) </P>
|
|
|
|
<P>
|
|
<HR WIDTH="25%"></P>
|
|
|
|
<P>Please feel free to send me your oppinion at <B>teo@flex.ro</B> on forms
|
|
designing and usage. </P>
|
|
|
|
<P><B><FONT SIZE=+1>KEEP IN MIND ! THE
|
|
FORM API WILL CHANGE IN ORDER TO BE MORE SIMPLE AND BETTER! SEND
|
|
ME YOUR WISHES, YOUR IDEAS, YOUR OPINIONS !<BR>
|
|
ALSO ... DON'T BLAME ME IF YOU WILL HAVE TO RE-DESIGN YOUR OLD FORMS DUE
|
|
TO SOME INCOMPATIBILITIES WITH NEWER PGACCESS VERSIONS.</FONT></B></P>
|
|
|
|
</BODY>
|
|
</HTML>
|