6 |
The LA Fox Developer Newsletter
October 1999
FoxPro Q&A
Q. I would like to add the button ‘Dial’ to my VFP grid with
names and telephone numbers. After pressing the dial-button
my modem should dial the number.
Al. If you are working on NT or Win95 you can use
MSCOMM32.OCX that ships with VFP.
A2.
MSCOMM32.OCX only installs if your running Win95 or NT,
not on Windows 3.1. If so, try this routine
using
the Window
API. It works well under 3.1, pretty stable on 95 & NT. You’ll
need to provide the parameters starting with THISFORM.
*
write data to the serial port.
SET LIBRARY TO ‘FOXTOOLS.FLL’
*
Assumes that the number to dial is stored in
ThisForm.CallNumber
M.Output
=
“ATDT”
+
ThisForm.CallNumber
+
PAM
+
CHR(13)
LOCAL Iccomport, lcdstring, Inport,
Iccomport
=
LEFT(THISFORM.ComPort,4)
Icdstring
=
m.output
OPENCOMM
=
REGFN(”OPENCOMM”,’CIl”,”l”,’USER.EXE’)
WRITECOMM
=
REGFN(’WRITECOMM’,’ICI’,’I’,USER.EXE’)
CLOSECOMM
=
REGFN(’CLOSECOMM’,’I’,’I’,’USER.EXE’)
open comm port
LNPORT
=
CALLFN(OPENCOMM,LCCOMPORT,1 00,100)
x
=
SECONDS()
DO WHILE SECONDSO
.
X <1
ENDDO
send string to modem
=CALLFN(WRITECOMM,LNPORT,LCDSTRING,LEN(LCDSTRING))
mTlmø
=
SEC.OP4DS()
**
wait for KeyPress or timeout
DO While INKEY(”HM”) =0 AND SECONDSO
-
mTime <15
ENDDO
hang up modem
M.Output
=
PATHOAMP
+
CHR(13)
=CALLFN(WRITECOMM,LNPORT,LCDSTRING,LEN(LCDSTRING))
=CALLFN(CLOSECOMM,LNPORT)
x=SECONDS()
DOWHILESECONDSQ-X<2
ENDDO
RELEASE LIBRARY ‘FOXTOOLS’
(Ed Vanduyne, CIS ID: 75740,3071)
*
save the file
Endif
Q. What is the scope of an Include file?
Al.
When
you include a file in
a form using the Form/Include
File menu item, all objects of the form have access to the
contents. If you explicitly #include it in a method, only that
method has access to it. In the class designer, the same rules
apply. But you don’t have an easy way to have VFP include the
same file in all classes stored in the classlib, it has to be
specified on a class by class basis. No you don’t “inherit”
include file contents. For a subclass you need to do is create a
.h
file
for the subclass and then #include the parentclass’ .h
file
first and then add the #deflnes for the subclass. Something
along the lines:
create class inc1 of inctest as custom
*
this class has an include file inc1.h
*
inci.h
#define x I
create class incla of inctest as inc1 from inctest
*
this class has an include file inc1a.h
*
inc1a.h
#include incl.h
#define y 2
otherwise
inc1 a would not be able to use the #deflned x item.
It’s far from perfect, if the parentclass include filename changes
the subclasses get broken, but it’s the
only way you can do it.
What I generally do with
classlibs is create a single
ClassLibName.h file and
every class stored in that classlib that
needs an include file puts it’s contents in the single file. For
application level stuff I create a single AppName.h file and
include that on all the forms and prgs. And AppName.h #in-
cludes any necessary .h files for the classlibs plus the app
specific stuff.
(David
Frankenbach, CIS ID: 72147,2635)
Q. I am allowing the user to specify the name of a file. I am
using PUTFILEO to
allow the user to enter the name, but when
they select a file that always exists, I always get a warning
about overwriting the
file. This happens no matter the setting of
SET SAFETY. Is
there an option?
Al. PutFile() invokes the standard windows Save Dialog. One
way around this is to use the common dialog OCX control. By
placing the OCX control on a form, you can invoke the
ShowSave() Method of the control. If you elect to choose a file
that already exists, a dialog *wiIl not* appear. Once you have
made a file selection, this will update the FileName
Property
of the OCX control:
ThisForm.OleControll .ShowSave()
If NOT Empty(ThisForm.OleControll.Filename)
Q. How can I implement an automatically incrementing primary
key?
A. The most foolproof way I can find, and I’ve tried many, is to
use a “system” table that stores the most-recently incremented
number for each field. I have a GetPKey() function that will lock
the record in the system table, increment the number, unlock
the record and return the number. If
I wanted to, GetPKey()
could be used as the default value for the field in the database. I
choose not to do so for many reasons, but that is the simplest
way to “autonumber” in VFP, IMHO. It would be nice
if
this were
a built-in feature of the VFP engine as there are many draw-
backs to the “roll your own” techniques required now. For
example, functions for default values don’t
work
via ODBC.
(Con’t, page 9)
Page 6
|
6 |