Lets talk about a METHOD of the
form. If
you have a pushbutton named pbQuit and you want to create a
method
that responds to the button when you click it, call the Form Designer, select the
pushbutton
and in the Property Inspector, click the Events tab,
scroll
to the event named onClick and
click the wrench icon on the right hand side. That
creates
the skeleton of a method in the Source Editor named
PBQUIT_onClick in
which you can write
your performance code. Importantly, at the same time the following
reference
is automatically written into the constructor code for pushbutton pbQuit.
onClick = class::PBQUIT_ONCLICK |
|
This is the code that tells the pbQuit control object where to find the function, ( same as procedure in the Windows versions of dBASE), that should be performed when the object is clicked. The :: symbol is called a resolution operator and in this case tells the object that the function is in the same class that defines the object. If the class is a form, then the automatically generated FORM reference form.<objectName> goes to the same place.
Now, how to handle a method
that will respond to
more than one control object? A classic example is a set of three
related radio buttons. The operative event is
onChange. Every
time you click one
of the buttons its onChange event
fires but so does the onChange event
of the previously selected radio button. So what you would like
to
have is one event handler, (method), where you can code what you want
to
occur when any one of them is clicked. With a form open in design
mode and the radio buttons already named, click on the Method menu
item and then click on New Method. The Source editor will
create a skeleton method named function
Method. Change
the function’s name
to something that means something like function
radiobutton_Change if
the radio buttons are
changing what you define as a mode. Write your code to catch only
the radio button that is newly selected and what you want to happen.
if this.value // only the newly selected button’s value is true do case case this.name == "RADIOBUTTON1" // action code case this.name == "RADIOBUTTON2" // action code case this.name == "RADIOBUTTON3" // action code endcase endif return |
|
THIS is an automatically generated reference possessed by every object that identifies itself when making a method call, (similar to Sender used by several other languages).
After setting up the method as described above, and while the cursor is still within the method in the Source Editor, click on the Method menu item and then click on Link Event. A dialog box opens in which you can select the object and the object event that will call the method. In this example select the radiobutton1 object and its onChange event and click OK. Repeat for radiobutton2.onChange() and radiobutton3.onChange(). This dialog writes the appropriate calling code into EACH control object constructor code to call your common method just as described earlier for a single pushbutton object calling a single onClick() method.
Also, you can write a
procedure, (that is not a
method of the class) within the same form. Here is an example you can
create
and run. Open a new form in the Form designer and place one
pushbutton
on it. In the Source Editor, scroll all the way to the
bottom,
or click on the bottom
icon in the left treeview
pane. Below the
endclass statement
enter the following
function:
Function writeTest ? "This is a test" return |
|
Select the pushbutton and
select the wrench
icon
for the onClick event
in the Property Inspector. Complete the auto-generated
skeleton
so it reads…
Function PUSHBUTTON1_onClick writeTest() return |
|
The parenthesis () following writeTest is the procedure/function CALL operator. Now when you run the form and click the button: “This is a test” will be written to the dBASE Command Window Results Pane. This is a contrived example because it obviously is more work to set up this way than to just enter ? "This is a test" directly in the PUSHBUTTON1_onClick() event handler, (method).
Finally, if you have a
procedure/function that
you wanted to call from another file such as
.PRG,
.CC,
.WFM you simply have
to create a
reference to it. For
example, in the Form’s
onOpen event you
could enter…
set procedure to StringBox.cc additive |
|
Thereafter, anywhere you need
to call a function
named AllTrim() from
StringBox.cc your
code would look like:
aString = " Some Text " aTrimmedString = AllTrim( aString ) ? aTrimmedString // displays "Some Text" |
|
Note that the Additive qualifier in the Set Procedure command that was introduced in Windows versions does just what it says without clearing any other procedures already referenced. Failure to use the Additive qualifier is one of the most frequent reasons for code failure in the Windows versions because it destroys all previously initiated procedure links.
Hope it helps.