Working with SubForms in dBASE
Last Modified: July, 2002
Ken Mayer, Senior SQA Engineer
dBASE Inc.
Print Friendly Version
Example code can be obtained here: SubformSamples.zip
What Is a SubForm?
What exactly is a subform? Simply put, it is a form contained
within another form. It is a new type of container that can be used
in your forms, and it acts mostly like a regular dBASE form (see details
given below).
In terms of dBASE's dBL programming language, a subform is a new
object in dBASE Plus, subclassed (internally) from the stock form
class.
For all intents and purposes, a subform has all the properties, methods
and events of a standard form, except as noted below -- the following
information is from dBASE R&D:
- Subforms do not have the following properties:
- appSpeedBar
- designView
- scaleFontName
- scaleFontSize
- scaleFontBold
- MDI
- menuFile
- Subforms do not have a ReadModal() method.
- Subforms have a parent property, which the form object does not
have. The parent property is read-only once the subform is instantiated
-- when you create a subform the property is set at that time,
therefore you cannot set the parent property by code after it is
open. If you need to change the parent, close the subform, and
reinstantiate it with the new parent form ...
- Subforms still have the inDesign property, even though
you cannot at this time bring the subform into the designer (see
later in this document) -- this is for compatibility with custom
controls that need to check the parent.inDesign property.
- Subforms behave as if MDI=false and are parented to another form
or subform.
- Parenting the subform to a form (or another subform) restricts
the subform to be displayed within the client area of the parent
form. It also allows the parent form to close the subform when
it is being closed.
- Subforms are not form components.
- Subforms should be able to have their own popup menu. (See the
OLH for setting up Popup menus for forms -- the exact same syntax
works with subforms. Also see the samples -- there is a simple
example of a form with a popup and a subform with a popup -- run
SubPopupTest.wfm to see this.)
- Subforms are able to have their own toolbar, however, the toolbar
appears ON THE SUBFORM, not the _app.framewin ... (see test form
SubToolbarTest.wfm in the sample code).
- All form components should be able to work properly on a subform
as they do on a form.
- A form containing one or more subforms internally tracks which
subform (if any) is currently active. When a subform is active,
the subform has the focus. When a form component is given focus,
the active subform loses focus and is set to inactive. Clicking
anywhere on a subform or subform component should activate the
subform and set focus to a control on the subform.
- A form's canClose will call the canClose for any child subforms.
If a subform's canClose returns false, the form's canClose
will return false (and the parent form will not close).
- Subforms can be parents of other subforms.
How Do I Use a SubForm?
Programmatically it's as simple as:
fMain = new Form()
fSub = new SubForm( fMain ) // 'fMain' here is the PARENT form
fMain.open()
fSub.open()
The code shown above would produce the following:
Form with a subform
Note that there is an optional parameter after the parent reference.
The optional parameter is the text that appears in the titlebar of
the subform. You can either set this when you create an instance of
the subform or you can set the subform's text property.
fMain = new Form()
fSub = new SubForm( fMain, "My Subform" )
// 'fMain' here
is the PARENT form
// and the text
"My Subform" is the titlebar text
fMain.open()
fSub.open()
As a developer there are a few things that are useful to know:
- Opening a parent form does not open any subforms that may
be associated with it -- you have to open those individually.
- If you attempt to release a parent form that has at least one
subform, references to the parent will still exist -- you have
to release the subforms to remove the references to the parent
form. (Use the release() method of the subform ...)
- You can create a subform with no titlebar, no border, etc. by
setting the following properties:
- sizeable = false
- moveable = false
- sysMenu = false
- maximize = false
- minimize = false
If you set a colorNormal property for the subform you will get
just that subform colored. If you set the clientEdge property to
true you will get a border on the subform.
- Objects with transparent=true on a subform will show the background
of the subform, not the parent form.
- If you wish to use the title parameter to pass title text to the
subform, make sure that the text property of the subform is not
included in the constructor code (the form designer defaults to
setting the property to an empty string) -- the subform's text
property will override the parameter passed to the subform otherwise.
You can use a form's OPEN method, or ONOPEN event to open subforms,
you can use pushbutton onClick events -- you have a lot of power and
flexibility here.
Using the Designers to Create Subforms
The form designer does not, at this time, directly support the creation
or modification of subforms. However, if you create a form, you can
make it a subform by changing the following statement:
class TestFormForm of FORM
// Change to:
class TestFormForm( oParent, cTitle ) of SUBFORM( oParent, cTitle
)
Note that when you make this change, the subform cannot be modified
in the form designer unless you change that statement back.
DISCLAIMER: the author is an employee of dBASE, Inc., but has written
this on his own time. If you have questions regarding this .HOW
document, or about dBASE you can communicate directly with the
author and dBVIPS in the appropriate newsgroups on the internet.
HOW TO files are created as a free service by members of dBVIPS
and dBASE, Inc. employees to help users learn to use dBASE more
effectively. They are edited by both dBVIPS members and dBASE,
Inc. Technical Support (to ensure quality). This HOW TO file MAY
NOT BE POSTED ELSEWHERE without the explicit permission of the
author, who retains all rights to the document.
Copyright 2002, Kenneth J. Mayer. All rights reserved.
EoHT: SubForms.htm -- July, 2002 -- KJM
|