Docbasic User's Guide
Docbasic User's Guide
User’s Guide
January, 1996
DOC3-DQDUG-3000
Copyright © 1996
by Documentum, Inc.
5671 Gibraltar Drive
Pleasanton, CA 94588-8547
All other products mentioned in this document are identified by the trademarks,
service marks, or product names as designated by the companies who market
those products.
Table of Contents
Preface
i
Examples .............................................................................................................. 1-12
For Programs Stored as Content................................................................ 1-12
For Programs Stored Externally ................................................................ 1-12
ii
Running a Procedure................................................................................................. 2-17
To run your procedure ............................................................................... 2-17
To pause an executing procedure ............................................................. 2-17
To stop an executing procedure ................................................................ 2-17
Debugging a Procedure ............................................................................................ 2-18
Using the Docbasic Debugger........................................................................... 2-18
Tracing Procedure Execution ............................................................................ 2-18
To step through your procedure ............................................................... 2-18
To trace procedure calls.............................................................................. 2-19
To resume execution at another line within a subroutine ..................... 2-19
Setting and Removing Breakpoints......................................................................... 2-21
Setting Breakpoints............................................................................................. 2-21
To debug selected portions of your procedure ....................................... 2-21
To start debugging partway through a procedure ................................. 2-22
To move the pointer to a line outside the current subroutine .............. 2-22
Removing Breakpoints....................................................................................... 2-23
To remove a single breakpoint manually ................................................ 2-23
To remove all breakpoints manually........................................................ 2-23
Using Watch Variables .............................................................................................. 2-24
To add a watch variable ............................................................................. 2-24
To select a watch variable........................................................................... 2-25
To delete a watch variable.......................................................................... 2-26
Modifying the Value of a Variable .......................................................................... 2-27
To modify the value of a variable on the watch variable list ................ 2-27
Exiting from Procedure Editor................................................................................. 2-29
Menu Reference.......................................................................................................... 2-30
File Menu ...................................................................................................... 2-30
Edit Menu ..................................................................................................... 2-30
Run Menu ..................................................................................................... 2-31
Debug Menu................................................................................................. 2-31
Help Menu.................................................................................................... 2-31
iii
* (operator) .................................................................................................................... 3-6
+ (operator) ................................................................................................................... 3-8
- (operator)................................................................................................................... 3-10
. (keyword) .................................................................................................................. 3-12
/ (operator) ................................................................................................................. 3-13
< (operator) ................................................................................................................. 3-15
= (statement) ............................................................................................................... 3-16
\ (operator) ................................................................................................................. 3-18
^ (operator) ................................................................................................................. 3-19
_ (keyword) ................................................................................................................. 3-20
Abs (function) ............................................................................................................. 3-21
And (operator) ............................................................................................................ 3-23
Any (data type)........................................................................................................... 3-25
ArrayDims (function) ................................................................................................ 3-26
Arrays (topic) .............................................................................................................. 3-27
ArraySort (statement) ................................................................................................ 3-30
Asc (function).............................................................................................................. 3-32
Atn (function) ............................................................................................................. 3-33
Basic.Capability (method)......................................................................................... 3-34
Basic.Eoln$ (property) ............................................................................................... 3-36
Basic.FreeMemory (property) .................................................................................. 3-37
Basic.HomeDir$ (property)....................................................................................... 3-38
Basic.OS (property) .................................................................................................... 3-39
Basic.PathSeparator$ (property) .............................................................................. 3-41
Basic.Version$ (property).......................................................................................... 3-42
Beep (statement) ......................................................................................................... 3-43
Boolean (data type) .................................................................................................... 3-44
ByRef (keyword)......................................................................................................... 3-46
ByVal (keyword) ........................................................................................................ 3-47
Call (statement)........................................................................................................... 3-49
CBool (function) ......................................................................................................... 3-51
CCur (function)........................................................................................................... 3-53
CDate, CVDate (functions) ....................................................................................... 3-54
CDbl (function)........................................................................................................... 3-56
ChDir (statement)....................................................................................................... 3-57
ChDrive (statement)................................................................................................... 3-59
iv
Choose (function)....................................................................................................... 3-61
Chr, Chr$ (functions)................................................................................................. 3-62
CInt (function) ............................................................................................................ 3-64
Clipboard$ (function) ................................................................................................ 3-66
Clipboard$ (statement).............................................................................................. 3-67
Clipboard.Clear (method)......................................................................................... 3-68
Clipboard.GetFormat (method) ............................................................................... 3-69
Clipboard.GetText (method) .................................................................................... 3-71
Clipboard.SetText (method) ..................................................................................... 3-72
CLng (function) .......................................................................................................... 3-73
Close (statement)........................................................................................................ 3-75
Command, Command$ (functions)......................................................................... 3-76
Comments (topic)....................................................................................................... 3-77
Comparison Operators (topic) ................................................................................. 3-78
Const (statement) ....................................................................................................... 3-81
Constants (topic) ........................................................................................................ 3-83
Cos (function) ............................................................................................................. 3-84
CreateObject (function) ............................................................................................. 3-85
Cross-Platform Procedures (topic) .......................................................................... 3-87
CSng (function) .......................................................................................................... 3-92
CStr (function) ............................................................................................................ 3-94
CurDir, CurDir$ (functions) ..................................................................................... 3-96
Currency (data type).................................................................................................. 3-98
CVar (function)........................................................................................................... 3-99
CVErr (function)....................................................................................................... 3-101
Date (data type) ........................................................................................................ 3-103
Date, Date$ (functions)............................................................................................ 3-105
Date, Date$ (statements) ......................................................................................... 3-106
DateAdd (function).................................................................................................. 3-108
DateDiff (function)................................................................................................... 3-110
DatePart (function) .................................................................................................. 3-112
DateSerial (function)................................................................................................ 3-114
DateValue (function) ............................................................................................... 3-115
Day (function)........................................................................................................... 3-116
DDB (function) ......................................................................................................... 3-117
DDEExecute (statement) ......................................................................................... 3-119
v
DDEInitiate (function) ............................................................................................. 3-121
DDEPoke (statement) .............................................................................................. 3-123
DDERequest, DDERequest$ (functions) ............................................................... 3-125
DDESend (statement) .............................................................................................. 3-127
DDETerminate (statement) ..................................................................................... 3-129
DDETerminateAll (statement) ............................................................................... 3-131
DDETimeout (statement) ........................................................................................ 3-132
Declare (statement) .................................................................................................. 3-134
DefType (statement) ................................................................................................ 3-144
Dim (statement) ........................................................................................................ 3-147
Dir, Dir$ (functions)................................................................................................. 3-151
DiskDrives (statement)............................................................................................ 3-154
DiskFree (function) .................................................................................................. 3-155
dmAPIExec (function) ............................................................................................. 3-156
dmAPIGet (function) ............................................................................................... 3-157
dmAPISet (function) ................................................................................................ 3-159
dmExit (function) ..................................................................................................... 3-160
Do...Loop (statement) .............................................................................................. 3-162
Double (data type) ................................................................................................... 3-165
ebBoolean (constant)................................................................................................ 3-167
ebCancel (constant) .................................................................................................. 3-168
ebCritical (constant) ................................................................................................. 3-169
ebCurrency (constant) ............................................................................................. 3-170
ebDataObject (constant) .......................................................................................... 3-171
ebDate (constant)...................................................................................................... 3-172
ebEmpty (constant) .................................................................................................. 3-173
ebError (constant)..................................................................................................... 3-174
ebHidden (constant) ................................................................................................ 3-175
ebInteger (constant) ................................................................................................. 3-176
ebLong (constant)..................................................................................................... 3-177
ebNone (constant) .................................................................................................... 3-178
ebNormal (constant) ................................................................................................ 3-179
ebNull (constant) ...................................................................................................... 3-180
ebObject (constant)................................................................................................... 3-181
ebReadOnly (constant) ............................................................................................ 3-182
ebSingle (constant) ................................................................................................... 3-183
vi
ebString (constant) ................................................................................................... 3-184
ebSystem (constant) ................................................................................................. 3-185
ebSystemModal (constant) ..................................................................................... 3-186
ebVariant (constant) ................................................................................................ 3-187
ebVolume (constant)................................................................................................ 3-188
Empty (constant) ...................................................................................................... 3-189
End (statement) ........................................................................................................ 3-190
Environ, Environ$ (functions)................................................................................ 3-191
EOF (function) .......................................................................................................... 3-192
Eqv (operator)........................................................................................................... 3-193
Erase (statement)...................................................................................................... 3-195
Erl (function)............................................................................................................. 3-197
Err (function) ............................................................................................................ 3-198
Err (statement) .......................................................................................................... 3-199
Error (statement) ...................................................................................................... 3-200
Error Handling (topic)............................................................................................. 3-201
Error, Error$ (functions).......................................................................................... 3-203
Exit Do (statement) .................................................................................................. 3-205
Exit For (statement).................................................................................................. 3-207
Exit Function (statement)........................................................................................ 3-209
Exit Sub (statement)................................................................................................. 3-210
Exp (function) ........................................................................................................... 3-211
Expression Evaluation (topic) ................................................................................ 3-212
External (function) ................................................................................................... 3-214
False (Constant)........................................................................................................ 3-215
FileAttr (function) .................................................................................................... 3-216
FileCopy (statement) ............................................................................................... 3-218
FileDateTime (function) .......................................................................................... 3-220
FileDirs (statement) ................................................................................................. 3-222
FileExists (function) ................................................................................................. 3-224
FileLen (function)..................................................................................................... 3-225
FileList (statement) .................................................................................................. 3-226
FileParse$ (function) ................................................................................................ 3-229
FileType (function)................................................................................................... 3-231
Fix (function)............................................................................................................. 3-233
For...Next (statement) .............................................................................................. 3-234
vii
Format, Format$ (functions)................................................................................... 3-237
FreeFile (function) ................................................................................................... 3-244
Function...End Function (statement) ..................................................................... 3-245
Fv (function).............................................................................................................. 3-2 50
Get (statement) ......................................................................................................... 3-252
GetAppInfo (function)............................................................................................. 3-255
GetAttr (function)..................................................................................................... 3-256
GetObject (function)................................................................................................. 3-258
GetSession (function)............................................................................................... 3-260
Global (statement) .................................................................................................... 3-261
Goto (statement) ....................................................................................................... 3-263
Hex, Hex$ (functions).............................................................................................. 3-265
Hour (function)......................................................................................................... 3-266
If...Then...Else (statement)....................................................................................... 3-267
IIf (function) .............................................................................................................. 3-269
Imp (operator)........................................................................................................... 3-270
Inline (statement) ..................................................................................................... 3-272
Input# (statement) .................................................................................................... 3-273
Input, Input$ (functions)......................................................................................... 3-276
InputBox, InputBox$ (functions)............................................................................ 3-278
InStr (function).......................................................................................................... 3-280
Int (function) ............................................................................................................. 3-282
Integer (data type).................................................................................................... 3-283
IPmt (function).......................................................................................................... 3-284
IRR (function) ........................................................................................................... 3-286
Is (operator)............................................................................................................... 3-288
IsDate (function)....................................................................................................... 3-290
IsEmpty (function) ................................................................................................... 3-291
IsError (function)...................................................................................................... 3-292
IsMissing (function) ................................................................................................. 3-293
IsNull (function) ....................................................................................................... 3-294
IsNumeric (function) ............................................................................................... 3-295
IsObject (function).................................................................................................... 3-297
Item$ (function) ........................................................................................................ 3-298
ItemCount (function) ............................................................................................... 3-300
Keywords (topic) ...................................................................................................... 3-301
viii
Kill (statement) ......................................................................................................... 3-302
LBound (function).................................................................................................... 3-304
LCase, LCase$ (functions) ...................................................................................... 3-306
Left, Left$ (functions) .............................................................................................. 3-307
Len (function) ........................................................................................................... 3-308
Let (statement).......................................................................................................... 3-310
Like (operator) .......................................................................................................... 3-311
Line Input# (statement)........................................................................................... 3-313
Line Numbers (topic) .............................................................................................. 3-315
Line$ (function) ........................................................................................................ 3-316
LineCount (function) ............................................................................................... 3-318
Literals (topic)........................................................................................................... 3-3 19
Loc (function)............................................................................................................ 3-321
Lock (statement) ....................................................................................................... 3-323
Lof (function) ............................................................................................................ 3-325
Log (function) ........................................................................................................... 3-326
Long (data type) ....................................................................................................... 3-327
LSet (statement)........................................................................................................ 3-328
LTrim, LTrim$ (functions) ...................................................................................... 3-330
MacID (function) ...................................................................................................... 3-331
MacScript (statement).............................................................................................. 3-332
Main (statement) ...................................................................................................... 3-333
Mci (function) ........................................................................................................... 3-334
Mid, Mid$ (functions) ............................................................................................. 3-337
Mid, Mid$ (statements) ........................................................................................... 3-339
Minute (function) ..................................................................................................... 3-341
MIRR (function) ....................................................................................................... 3-342
MkDir (statement).................................................................................................... 3-344
Mod (operator) ......................................................................................................... 3-345
Month (function) ...................................................................................................... 3-347
MsgBox (function).................................................................................................... 3-348
MsgBox (statement) ................................................................................................. 3-350
Name (statement)..................................................................................................... 3-351
New (keyword) ........................................................................................................ 3-353
Not (operator)........................................................................................................... 3-354
Nothing (constant) ................................................................................................... 3-356
ix
Now (function) ......................................................................................................... 3-357
NPer (function) ......................................................................................................... 3-358
Npv (function) .......................................................................................................... 3-360
Null (constant) .......................................................................................................... 3-362
Object (data type) ..................................................................................................... 3-363
Objects (topic) ........................................................................................................... 3-365
Oct, Oct$ (functions) ................................................................................................ 3-368
On Error (statement) ................................................................................................ 3-369
Open (statement) ...................................................................................................... 3-372
OpenFilename$ (function) ...................................................................................... 3-375
Operator Precedence (topic) ................................................................................... 3-377
Operator Precision (topic)....................................................................................... 3-378
Option Base (statement) .......................................................................................... 3-379
Option Compare (statement).................................................................................. 3-380
Option CStrings (statement) ................................................................................... 3-382
Or (operator) ............................................................................................................. 3-384
Pi (constant)............................................................................................................... 3-386
Pmt (function) ........................................................................................................... 3-387
PPmt (function)......................................................................................................... 3-389
Print (statement) ....................................................................................................... 3-391
Print# (statement) ..................................................................................................... 3-393
Private (statement) ................................................................................................... 3-396
Public (statement)..................................................................................................... 3-398
Put (statement).......................................................................................................... 3-401
Pv (function) ............................................................................................................. 3-404
Random (function) ................................................................................................... 3-406
Randomize (statement) ........................................................................................... 3-407
Rate (function) .......................................................................................................... 3-408
ReadIni$ (function) .................................................................................................. 3-410
ReadIniSection (statement) ..................................................................................... 3-411
Redim (statement) .................................................................................................... 3-413
Rem (statement)........................................................................................................ 3-415
Reset (statement) ...................................................................................................... 3-416
Resume (statement).................................................................................................. 3-417
Return (statement) ................................................................................................... 3-419
Right, Right$ (functions) ......................................................................................... 3-420
x
RmDir (statement) ................................................................................................... 3-421
Rnd (function)........................................................................................................... 3-422
RSet (statement)........................................................................................................ 3-423
RTrim, RTrim$ (functions) ..................................................................................... 3-425
SaveFilename$ (function) ....................................................................................... 3-426
Second (function) ..................................................................................................... 3-429
Seek (function).......................................................................................................... 3-430
Seek (statement) ....................................................................................................... 3-432
Select...Case (statement).......................................................................................... 3-434
Set (statement) .......................................................................................................... 3-436
SetAppInfo (function).............................................................................................. 3-438
SetAttr (statement) ................................................................................................... 3-440
Sgn (function) ........................................................................................................... 3-442
Shell (function) ......................................................................................................... 3-443
Sin (function) ............................................................................................................ 3-445
Single (data type) ..................................................................................................... 3-446
Sleep (statement) ...................................................................................................... 3-448
Sln (function) ............................................................................................................ 3-449
Space, Space$ (functions) ........................................................................................ 3-451
Spc (function)............................................................................................................ 3-452
Sqr (function) ............................................................................................................ 3-453
Stop (statement)........................................................................................................ 3-454
Str, Str$ (functions) .................................................................................................. 3-455
StrComp (function) .................................................................................................. 3-456
String (data type)...................................................................................................... 3-458
String, String$ (functions) ....................................................................................... 3-460
Sub...End Sub (statement)....................................................................................... 3-462
Switch (function) ...................................................................................................... 3-466
SYD (function) .......................................................................................................... 3-467
Tab (function) ........................................................................................................... 3-469
Tan (function) ........................................................................................................... 3-471
Time, Time$ (functions) .......................................................................................... 3-472
Time, Time$ (statements)........................................................................................ 3-473
Timer (function) ....................................................................................................... 3-475
TimeSerial (function) ............................................................................................... 3-476
TimeValue (function)............................................................................................... 3-477
xi
Trim, Trim$ (functions) ........................................................................................... 3-479
True (constant).......................................................................................................... 3-480
Type (statement)....................................................................................................... 3-481
UBound (function) ................................................................................................... 3-483
UCase, UCase$ (functions) ..................................................................................... 3-485
Unlock (statement) ................................................................................................... 3-486
User-Defined Types (topic)..................................................................................... 3-489
Val (function) ............................................................................................................ 3-491
Variant (data type) ................................................................................................... 3-493
VarType (function)................................................................................................... 3-498
Weekday (function) ................................................................................................. 3-500
While...Wend (statement) ....................................................................................... 3-502
Width# (statement) .................................................................................................. 3-504
Word$ (function) ...................................................................................................... 3-506
WordCount (function) ............................................................................................. 3-508
Write# (statement).................................................................................................... 3-509
WriteIni (statement) ................................................................................................. 3-511
Xor (operator) ........................................................................................................... 3-513
Year (function) .......................................................................................................... 3-515
xii
Preface
Purpose of the Manual
The book assumes the Documentum server and Workspace (if used) are installed
and configured. For help with installation and configuration, refer to the
Installation Guide and System Administrator’s Guide.
Intended Audience
This book is intended for application developers who are implementing Docbasic
procedures to modify or extend the normal behavior of Workspace. The book
assumes you are familiar with Workspace.
The table below describes the information you can expect to find in each chapter
and appendix.
Chapter Content
2 Explains how to use Procedure Editor, a tool that enables you to edit and
debug Docbasic procedures.
Appendix A Contains two annotated code examples illustrating the use of Docbasic.
Appendix B Lists all Docbasic runtime errors. The appendix is divided into two sections, the
first describing error messages compatible with standard Basic as implemented
by Microsoft Visual Basic and the second describing error messages specific to
Docbasic.
Appendix D Lists all Docbasic language elements and on which platforms these language
elements are supported.
Appendix F Describes differences between Docbasic 1.0 and Visual Basic 3.0 (VB) or Visual
Basic for Applications 1.0 (VBA).
This manual uses the following conventions in the command syntax specifications
and examples:
Notation Description
variable Items that are to be replaced with information that you supply appear
in italics. The type of replacement is indicated in the following
description.
[parameter] Square brackets indicate that the enclosed items are optional.
In Docbasic, you cannot end a statement with a comma, even if the
parameters are optional:
MsgBox "Hello",,"Message" 'OK
MsgBox "Hello",, 'Not valid
{Input | Binary} Braces indicate that you must choose one of the enclosed items, which
are separated by a vertical bar.
... Ellipses indicate that the preceeding expression can be repeated any
number of times.
What is Docbasic?
You can use all of the Workspace and Server API methods from a Docbasic
procedure. You can intercept any method sent by Workspace and redirect
execution to a Docbasic procedure. You can also execute any method from within
a Docbasic procedure.
You call Define from a procedure or external application. For more information
about how to use Define, refer to the Workspace Customizing Guide.
1. define,c,method,*,basic,/ProcCabinet/ProcFile,proc
2. Workspace event
method
3.
1. The Define method tells Workspace to redirect the method. The keyword
basic tells Workspace to redirect the method to a Docbasic routine, not an
external application. The last two parameters specify which procedure
receives the method.
3. Workspace sends the appropriate method call to handle the event (for
example, the Checkindw method).
Workspace
In a Docbasic routine, the Mthd parameter provides a mechanism for passing the
defined method and its arguments, if any, into the procedure. You should include
this parameter in all procedure declarations so that your procedures are ready to
accept redirected Workspace methods. If you do not declare the routine with the
Mthd parameter, the Define method will cause a runtime error.
Preprocessing
Postprocessing
The procedure pauses at this line while Workspace performs the default behavior
and resumes after Workspace is finished.
The following function is called after the code that performs Step 1 and before the
code that performs Step 2:
ret% = dmAPIExec(Mthd)
The procedure pauses at this line while Workspace performs the default behavior
and resumes after Workspace is finished.
Overriding
The following illustration summarizes how Workspace handles methods you call
from Docbasic procedures.
...
End Sub
Action
code
Client
Library
Server
The following illustration summarizes the sequence of events when you use a
Docbasic procedure to customize a dialog box.
Modal method
1. The Define method intercepts the Modal method and sends it to the
HandleModal procedure.
Modifying Objects
To modify the values of Workspace objects, use the Setdata method, which is
executed with the dmAPISet function. The syntax is:
ret% = dmAPISet("setdata,session,object_id,attribute","value")
For example, the following code changes the text on the Cancel button in the
Attributes dialog box from Cancel to Done. The object_id argument,
DdaAttributes.pButCancel, is a combination of the dialog box name and the
control name.
ret% = dmAPISet("setdata,c,DdaAttributes.pButCancel,text","Done")
To determine the value of a Workspace object, use the Getdata method, which is
executed with the dmAPIGet function. The syntax is:
text$ = dmAPIGet("getdata,session,object_id,attribute")
For example, the following code returns the label text on the Cancel button in the
Attributes dialog box.
text$ = dmAPIGet("getdata,c,DdaAttributes.pButCancel,text")
When Workspace attempts to open a dialog box, you can intercept the Modal
method call that is generated and customize the dialog box, as described in
“Working With Workspace Objects” earlier in this chapter. To display the dialog
box after customizing it, use the Modal method, which is executed with the
dmAPIExec function. The syntax is:
retval% = dmAPIExec("modal,session,object_id")
For example:
retval% = dmAPIExec("modal,s0,8000001F0000001D")
You could also use the following code instead of the numeric object ID:
DdaAttributes.dm_document
For details about the Modal method, refer to the Workspace Customizing Guide.
You can close any dialog box that you opened. (To open a dialog box, use the Modal
method, as described in “Opening Dialog Boxes.”) You cannot close a dialog box
opened by Workspace.
To close a dialog box, use the Endmodal method, which is executed with the
dmAPIExec function. The syntax is:
retval% = dmAPIExec("endmodal,session,object_id")
For example:
retval% = dmAPIExec("endmodal,s0,8000001F0000001D")
The following example shows how to modify the Save button in a dialog box
before it is displayed.
When a dialog box is created, Workspace calls the Modal method. The following
code redirects the Modal method to the HideSave procedure in the file
HideSaveProc.
define,c,dcapp,modal,DdaAttributes,basic,/Cabinet/HideSaveProc,HideSave
The HideSave procedure accepts the Modal method as a parameter. It uses the
dmAPISet function to change the Enabled and Visible attributes of the Save button.
Then it uses the dmAPIExec function to return the Modal method to Workspace,
which displays the modified dialog box.
Sub HideSave(Mthd As String)
retval% = dmAPISet(setdata,c,Ddaattributes.pButSave,Enabled","F" )
retval% = dmAPISet(setdata,c,Ddaattributes.pButSave,Visible","F" )
retval% = dmAPIExec(Mthd)
End Sub
In addition to using Docbasic programs to customize Workspace, you can also use
Docbasic to add features and functionality at the server level. For example, you
may want to write a program that automatically retrieves archived content when
a user requests an archived document or a program that performs data validation
when a document moves from one task to another in a router.
(The System Administrator’s Guide contains detailed instructions for using Docbasic
to restore archived content. Instructions for using Docbasic procedures in
workflows are found in the Server User’s Guide.)
If you create a method object with a Docbasic program as content, specify the
following attribute values:
Set the method_verb attribute to: dmbasic.
You can also include any of the arguments accepted by dmbasic (such as -e
to specify and entry point and -p to specify parameters) as listed in Table 1-
1. Do not include the -f argument.
Setting the method_type is necessary so the server will know how to pass
arguments to dmbasic. Setting method_type to “dmbasic” causes the server to add
“-f” in front of the content file name and to add the “--” flag before any arguments
specified on the DO_METHOD command line. The -- flag directs dmbasic to pass
those arguments to the Docbasic program.
For filename, enter the full path and name of the Docbasic program file. You
can also include any of the other arguments accepted by dmbasic as listed in
Table 1-1.
Set the use_method_content attribute to: FALSE.
Set the method_type attribute to: dmbasic.
Using dmbasic
Dmbasic is the program that executes Docbasic programs at the server level. You
can use dmbasic the same way you use gawk to execute a GAWK script. The
forward slash (/) is not accepted as an argument separator in dmbasic.
Argument Description
-flist_of_file_names Specifies one or more Docbasic program files that you want to execute.
Separate the file names with spaces. This argument is required if the
Docbasic program or programs are stored in an external file. If the
Docbasic program is stored as the content of the method, do not specify
this argument; the server will add the argument when it executes the
method.
-eentrypoint Specifies the name of a procedure in the program to run. If the -f argument
specifies multiple files, then the program containing the procedure must
be first in the list.
-pparameter Specifies a parameter to pass to the program or entry point. You can
repeat this argument to specify more than one parameter.
Argument Description
-c Directs dmbasic to only compile the file and not to execute it.
Examples
This section contains some examples of the command line generated by different
combinations of method attributes and EXECUTE commands.
Now assume that the Docbasic program is stored as an external file, and the
method_verb attribute is set to:
dmbasic -eMyMain -f/myhome/docbasic/myprogram.txt
If the following command is used to execute the program (the same as the previous
example):
EXECUTE do_method WITH METHOD = 'MyMethod' WITH ARGUMENTS =
'tribble3 dist_component1 0600164680000571 server_config_1'
Suppose you added the first two of the four arguments to the method_verb
attribute as follows:
You can specify the remaining two arguments in the EXECUTE command:
EXECUTE do_method WITH METHOD = 'MyMethod' WITH ARGUMENTS =
'0600164680000571 server_config_1'
This section provides general information that will help you work most effectively
with Procedure Editor. It includes an overview of Procedure Editor's application
window—the interface you'll use to edit, run, and debug your Docbasic
procedures—as well as lists of keyboard shortcuts and information on using the
Help system.
Toolbar
The following list briefly explains the purpose of each of the tools on Procedure
Editor's toolbar. The use of these tools is described in more detail later in the
chapter.
Toolbar Tools
Table 2-1 Toolbar Buttons
Add Watch Displays the Add Watch dialog box, in which you can
specify the name of a Docbasic variable. Procedure Editor
then displays the value of that variable, if any, in the watch
pane of its application window.
Single Step Executes the next line of a Docbasic procedure and then
suspends execution of the procedure. If the procedure calls
another Docbasic procedure, execution will continue into
each line of the called procedure.
Procedure Step Executes the next line of a Docbasic procedure and then
suspends execution of the procedure. If the procedure calls
another Docbasic procedure, Docbasic will run the called
procedure in its entirety.
Keyboard Shortcuts
The following lists summarize the various types of keyboard shortcuts,
including general shortcuts, navigating shortcuts, editing shortcuts, and
debugging shortcuts.
Key(s) Function
Ctrl+F Displays the Find dialog box, which allows you to specify text for which
you want to search.
F3 Searches for the next occurrence of previously specified text. If you have
not previously specified text, displays the Find dialog box.
Key(s) Function
Left arrow Moves the insertion point left by one character position.
Right arrow Moves the insertion point right by one character position.
Ctrl + Left arrow Moves the insertion point to the start of the next word to the left.
Ctrl + Right arrow Moves the insertion point to the start of the next word to the right.
Home Places the insertion point before the first character in the line.
End Places the insertion point after the last character in the line.
Ctrl+Home Places the insertion point before the first character in the procedure.
Ctrl+End Places the insertion point after the last character in the procedure.
Key(s) Function
Del Removes selected text or removes the character following the insertion
point without placing it on the Clipboard.
BkSp Removes selected text or removes the character preceding the insertion
point without placing it on the Clipboard.
Ctrl+Y Removes the entire line containing the insertion point without placing it
on the Clipboard.
Ctrl+C Copies selected text without removing it from the procedure and places it
on the Clipboard.
Ctrl+X Removes selected text from the procedure and places it on the Clipboard.
Key(s) Function
Shift + any navigating Selects all text between the initial location of the insertion point and the
shortcut point to which the keyboard shortcut would normally move the insertion
point. (For example, pressing Shift + Ctrl + Left arrow selects the word to
the left of the insertion point; pressing Shift+Ctrl+Home selects all the text
from the location of the insertion point to the start of your procedure.)
Key(s) Function
Shift+F9 Displays the Add Watch dialog box, in which you can specify the name of
a Docbasic variable. Procedure Editor then displays the value of that
variable, if any, in the watch pane of its application window.
Del Removes the selected watch variable from the watch pane.
Enter or F2 Displays the Modify Variable dialog box for the selected watch variable,
which enables you to modify the value of that variable.
F5 Runs a procedure.
F6 If the watch pane is open, switches the insertion point between the watch
pane and the edit pane.
F8 Activates the Single Step command, which executes the next line of a
Docbasic procedure and then suspends execution of the procedure. If the
procedure calls another Docbasic procedure, execution will continue into
each line of the called procedure.
Shift+F8 Activates the Procedure Step command, which executes the next line of a
Docbasic procedure and then suspends execution of the procedure. If the
procedure calls another Docbasic procedure, Docbasic will run the called
procedure in its entirety.
This section explains how to use Procedure Editor to edit Docbasic code.
Although in some respects editing code with Procedure Editor is like editing
regular text with a word-processing program, Procedure Editor also has certain
capabilities specifically designed to help you edit Docbasic code.
You'll learn how to move around within your procedure, select and edit text, add
comments to your procedure, break long Docbasic statements across multiple
lines, search for and replace selected text, and perform a syntax check of your
procedure.
You can also reposition the insertion point with the mouse and the Goto Line
command. This approach is especially fast if the area of the screen to which you
want to move the insertion point is currently visible.
1. If the target area is not visible, use the scroll bars at the right and bottom of
the display to scroll the target area of the procedure into view.
2. Place the mouse pointer where you want to position the insertion point.
Note: When you scroll the display with the mouse, the insertion point remains in
its original position until you reposition it with a mouse click. If you attempt to
perform an editing operation when the insertion point is not in view, Procedure
Editor automatically scrolls the insertion point into view before performing the
operation.
Here's how to jump directly to a specified line in your procedure. This approach is
especially fast if the area of the screen to which you want to move the insertion
point is not currently visible, but you know the number of the target line.
1. Press F4.
2. Enter the number of the line in your procedure to which you want to move
the insertion point
The insertion point is positioned at the start of the line you specified. If
that line is not already displayed, Procedure Editor scrolls it into view.
Note: The insertion point cannot be moved so far below the end of a procedure as
to scroll the procedure entirely off the display. When the last line of your procedure
becomes the first line on your screen, the procedure will stop scrolling. You will not
be able to move the insertion point below the bottom of that screen.
Inserting Text
Use Procedure Editor to insert text and other characters such as tabs and line
breaks the same way you would use a word-processing program: position the
insertion point at the desired location in the procedure and start typing.
However, as noted in the preceding section, Procedure Editor lets you position the
insertion point (and therefore text) in "empty" spaces—a feature that comes in
handy when you want to insert a comment in the space beyond the end of a line
in your procedure. When you insert characters beyond the end of a line, the space
between the insertion point and the last character on the line is backfilled with tab
characters.
If you press Tab, a tab character is inserted at the location of the insertion point.
Text after the tab is moved to the next tab position. If you insert new text within a
tab, the text that originally appeared on that line is moved to the next tab position
each time the new text that you are entering reaches the start of another tab
position.
Selecting Text
You can use either the mouse or the keyboard to select text and other characters in
your procedure. Regardless of which method you use, you should be aware that
you can select either a portion of one line or one or more whole lines, but you
cannot select a portion of one line plus one or more whole lines. When you select
multiple lines and start or end your selection partway through a line, Procedure
Editor automatically extends the selection to include the entire line.
Method 1
1. Place the mouse pointer where you want your selection to begin.
2. While pressing the left mouse button, drag the mouse until you reach the
end of your selection, and release the mouse button.
Method 2
1. Place the mouse pointer where you want your selection to end.
Method 3
1. Place the mouse pointer in the left margin beside the first line you want to
select.
The pointer becomes a reverse arrow, which points toward the line of text.
3. To select multiple lines, press the left mouse button and drag up or down.
1. Place the insertion point where you want your selection to begin.
2. While pressing Shift, use one of the navigating keyboard shortcuts to extend
the selection to the desired ending point.
Note: When you select an entire line of text in your procedure, it is important to
remember to extend your selection far enough to include the hidden end-of-line
character, which is the character that inserts a new line in your procedure.
Here's how to use the keyboard to select one or more whole lines in your
procedure.
1. Place the insertion point at the beginning of the line you want to select.
Once you have selected text within your procedure, you can perform a variety of
other editing operations on it, including deleting the text, placing it on the
Clipboard (either by cutting the text or copying it), and pasting it.
Deleting Text
When you delete material, it is removed from your procedure without being
placed on the Clipboard.
To delete text
Here's how to remove one or more characters, selected text, or entire lines from
your procedure.
a. To remove a single character to the left of the insertion point, press BkSp
once.
b. To remove a single character to the right of the insertion point, press Del
once.
b. Press Ctrl+Y.
Here's how to remove an unwanted line break from your procedure. This has the
effect of combining the current line with the following line.
1. Place the insertion point after the last character on the current line.
Note: If there are any spaces at the end of the current line, you may have to keep
pressing Del to remove them before you can delete the end-of-line character.
Pressing BkSp with the insertion point at the start of a line has no effect—that is, it
will not combine the current line with the preceding line.
To cut a selection
Here's how to cut text from your procedure and place the text on the Clipboard.
2. Press Ctrl+X.
To copy a selection
Here's how to copy text from your procedure and place the text on the Clipboard.
2. Press Ctrl+C.
Pasting Text
Once you have cut or copied material to the Clipboard, here's how to paste it into
your procedure at another location.
1. Position the insertion point where you want to place the contents of the
Clipboard.
2. Press Ctrl+V.
To delete a block of text and insert the contents of the Clipboard in its place,
combine the two operations by first selecting the text you want to remove and
then pressing Ctrl+V to replace it with the contents of the Clipboard.
You cannot undo operations that don't change your procedure, such as moving
the insertion point, selecting text, or copying material to the Clipboard.
Your procedure is restored to the way it was before you performed the editing
operation.
When your procedure is run, the apostrophe at the start of the line will cause the
entire line to be ignored.
Although you can place a comment at the end of a line containing executable
code, you cannot place executable code at the end of a line containing a comment
because the apostrophe at the start of the comment will cause the balance of the
line (including the code) to be ignored.
1. Position the insertion point in the empty space beyond the end of the line of
code.
When your procedure is run, the code on the first portion of the line will be
executed, but the apostrophe at the start of the comment will cause the remainder
of the line to be ignored.
Here's how to indicate that two or more lines of Docbasic code should be treated
as a single statement when your procedure is run.
4. Type an underscore ( _ ).
When you run your procedure, the code on this series of lines will be executed as
a single Docbasic statement, just as if you had typed the entire statement on the
same line.
Here's how to locate instances of specified text quickly anywhere within your
procedure.
1. Move the insertion point to where you want to start your search. (To start at
the beginning of your procedure, press Ctrl+Home.)
2. Press Ctrl+F.
3. In the Find What field, type the text you want to find
4. Select the Match Case check box if you want the search to be case-
sensitive. Otherwise, the search will be case-insensitive.
The Find dialog box remains displayed, and Procedure Editor either
highlights the first instance of the specified text or indicates that it cannot
be found. If the Find dialog box blocks your view of an instance of the
specified text, you can move the dialog box out of your way.
6. If the specified text has been found, repeat step 5 to search for the next
instance of it.
You can also click the Cancel button, which removes the Find dialog box while
maintaining the established search criteria, and then press F3 to find successive
occurrences of the specified text. If you press F3 when you have not previously
specified text for which you want to search, Procedure Editor displays the Find
dialog box so you can specify the desired text.
1. Move the insertion point to where you want to start the replacement
operation. (To start at the beginning of your procedure, press Ctrl+Home.)
3. In the Find What field, type the text you want to replace.
5. Select the Match Case check box if you want the replacement operation to
be case-sensitive. Otherwise, it will be case-insensitive.
Procedure Editor either highlights the first instance of the specified text or
indicates that it cannot be found.
8. If the specified text has been found, either click Replace to replace that
instance of it or click Find Next to highlight the next instance (if any).
Each time you click Replace, Procedure Editor replaces that instance of the
specified text and automatically highlights the next instance.
Here's how to perform a syntax check manually when you are editing your
procedure, without having to run it.
If Procedure Editor has found a syntax error, the line containing the error
is highlighted.
4. Repeat steps 1-3 until you have found and corrected all syntax errors.
Running a Procedure
Once you have finished editing your procedure, you will want to run it to make
sure it performs the way you intended. You can pause or stop an executing
procedure.
To compile your procedure, if necessary, and then execute it, click the Start tool on
the toolbar or press F5.
The procedure is compiled (if it has not already been compiled), the focus is
switched to the parent window, and the procedure is executed.
To suspend the execution of a procedure that you are running, press Ctrl+Break.
To stop the execution of a procedure that you are running, click the End tool on
the toolbar.
If you want to stop your procedure but find that the toolbar is currently
inoperative, press Ctrl+Break to pause your procedure, then click the End tool.
Debugging a Procedure
This section presents some general information that will help you work most
effectively with Procedure Editor's debugging capabilities. It then explains how to
trace the execution of a procedure, how to set and remove breakpoints, and how
to add watch variables and modify their value.
To let you follow and control the debugging process, Procedure Editor displays an
instruction pointer on the line of code that is about to be executed—that is, the
line that will be executed next if you either proceed with the debugging process or
run your procedure. When the instruction pointer is on a line of code, the text on
that line appears in black on a gray background that spans the width of the entire
line.
Here's how to trace the execution of your procedure with either the single step or
procedure step method.
Note: Before Procedure Editor executes your procedure using either of these
methods, the procedure will first be compiled, if necessary. Therefore, there may be
a slight pause before execution actually begins. If your procedure contains any
compile errors, it will not be executed. To debug your procedure, first correct any
compile errors, then initiate execution again.
-Or-
Procedure Editor places the instruction pointer on the sub main line of
your procedure.
2. To continue tracing the execution of your procedure line by line, repeat step
1.
Each time you repeat step 1, Procedure Editor executes the line at the
instruction pointer and moves the instruction pointer to the next line to be
executed.
3. When you finish tracing the steps of interest in your procedure, either click
the Start tool on the toolbar or press F5 to run the balance of the procedure,
or click the End tool to halt execution of the procedure.
When you are stepping through a subroutine, you may need to determine the
procedure calls by which you arrived at a certain point in your procedure. Here's
how to use the Calls dialog box to obtain this information.
Procedure Editor displays the Calls dialog box, which lists the procedure
calls made by your procedure in the course of arriving at the present
subroutine.
2. From the Calls dialog box, select the name of the procedure you wish to
view
3. Click Show.
When you are stepping through a subroutine, you may want to repeat or skip
execution of a section of code. Here's how to use the Set Next Statement command
to move the instruction pointer to another line within that subroutine.
You can only use the Set Next Statement command to move the instruction pointer
within the same subroutine. If you place the insertion point on a line that is not in
the same subroutine, the Set Next Statement command is disabled.
1. Place the insertion point in the line where you want to resume stepping
through the procedure.
2. From the Debug menu, choose the Set Next Statement command.
The instruction pointer moves to the line you selected, and you can resume
stepping through your procedure from there.
If you want to start the debugging process at the first line of your procedure and
then step through your code line by line until you reach the end of the code that
you need to debug, the method described in the preceding section works fine. But
if you only need to debug one or more portions of a long procedure, that method
can be cumbersome.
Setting Breakpoints
You can set breakpoints to begin the debugging process partway through your
procedure, to continue debugging at a line outside the current subroutine, and to
debug only selected portions of your procedure.
Valid breakpoints can only be set on lines in your procedure that contain code,
including lines in functions and subroutines. Although you can set a breakpoint
anywhere within a procedure prior to execution, when you compile and run the
procedure, invalid breakpoints (that is, breakpoints on lines that don't contain
code) are automatically removed. While you are debugging your procedure,
Procedure Editor will beep if you try to set a breakpoint on a line that does not
contain code.
If you only need to debug parts of your procedure, here's how to facilitate the task
by using breakpoints.
1. Place a breakpoint at the start of each portion of your procedure that you
want to debug.
2. To run the procedure, click the Start tool on the toolbar or press F5.
The procedure executes until it reaches the line containing the first
breakpoint and then pauses with the instruction pointer on that line.
4. To resume running your procedure, click the Start tool on the toolbar or press
F5.
The procedure executes until it reaches the line containing the second
breakpoint and then pauses with the instruction pointer on that line.
5. Repeat steps 3 and 4 until you have finished debugging the selected
portions of your procedure.
Here's how to begin the debugging process at a selected point in your procedure.
1. Place the insertion point in the line where you want to start debugging.
2. To set a breakpoint on that line, click the Toggle Breakpoint tool on the
toolbar.
-Or-
Press F9.
The line on which you set the breakpoint now appears in contrasting type.
-Or-
Press F5.
Procedure Editor executes your procedure from the beginning and pauses
prior to executing the line containing the breakpoint. It places the
instruction pointer on that line to designate it as the line that will be
executed next.
If you want to continue debugging at a line that isn't within the same subroutine,
use the procedure in the next section to move the pointer.
Here’s how to continue debugging starting with code outside the current
subroutine.
1. Place the insertion point in the line where you want to continue debugging.
3. To run your procedure, click the Start tool on the toolbar or press F5.
The procedure executes until it reaches the line containing the breakpoint
and then pauses with the instruction pointer on that line. You can now
resume stepping through your procedure from that point.
Removing Breakpoints
Breakpoints can be removed either manually or automatically.
1. Place the insertion point on the line containing the breakpoint that you want
to remove.
-Or-
Press F9.
1. Select the Clear All Breakpoints command from the Debug menu.
As you debug your procedure, you can use Procedure Editor's watch pane to
monitor the variables on the watch variable list. Each time you enter break mode,
the values of the watch variables are updated. For each watch variable, Procedure
Editor displays the name of the variable, where it is defined, its value (if the
variable is not in scope, its value is shown as <not in context>), and other key
information such as its type and length (if it is a string).
You can only watch variables defined with fundamental data types, such as
Integer, Long, Variant, and so on; you cannot watch complex variables such as
structures or arrays. However, you can watch individual elements of arrays or
structure members using the following syntax.
[variable [(index,...)] [.member [(index,...)]]...]
where variable is the name of the structure or array variable, index is a literal
number, and member is the name of a structure member.
company(10,23).person. Member age of structure person that is at element 10,23 within the array of
age structures called company
-Or-
Press Shift+F9.
2. Use the controls in the Context box to specify where the variable is defined
(locally, publicly, or privately) and, if it is defined locally, in which routine it is
defined.
Note: If you are executing the procedure, use the drop-down Variable
Name list to display the names of all the variables that are "in scope," or
defined within the current function or subroutine, and select the variable
you want from that list.
If this is the first variable you are placing on the watch variable list, the
watch pane opens far enough to display that variable. If the watch pane
was already open, it expands far enough to display the variable you just
added.
Note: Although you can add as many watch variables to the list as you want, the
watch pane only expands until it fills half of Procedure Editor's application
window. If your list of watch variables is longer than that, use the watch pane's
scroll bars to view hidden portions of the list.
In order to delete a variable from Procedure Editor's watch variable list or modify
the value of a variable on the list, you must first select the desired variable. Here's
how to select a variable on the list.
a. Place the mouse pointer on the variable you want to select and click
the left mouse button.
-Or-
b. If one of the variables on the watch list is already selected, use the
arrow keys to move the selection highlight to a different variable.
-Or-
c. If the insertion point is in the edit pane, press F6 to highlight the most
recently selected variable on the watch list and then use the arrow keys
to move the selection highlight to a different variable.
2. To return the insertion point to its previous position in the edit pane, press F6
again.
Here's how to delete a selected variable from Procedure Editor's watch variable
list.
2. Press Del.
When the debugger has control, you can modify the value of any of the variables
on Procedure Editor's watch variable list.
When you change the value of a variable, Procedure Editor converts the new
value to be of the same type as the variable being changed. For example, if you
change the value of an Integer variable to 1.7, Procedure Editor converts the
floating-point number to an Integer and assigns the value 2 to the variable.
When you modify a Variant variable, Procedure Editor needs to determine both
the type and value of the data. Procedure Editor uses the following logic to
perform this assignment (in this order):
number The variable is assigned the value of number. The type of the variant is the
smallest data type that fully represents that number.
You can force the data type of the variable using a type-declarator letter
following number, such as %, #, &, !, or @.
date The variable is assigned the value of the new date (VarType 7)
Procedure Editor will not assign a new value if it cannot be converted to the same
type as the specified variable.
a. Place the mouse pointer on the name of the variable whose value you
want to modify and double-click the left mouse button.
-Or-
b. Select the name of the variable whose value you want to modify and
press Enter or F2.
Note: The name of the variable you selected appears in the Name field. If you
want to change a different variable, you can either enter the variable name in the
Name field or select the variable from the Variables list box, which shows the
names of all variables that are defined within the current function or subroutine.
When you use the Modify Variable dialog box to change the value of a variable,
you don't have to specify the context. Procedure Editor first searches locally for
the definition of that variable, then privately, then publicly.
2. Enter the new value for your variable in the Value field.
3. Click OK.
The new value of your variable appears on the watch variable list.
What happens when you exit from Procedure Editor depends on (1) whether you
have made changes to your procedure and (2) whether your procedure contains
errors.
If you have made changes to your procedure, Procedure Editor displays a dialog
box asking whether you want to save the procedure. If you either click the No
button or click the Yes button and your procedure contains no errors, you exit from
Procedure Editor immediately. If you click the Yes button and your procedure
contains errors, Procedure Editor highlights the line containing the first error and
displays a dialog box asking whether you want to exit anyway. If you click the Yes
button, Procedure Editor saves your procedure, errors and all, and then you exit
from Procedure Editor.
If you haven't made any changes to your procedure, you exit from Procedure
Editor immediately, regardless of whether the procedure contains errors from a
previous editing session.
To exit from Procedure Editor, choose the Exit and Return command from the File
menu.
Menu Reference
File Menu
Table 2-8 File menu commands
Exit and Return Esc Compiles your procedure and returns you to the
host application.
Edit Menu
Table 2-9 Edit menu commands
Find... Ctrl+F Displays the Find dialog box, which allows you
to specify text for which you want to search.
Goto Line... F4 Displays the Goto Line dialog box, which allows
you to move the insertion point to the start of a
specified line in your procedure.
Run Menu
Table 2-10 Run menu commands
Debug Menu
Table 2-11 Debug menu commands
Add Watch... Shift+F9 Displays the Add Watch dialog box, in which
you can enter the name of a Docbasic variable.
That variable, together with its value (if any), is
then displayed in the watch pane of Procedure
Editor's application window.
Clear All Breakpoints Removes all breakpoints previously set with the
Toggle Breakpoint command.
Help Menu
Table 2-12 Help menu commands
Search for Help on... Displays the Search dialog box, which allows
you to search for Help topics containing specific
keywords.
Notation Description
variable Items that are to be replaced with information that you supply appear
in italics. The type of replacement is indicated in the following
description.
[parameter] Square brackets indicate that the enclosed items are optional.
In Docbasic, you cannot end a statement with a comma, even if the
parameters are optional:
MsgBox "Hello",,"Message" 'OK
MsgBox "Hello",, 'Not valid
{Input | Binary} Braces indicate that you must choose one of the enclosed items, which
are separated by a vertical bar.
... Ellipses indicate that the preceeding expression can be repeated any
number of times.
& (operator)
Syntax
expression1 & expression2
Description
If both expressions are strings, then the type of the result is String. Otherwise, the
type of the result is a String variant.
In many instances, the plus (+) operator can be used in place of &. The difference
is that + attempts addition when used with at least one numeric expression,
whereas & always concatenates.
Example
This example assigns a concatenated string to variable s$ and a string to s2$, then
concatenates the two variables.
Sub Main()
s$ = "This string" & " is concatenated"
s2$ = " with the & operator."
End Sub
Platform(s)
All.
See Also
+ (operator)
Operator Precedence (topic)
' (keyword)
Causes the compiler to skip all characters between this character and the end of the
current line.
Syntax
'text
Description
This is very useful for commenting your code to make it more readable.
Example
Sub Main()
'This whole line is treated as a comment.
i$ = "Strings"'This is a valid assignment with a comment.
This line will cause an error (the apostrophe is missing).
End Sub
Platform(s)
All.
See Also
Rem (statement)
Comments (topic)
() (keyword)
Syntax 1
...(expression)...
Syntax 2
...,(parameter),...Description
Description
Use of parentheses can make your code easier to read, removing any ambiguity in
complicated expressions.
The above statement actually calls a subroutine called ShowForm, passing it the
variable i by value. It may be clearer to use the ByVal keyword in this case, which
accomplishes the same thing:
ShowForm ByVal i
Example
This example uses parentheses to clarify an expression.
Sub Main()
bill = False
dave = True
jim = True
Platform(s)
All.
See Also
ByVal (keyword)
Operator Precedence (topic)
* (operator)
Syntax
expression1 * expression2
Description
The result is the same type as the most precise expression, with the following
exceptions:
When the * operator is used with variants, the following additional rules apply:
Empty is treated as 0.
If the type of the result is an Integer variant that overflows, then the result is
automatically promoted to a Long variant.
If the type of the result is a Single, Long, or Date variant that overflows, then
the result is automatically promoted to a Double variant.
If expression1 is Null and expression2 is Boolean, then the result is Empty.
Otherwise, If either expression is Null, then the result is Null.
Example
This example assigns values to two variables and their product to a third variable.
Sub Main()
s# = 123.55
t# = 2.55
u# = s# * t#
End Sub
Platform(s)
All.
See Also
Operator Precedence (topic)
+ (operator)
Syntax
expression1 + expression2
Description
Addition operates differently depending on the type of the two expressions:
If one expression is and the other then the type of the result is
expression is
Empty variant Any data type Return the non-Empty operand unchanged
When using + to concatenate two variants, the result depends on the types of each
variant at runtime. You can remove any ambiguity by using the & operator.
Numeric Add
A numeric add is performed when both expressions are numeric (i.e., not variant
or string). The result is the same type as the most precise expression, with the
exceptions shown in Table 3-4
Variant Add
If both expressions are variants, or one expression is numeric and the other
expression is Variant, then a variant add is performed. The rules for variant add are
the same as those for normal numeric add, with the following exceptions:
If the type of the result is an Integer variant that overflows, then the result is
a Long variant.
If the type of the result is a Long, Single, or Date variant that overflows, then
the result is a Double variant.
Example
This example assigns string and numeric variable values and then uses the +
operator to concatenate the strings and form the sums of numeric variables.
Sub Main()
i$ = "Concatenation" + " is fun!"
j% = 120 + 5 'Addition of numeric literals
k# = j% + 2.7 'Addition of numeric variable
MsgBox "This concatenation becomes: '" i$ + Str(j%) + Str(k#) & "'"
End Sub
Platform(s)
All.
See Also
& (operator)
Operator Precedence (topic)
- (operator)
Returns the difference between expression1 and expression2 or, in the second syntax,
returns the negation of expression.
Syntax 1
expression1 - expression2
Syntax 2
-expression
Description
Syntax 1
The type of the result is the same as that of the most precise expression, with the
following exceptions:
When either or both expressions are Variant, then the following additional rules
apply:
If expression1 is Null and expression2 is Boolean, then the result is Empty.
Otherwise, if either expression is Null, then the result is Null.
Empty is treated as an Integer of value 0.
If the type of the result is an Integer variant that overflows, then the result is
a Long variant.
If the type of the result is a Long, Single, or Date variant that overflows, then
the result is a Double variant.
Syntax 2
If expression is numeric, then the type of the result is the same type as expression,
with the following exception:
If expression is Boolean, then the result is Integer.
Note: In 2's compliment arithmetic, unary minus may result in an overflow with
Integer and Long variables when the value of expression is the largest negative
number representable for that data type. For example, the following generates an
overflow error:
Sub Main()
Dim a As Integer
a = -32768
a = -a 'Generates overflow here.
End Sub
When negating variants, overflow will never occur because the result will be
automatically promoted: integers to longs and longs to doubles.
Example
This example assigns values to two numeric variables and their difference to a
third variable, then displays the result.
Sub Main()
i% = 100
j# = 22.55
k# = i% - j#
MsgBox "The difference is: " & k#
End Sub
Platform(s)
All.
See Also
Operator Precedence (topic)
. (keyword)
Syntax 1
object.property
Syntax 2
structure.member
Examples
This example uses the period to separate an object from a property.
Sub Main()
MsgBox Clipboard.GetText()
End Sub
Sub Main()
Dim r As Rect
r.left = 10
r.right = 12
End Sub
Platform(s)
All.
See Also
Objects (topic)
/ (operator)
Syntax
expression1 / expression2
Description
The type of the result is Double, with the following exceptions:
When either or both expressions is Variant, then the following additional rules
apply:
If expression1 is Null and expression2 is Boolean, then the result is Empty.
Otherwise, if either expression is Null, then the result is Null.
Empty is treated as an Integer of value 0.
If both expressions are either Integer or Single variants and the result
overflows, then the result is automatically promoted to a Double variant.
Example
This example assigns values to two variables and their quotient to a third variable,
then displays the result.
Sub Main()
i% = 100
j# = 22.55
k# = i% / j#
MsgBox "The quotient of i/j is: " & k#
End Sub
Platform(s)
All.
See Also
\ (operator)
Operator Precedence (topic)
< (operator)
<= (operator)
<> (operator)
= (operator)
> (operator)
>= (operator)
= (statement)
Syntax
variable = expression
Description
When assigning expressions to variables, internal type conversions are performed
automatically between any two numeric quantities. Thus, you can freely assign
numeric quantities without regard to type conversions. However, it is possible for
an overflow error to occur when converting from larger to smaller types. This
occurs when the larger type contains a numeric quantity that cannot be
represented by the smaller type. For example, the following code will produce a
runtime error:
Dim amount As Long
Dim quantity As Integer
The assignment operator (=) cannot be used to assign objects. Use the Set statement
instead.
Example
Sub Main()
a$ = "This is a string"
b% = 100
c# = 1213.3443
MsgBox a$ & "," & b% & "," & c#
End Sub
Platform(s)
All.
See Also
Let (statement)
Operator Precedence (topic)
Set (statement)
Expression Evaluation (topic)
\ (operator)
Syntax
expression1 \ expression2
Description
Before the integer division is performed, each expression is converted to the data
type of the most precise expression. If the type of the expressions is either Single,
Double, Date, or Currency, then each is rounded to Long.
Example
This example assigns the quotient of two literals to a variable and displays the
result.
Sub Main()
s% = 100.99 \ 2.6
MsgBox "Integer division of 100.99\2.6 is: " & s%
End Sub
Platform(s)
All.
See Also
/ (operator)
Operator Precedence (topic)
^ (operator)
Syntax
expression1 ^ expression2
Description
The following are special cases:
n^0 1
0^-n undefined
0^+n 0
1^n 1
The type of the result is always Double, except with Boolean expressions, in which
case the result is Boolean. Fractional and negative exponents are allowed. If either
expression is a Variant containing Null, then the result is Null.
Example
Sub Main()
s# = 2 ^ 5 'Returns 2 to the 5th power.
r# = 16 ^ .5'Returns the square root of 16.
MsgBox "2 to the 5th power is: " & s#
MsgBox "The square root of 16 is: " & r#
End Sub
Platform(s)
All.
See Also
Operator Precedence (topic)
_ (keyword)
Syntax
s$ = "This is a very long line that I want to split " + _
"onto two lines"
Description
The line-continuation character cannot be used within strings and must be
preceded by white space (either a space or a tab).
Example
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
'The line-continuation operator is useful when concatenating
'long strings.
'It is also useful for separating and continuing long calculation lines.
b# = .124
a# = .223
s# = ( (((Sin(b#) ^ 2) + (Cos(a#) ^ 2)) ^ .5) / _
(((Sin(a#) ^ 2) + (Cos(b#) ^ 2)) ^ .5) ) * 2.00
MsgBox msg & crlf & "The value of s# is: " & s#
End Sub
Platform(s)
All.
Abs (function)
Syntax
Abs(expression)
Description
If expression is Null, then Null is returned. Empty is treated as 0.
The type of the result is the same as that of expression, with the following
exceptions:
If expression is an Integer that overflows its legal range, then the result is
returned as a Long. This only occurs with the largest negative Integer:
Dim a As Variant
Dim i As Integer
i = -32768
a = Abs(i) 'Result is a Long.
i = Abs(i) 'Overflow!
If expression is a Long that overflows its legal range, then the result is
returned as a Double. This only occurs with the largest negative Long:
Dim a As Variant
Dim l As Long
l = -2147483648
a = Abs(l) 'Result is a Double.
l = Abs(l) 'Overflow!
Example
This example assigns absolute values to variables of four types and displays the
result.
Sub Main()
s1% = Abs(- 10.55)
s2& = Abs(- 10.55)
s3! = Abs(- 10.55)
s4# = Abs(- 10.55)
MsgBox "The absolute values are: " & s1% & "," & s2& & "," & s3! & "," & s4#
End Sub
Platform(s)
All.
See Also
Sgn (function)
And (operator)
Syntax
expression1 And expression2
Description
If both expressions are either Boolean, Boolean variants, or Null variants, then a
logical conjunction is performed as follows:
Table 3-8 Effects of Boolean and Null Expressions on the And Operator
Binary Conjunction
1 And 1 = 1
0 And 1 = 0
1 And 0 = 0
0 And 0 = 0
Example
Sub Main()
n1 = 1001
n2 = 1000
b1 = True
b2 = False
'This example performs a numeric bitwise And operation and stores the
'result in N3.
n3 = n1 And n2
'This example performs a logical And comparing B1 and B2 and displays the
'result.
If b1 And b2 Then
MsgBox "b1 and b2 are True; n3 is: " & n3
Else
MsgBox "b1 and b2 are False; n3 is: " & n3
End If
End Sub
Platform(s)
All.
See Also
Operator Precedence (topic)
Or (operator)
Xor (operator)
Eqv (operator)
Imp (operator)
Description
Used with the Declare statement to indicate that type checking is not to be
performed with a given argument.
Example
Given the following declaration:
Declare Sub Foo Lib "FOO.DLL" (a As Any)
Platform(s)
All.
See Also
Declare (statement)
ArrayDims (function)
Syntax
ArrayDims(arrayvariable)
Description
This function can be used to determine whether a given array contains any
elements or if the array is initially created with no dimensions and then
redimensioned by another function, such as the FileList function, as shown in the
following example.
Example
This example allocates an empty (null-dimensioned) array; fills the array with a list
of filenames, which resizes the array; then tests the array dimension and displays
an appropriate message.
Sub Main()
Dim f$()
FileList f$,"c:\*.bat"
If ArrayDims(f$) = 0 Then
MsgBox "The array is empty."
Else
MsgBox "The array size is: " & (UBound(f$) - UBound(f$) + 1)
End If
End Sub
Platform(s)
All.
See Also
LBound (function)
UBound (function)
Arrays (topic)
Arrays (topic)
For example:
Dim a(10) As Integer
Public LastNames(1 to 5,-2 to 7) As Variant
Private
Arrays of any data type can be created, including Integer, Long, Single, Double,
Boolean, Date, Variant, Object, user-defined structures, and data objects.
The lower and upper bounds of each array dimension must be within the
following range:
-32768 <= bound <= 32767
Fixed Arrays
The dimensions of fixed arrays cannot be adjusted at execution time. Once
declared, a fixed array will always require the same amount of storage. Fixed
arrays can be declared with the Dim, Private, or Public statement by supplying
explicit dimensions. The following example declares a fixed array of ten strings:
Dim a(10) As String
Fixed arrays can be used as members of user-defined data types. The following
example shows a structure containing fixed-length arrays:
Type Foo
rect(4) As Integer
colors(10) As Integer
End Type
Dynamic Arrays
Dynamic arrays are declared without explicit dimensions, as shown below:
Dynamic arrays can be resized at execution time using the Redim statement:
Redim Ages$(100)
Passing Arrays
Arrays are always passed by reference.
Querying Arrays
The following table describes the functions used to retrieve information about
arrays.
Operations on Arrays
The following table describes the function that operate on arrays:
ReadInSection Fill an array with the item names from a section in an INI file.
ArraySort (statement)
Syntax
ArraySort array()
Description
If a string array is specified, then the routine sorts alphabetically in ascending
order using case-sensitive string comparisons. If a numeric array is specified, the
ArraySort statement sorts smaller numbers to the lowest array index locations.
Docbasic generates a runtime error if you specify an array with more than one
dimension.
Example
This example dimensions an array and fills it with filenames using FileList, then
sorts the array and displays it in a select box.
Sub Main()
Dim f$()
FileList f$,"c:\*.*"
ArraySort f$
End Sub
Platform(s)
All.
See Also
ArrayDims (function)
LBound (function)
UBound (function)
Asc (function)
Returns an Integer containing the numeric code for the first character of text$.
Syntax
Asc(text$)
Description
The return value is an integer between 0 and 255.
Example
This example fills an array with the ASCII values of the strings components and
displays the result.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
s$ = InputBox("Please enter a string.","Enter String")
If s$ = "" Then End'Exit if no string entered.
For i = 1 To Len(s$)
msg = msg & Asc(Mid$(s$,i,1)) & crlf
Next i
MsgBox "The Asc values of the string are:" & msg
End Sub
Platform(s)
All.
See Also
Chr, Chr$ (functions)
Atn (function)
Syntax
Atn(number)
Description
Some helpful conversions:
Pi (3.1415926536) radians = 180 degrees.
1 radian = 57.2957795131 degrees.
1 degree = .0174532925 radians.
Example
This example finds the angle whose tangent is 1 (45 degrees) and displays the
result.
Sub Main()
a# = Atn(1.00)
MsgBox "1.00 is the tangent of " & a# & " radians (45 degrees)."
End Sub
Platform(s)
All.
See Also
Tan (function)
Sin (function)
Cos (function)
Basic.Capability (method)
Returns True if the specified capability exists on the current platform; returns False
otherwise.
Syntax
Basic.Capability(which)
Description
The which parameter is an Integer specifying the capability for which to test. It can
be any of the following values:
1 Disk drives
Example
This example tests to see whether your current platform supports disk drives and
hidden file attributes and displays the result.
Sub Main()
msg = "This operating system "
If Basic.Capability(1) Then
msg = msg & "supports disk drives."
Else
msg = msg & "does not support disk drives."
End If
MsgBox msg
End Sub
Platform(s)
All.
See Also
Cross-Platform Procedures (topic)
Basic.OS (property)
Basic.Eoln$ (property)
Syntax
Basic.Eoln$
Description
This string will be either a carriage return, a carriage return/line feed, or a line
feed.
Example
This example writes two lines of text in a message box.
Sub Main()
MsgBox "This is the first line of text." & Basic.Eoln$ & "This is the
second line of text."
End Sub
Platform(s)
All.
See Also
Cross-Platform Procedures (topic)
Basic.PathSeparator$ (property)
Basic.FreeMemory (property)
Returns a Long representing the number of bytes of free memory in Docbasic's data
space.
Syntax
Basic.FreeMemory
Description
This function returns the size of the largest free block in Docbasic's data space.
Before this number is returned, the data space is compacted, consolidating free
space into a single contiguous free block.
Example
This example displays free memory in a dialog box.
Sub Main()
MsgBox "The largest free memory block is: " & Basic.FreeMemory
End Sub
Platform(s)
All.
See Also
Basic.FreeMemory (property)
Basic.HomeDir$ (property)
Syntax
Basic.HomeDir$
Description
This method is used to find the directory in which the Docbasic files are located.
Example
This example assigns the home directory to HD and displays it.
Sub Main()
hd$ = Basic.HomeDir$
MsgBox "The Docbasic home directory is: " & hd$
End Sub
Platform(s)
All.
Basic.OS (property)
Syntax
Basic.OS
Description
Table 3-13 Values of the Basic.OS Property
4 ebSunOS SunOS
5 ebHPUX HP/UX
The value returned is not necessarily the platform under which Docbasic is
running but rather an indicator of the platform for which Docbasic was created.
For example, it is possible to run Docbasic for Windows under Windows NT
Workstation. In this case, Basic.OS will return 0.
Example
This example determines whether the currently-running operating system is
Windows or DOS and displays the appropriate message.
Sub Main()
Select Case Basic.OS
Case ebWin16
s = "Windows"
Case ebDOS16
s = "DOS"
Case Else
s = "not Windows or DOS"
End Select
MsgBox "You are currently running " & s
End Sub
Platform(s)
All.
See Also
Cross-Platform Procedures (topic)
Basic.PathSeparator$ (property)
Returns a String containing the path separator appropriate for the current
platform.
Syntax
Basic.PathSeparator$
Description
The returned string is any one of the following characters: / (slash), \ (back slash),
: (colon)
Example
Sub Main()
MsgBox "The path separator for this platform is: " & Basic.PathSeparator$
End Sub
Platform(s)
All.
See Also
Basic.Eoln$ (property)
Cross-Platform Procedures (topic)
Basic.Version$ (property)
Syntax
Basic.Version$
Description
This function returns the major and minor version numbers in the format
major.minor.BuildNumber, as in "2.00.30."
Example
This example displays the current version of Docbasic.
Sub Main()
MsgBox "Version " & Basic.Version$ & " of Docbasic is running"
End Sub
Platform(s)
All.
Beep (statement)
Syntax
Beep
Example
This example causes the system to beep five times and displays a reminder
message.
Sub Main()
For i = 1 To 5
Beep
Sleep(200)
Next i
MsgBox "You have an upcoming appointment!"
End Sub
Platform(s)
All.
A data type capable of representing the logical values True and False.
Syntax
Boolean
Description
Boolean variables are used to hold a binary value--either True or False. Variables
can be declared as Boolean using the Dim, Public, or Private statement.
Variants can hold Boolean values when assigned the results of comparisons or the
constants True or False.
Internally, a Boolean variable is a 2-byte value holding -1 (for True) or 0 (for False).
Any type of data can be assigned to Boolean variables. When assigning, non-0
values are converted to True, and 0 values are converted to False.
When used within binary or random files, 2 bytes of storage are required.
When passed to external routines, Boolean values are sign-extended to the size of
an integer on that platform (either 16 or 32 bits) before pushing onto the stack.
Boolean variables that have not yet been assigned are given an initial value of False.
Platform(s)
All.
See Also
Currency (data type)
Date (data type)
Double (data type)
Integer (data type)
Long (data type)
Object (data type)
ByRef (keyword)
Syntax
...,ByRef parameter,...
Description
Passing a parameter by reference means that the caller can modify that variable's
value.
Unlike the ByVal keyword, the ByRef keyword cannot be used when passing a
parameter. The absence of the ByVal keyword is sufficient to force a parameter to
be passed by reference:
MySub ByVal i Pass i by value.
MySub ByRef i Illegal (will not compile).
MySub i Pass i by reference.
Example
Sub Test(ByRef a As Variant)
a = 14
End Sub
Sub Main()
b = 12
Test b
MsgBox "The ByRef value is: " & b'Displays 14.
End Sub
Platform(s)
All.
See Also
() (keyword)
ByVal (keyword)
ByVal (keyword)
Syntax
...ByVal parameter...
Description
The ByVal keyword can appear before any parameter passed to any function,
statement, or method to force that parameter to be passed by value. Passing a
parameter by value means that the caller cannot modify that variable's value.
Enclosing a variable within parentheses has the same effect as the ByVal keyword:
Foo ByVal iForces i to be passed by value.
Foo(i)Forces i to be passed by value.
When calling external statements and functions (i.e., routines defined using the
Declare statement), the ByVal keyword forces the parameter to be passed by value
regardless of the declaration of that parameter in the Declare statement. The
following example shows the effect of the ByVal keyword used to passed an
Integer to an external routine:
Declare Sub Foo Lib "MyLib" (ByRef i As Integer)
i% = 6
Foo ByVal i% 'Pass a 2-byte Integer.
Foo i% 'Pass a 4-byte pointer to an Integer.
Since the Foo routine expects to receive a pointer to an Integer, the first call to Foo
will have unpredictable results.
Example
This example demonstrates the use of the ByVal keyword.
Sub Foo(a As Integer)
a = a + 1
End Sub
Sub Main()
Dim i As Integer
i = 10
Foo i
MsgBox "The ByVal value is: " & i'Displays 11 (Foo changed the value).
Foo ByVal i
MsgBox "The Byval value is still: " & i'Displays 11 (Foo did not change
the value).
End Sub
Platform(s)
All.
See Also
() (keyword)
ByRef (keyword)
Call (statement)
Syntax
Call subroutine_name [(arguments)]
Description
Using this statement is equivalent to:
subroutine_name [arguments]
Use of the Call statement is optional. The Call statement can only be used to
execute subroutines; functions cannot be executed with this statement. The
subroutine to which control is transferred by the Call statement must be declared
outside of the Main procedure, as shown in the following example.
Example
This example demonstrates the use of the Call statement to pass control to another
function.
Sub Example_Call(s$)
'This subroutine is declared externally to Main and displays the text
'passed in the parameter s$.
MsgBox "Call: " & s$
End Sub
Sub Main()
'This example assigns a string variable to display, then calls subroutine
'Example_Call, passing parameter S$ to be displayed in a message box
'within the subroutine.
s$ = "DAVE"
Example_Call s$
Call Example_Call("SUSAN")
End Sub
Platform(s)
All.
See Also
Goto (statement)
GoSub (statement)
Declare (statement)
CBool (function)
Syntax
CBool(expression)
Description
The expression parameter is any expression that can be converted to a Boolean. A
runtime error is generated if expression is Null.
All numeric data types are convertible to Boolean. If expression is zero, then the
CBool returns False; otherwise, CBool returns True. Empty is treated as False.
Example
This example uses CBool to determine whether a string is numeric or just plain
text.
Sub Main()
Dim IsNumericOrDate As Boolean
s$ = "34224.54"
IsNumericOrDate = CBool(IsNumeric(s$) Or IsDate(s$))
If IsNumericOrDate = True Then
MsgBox s$ & " is either a valid date or number!"
Else
MsgBox s$ & " is not a valid date or number!"
End If
End Sub
Platform(s)
All.
See Also
CCur (function)
CDate, CVDate (functions)
CDbl (function)
CInt (function)
CLng (function)
CSng (function)
CStr (function)
CVar (function)
CVErr (function)
Boolean (data type)
CCur (function)
Syntax
CCur(expression)
Description
This function accepts any expression convertible to a Currency, including strings.
A runtime error is generated if expression is Null or a String not convertible to a
number. Empty is treated as 0.
When passed a numeric expression, this function has the same effect as assigning
the numeric expression number to a Currency.
When used with variants, this function guarantees that the variant will be assigned
a Currency (VarType 6).
Example
This example displays the value of a String converted into a Currency value.
Sub Main()
i$ = "100.44"
MsgBox "The currency value is: " & CCur(i$)
End Sub
Platform(s)
All.
See Also
CBool (function)
CDate, CVDate (functions)
CDbl (function)
CInt (function)
CLng (function)
CSng (function)
CStr (function)
CVar (function)
CVErr (function)
Currency (data type)
Syntax
CDate(expression)
CVDate(expression)
Description
The expression parameter is any expression that can be converted to a Date. A
runtime error is generated if expression is Null.
These functions are sensitive to the date and time formats of your computer.
Example
This example takes two dates and computes the difference between them.
Sub Main()
Dim date1 As Date
Dim date2 As Date
Dim diff As Date
date1 = CDate(#1/1/1994#)
date2 = CDate("February 1, 1994")
diff = DateDiff("d",date1,date2)
MsgBox "The date difference is " & CInt(diff) & " days."
End Sub
Platform(s)
All.
See Also
CCur (function)
CBool (function)
CDbl (function)
CInt (function)
CLng (function)
CSng (function)
CStr (function)
CVar (function)
CVErr (function)
Date (data type)
CDbl (function)
Syntax
CDbl(expression)
Description
This function accepts any expression convertible to a Double, including strings. A
runtime error is generated if expression is Null. Empty is treated as 0.0.
When passed a numeric expression, this function has the same effect as assigning
the numeric expression number to a Double.
When used with variants, this function guarantees that the variant will be assigned
a Double (VarType 5).
Example
This example displays the result of two numbers as a Double.
Sub Main()
i% = 100
j! = 123.44
MsgBox "The double value is: " & CDbl(i% * j!)
End Sub
Platform(s)
All.
See Also
CCur (function)
CBool (function)
CDate, CVDate (functions)
CInt (function)
CLng (function)
CSng (function)
CStr (function)
CVar (function)
CVErr (function)
Double (data type)
ChDir (statement)
Changes the current directory of the specified drive to newdir$. This routine will
not change the current drive. (See ChDrive (statement).)
Syntax
ChDir newdir$
Example
This example saves the current directory, then changes to the root directory,
displays the old and new directories, restores the old directory, and displays it.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
save$ = CurDir$
ChDir (Basic.PathSeparator$)
MsgBox "Old: " & save$ & crlf & "New: " & CurDir$
ChDir (save$)
MsgBox "Directory restored to: " & CurDir$
End Sub
Platform(s)
All.
The Macintosh uses the colon (":") as the path separator. A double colon ("::")
specifies the parent directory.
See Also
ChDrive (statement)
CurDir, CurDir$ (functions)
Dir, Dir$ (functions)
MkDir (statement)
RmDir (statement)
ChDrive (statement)
Syntax
ChDrive DriveLetter$
Description
Only the first character of DriveLetter$ is used.
Example
This example saves the current directory in CD, then extracts the current drive
letter and saves it in Save$. If the current drive is D, then it is changed to C;
otherwise, it is changed to D. Then the saved drive is restored and displayed.
Const crlf$ = Chr$(13) + Chr$(10)
Sub Main()
cd$ = CurDir$
save$ = Mid$(CurDir$,1,1)
If save$ = "D" Then
ChDrive("C")
Else
ChDrive("D")
End If
MsgBox "Old: " & save$ & crlf & "New: " & CurDir$
ChDrive (save$)
MsgBox "Directory restored to: " & CurDir$
End Sub
Platform(s)
Windows, Win32.
See Also
ChDir (statement)
CurDir, CurDir$ (functions)
Dir, Dir$ (functions)
MkDir (statement)
RmDir (statement)
DiskDrives (statement)
Choose (function)
Syntax
Choose(index,expression1,expression2,...,expression13)
Description
The index parameter specifies which expression is to be returned. If index is 1, then
expression1 is returned; if index is 2, then expression2 is returned, and so on. If index
is less than 1 or greater than the number of supplied expressions, then Null is
returned.
The Choose function returns the expression without converting its type. Each
expression is evaluated before returning the selected one.
Example
This example assigns a variable of indeterminate type to a.
Sub Main()
Dim a As Variant
Dim c As Integer
c% = 2
a = Choose(c%,"Hello, world",#1/1/94#,5.5,False)
MsgBox "Item " & c% & " is '" & a & "'"'Displays the date passed as
parameter 2.
End Sub
Platform(s)
All.
See Also
Switch (function)
IIf (function)
If...Then...Else (statement)
Select...Case (statement)
Syntax
Chr[$](Code)
Description
Code must be an Integer between 0 and 255.
The Chr$ function can be used within constant declarations, as in the following
example:
Const crlf = Chr$(13) + Chr$(10)
Example
Sub Main()
'Concatenates carriage return (13) and line feed (10) to CRLF$,
'then displays a multiple-line message using CRLF$ to separate lines.
crlf$ = Chr$(13) + Chr$(10)
MsgBox "First line." & crlf$ & "Second line."
'Fills an array with the ASCII characters for ABC and displays their
'corresponding characters.
Dim a%(2)
For i = 0 To 2
a%(i) = (65 + i)
Next i
MsgBox "The first three elements of the array are: " & Chr$(a%(0)) &
Chr$(a%(1)) & Chr$(a%(2))
End Sub
Platform(s)
All.
See Also
Asc (function)
Str, Str$ (functions)
CInt (function)
Syntax
CInt(expression)
Description
This function accepts any expression convertible to an Integer, including strings. A
runtime error is generated if expression is Null. Empty is treated as 0.
The passed numeric expression must be within the valid range for integers:
-32768 <= expression <= 32767
A runtime error results if the passed expression is not within the above range.
When passed a numeric expression, this function has the same effect as assigning
a numeric expression to an Integer. Note that integer variables are rounded before
conversion.
When used with variants, this function guarantees that the expression is converted
to an Integer variant (VarType 2).
Example
This example demonstrates the various results of integer manipulation with CInt.
Sub Main()
'(4) Reassigns i# to 50.35 and recalculates k%, then displays the result
'(note rounding).
i# = 50.35
k% = CInt(i# + j#)
MsgBox "The integer sum of 50.35 and 100.22 is: " & k%
End Sub
Platform(s)
All.
See Also
CCur (function)
CBool (function)
CDate, CVDate (functions)
CDbl (function)
CLng (function)
CSng (function)
CStr (function)
CVar (function)
CVErr (function)
Integer (data type)
Clipboard$ (function)
Syntax
Clipboard$[()]
Description
If the Clipboard doesn't contain text or the Clipboard is empty, then a zero-length
string is returned.
Example
This example puts text on the Clipboard, displays it, clears the Clipboard, and
displays the Clipboard again.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Clipboard$ "Hello out there!"
MsgBox "The text in the Clipboard is:" & crlf & Clipboard$
Clipboard.Clear
MsgBox "The text in the Clipboard is:" & crlf & Clipboard$
End Sub
Platform(s)
Windows, Win32, Macintosh.
See Also
Clipboard$ (statement)
Clipboard.GetText (method)
Clipboard.SetText (method)
Clipboard$ (statement)
Syntax
Clipboard$ NewContent$
Description
This example puts text on the Clipboard, displays it, clears the Clipboard, and
displays the Clipboard again.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Clipboard$ "Hello out there!"
MsgBox "The text in the Clipboard is:" & crlf & Clipboard$
Clipboard.Clear
MsgBox "The text in the Clipboard is:" & crlf & Clipboard$
End Sub
Platform(s)
Windows, Win32, Macintosh.
See Also
Clipboard$ (function)
Clipboard.GetText (method)
Clipboard.SetText (method)
Clipboard.Clear (method)
Syntax
Clipboard.Clear
Example
This example puts text on the Clipboard, displays it, clears the Clipboard, and
displays the Clipboard again.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Clipboard$ "Hello out there!"
MsgBox "The text in the Clipboard is:" & crlf & Clipboard$
Clipboard.Clear
MsgBox "The text in the Clipboard is:" & crlf & Clipboard$
End Sub
Platform(s)
Windows, Win32, Macintosh.
Clipboard.GetFormat (method)
Returns True if data of the specified format is available in the Clipboard; returns
False otherwise.
Syntax
WhichFormat = Clipboard.GetFormat(format)
Description
This method is used to determine whether the data in the Clipboard is of a
particular format. The format parameter is an Integer representing the format to be
queried:
Format Description
1 Text
2 Bitmap
3 Metafile
9 Color palette
Example
This example puts text on the Clipboard, checks whether there is text on the
Clipboard, and if there is, displays it.
Sub Main()
Clipboard$ "Hello out there!"
If Clipboard.GetFormat(1) Then
MsgBox Clipboard$
Else
MsgBox "There is no text in the Clipboard."
End If
End Sub
Platform(s)
Windows, Win32, Macintosh.
See Also
Clipboard$ (function)
Clipboard$ (statement)
Clipboard.GetText (method)
Syntax
text$ = Clipboard.GetText([format])
Description
The format parameter, if specified, must be 1.
Example
This example retrieves the text from the Clipboard and checks to make sure that it
contains the word "dog."
Option Compare Text
Sub Main()
If Clipboard.GetFormat(1) Then
If Instr(Clipboard.GetText(1),"dog",1) = 0 Then
MsgBox "The Clipboard doesn't contain the word ""dog."""
Else
MsgBox "The Clipboard contains the word ""dog""."
End If
Else
MsgBox "The Clipboard does not contain text."
End If
End Sub
Platform(s)
Windows, Win32, Macintosh.
See Also
Clipboard$ (statement)
Clipboard$ (function)
Clipboard.SetText (method)
Clipboard.SetText (method)
Syntax
Clipboard.SetText data$ [,format]
Description
The data$ parameter specifies the text to be copied to the Clipboard. The format
parameter, if specified, must be 1.
Example
This example gets the contents of the Clipboard and uppercases it.
Sub Main()
If Not Clipboard.GetFormat(1) Then Exit Sub
Clipboard.SetText UCase$(Clipboard.GetText(1)),1
End Sub
Platform(s)
Windows, Win32, Macintosh.
See Also
Clipboard$ (statement)
Clipboard.GetText (method)
Clipboard$ (function)
CLng (function)
Syntax
CLng(expression)
Description
This function accepts any expression convertible to a Long, including strings. A
runtime error is generated if expression is Null. Empty is treated as 0.
A runtime error results if the passed expression is not within the above range.
When passed a numeric expression, this function has the same effect as assigning
the numeric expression to a Long. Note that long variables are rounded before
conversion.
When used with variants, this function guarantees that the expression is converted
to a Long variant (VarType 3).
Example
This example displays the results for various conversions of i and j (note
rounding).
Sub Main()
i% = 100
j& = 123.666
MsgBox "The result is: " & CLng(i% * j&)'Displays 12367.
MsgBox "The variant type is: " & Vartype(CLng(i%))
End Sub
Platform(s)
All.
See Also
CCur (function)
CBool (function)
Close (statement)
Syntax
Close [[#] filenumber [,[#] filenumber]...]
Description
If no arguments are specified, then all files are closed.
Example
This example opens four files and closes them in various combinations.
Sub Main()
Open "test1" For Output As #1
Open "test2" For Output As #2
Open "test3" For Random As #3
Open "test4" For Binary As #4
MsgBox "The next available file number is :" & FreeFile()
Close #1 'Closes file 1 only.
Close #2, #3'Closes files 2 and 3.
Close 'Closes all remaining files(4).
MsgBox "The next available file number is :" & FreeFile()
End Sub
Platform(s)
All.
See Also
Open (statement)
Reset (statement)
End (statement)
Returns the argument from the command line used to start the application.
Syntax
Command[$][()]
Description
Command$ returns a string, whereas Command returns a String variant.
Example
This example gets the command line and parameters, checks to see whether the
string "/s" is present, and displays the result.
Sub Main()
cmd$ = Command$
If (InStr(cmd$,"/s")) <> 0 Then
MsgBox "Application was started with the /s switch."
Else
MsgBox "Application was started without the /s switch."
End If
Platform(s)
All.
See Also
Environ, Environ$ (functions)
Comments (topic)
All text between a single quotation mark and the end of the line is ignored:
MsgBox "Hello"'Displays a message box.
The REM statement causes the compiler to ignore the entire line:
REM This is a comment.
Syntax
expression1 [< | > | <= | >= | <> | =] expression2
Description
The comparison operators are listed in the following table :
String Comparisons
If the two expressions are strings, then the operator performs a text comparison
between the two string expressions, returning True if expression1 is less than
expression2. The text comparison is case-sensitive if Option Compare is Binary;
otherwise, the comparison is case-insensitive.
When comparing letters with regard to case, lowercase characters in a string sort
greater than uppercase characters, so a comparison of "a" and "A" would indicate
that "a" is greater than "A".
Numeric Comparisons
date1 = Now
date2 = date1 + 0.000001'Adds a fraction of a second.
Variant Comparisons
Example
Sub Main()
'Tests two literals and displays the result.
If 5 < 2 Then
MsgBox "5 is less than 2."
Else
MsgBox "5 is not less than 2."
End If
Platform(s)
All.
See Also
Operator Precedence (topic)
Is (operator)
Like (operator)
Option Compare (statement)
Const (statement)
Syntax
Const name [As type] = expression [,name [As type] = expression]...
Description
The name is only valid within the current Docbasic procedure. Constant names
must follow these rules:
Must begin with a letter.
May contain only letters, digits, and the underscore character.
Must not exceed 80 characters in length.
Cannot be a reserved word.
Constants can be given an explicit type by declaring the name with a type-
declaration character, as shown below:
Const a% = 5'Constant Integer whose value is 5
Const b# = 5'Constant Double whose value is 5.0
Const c$ = "5"'Constant String whose value is "5"
Const d! = 5'Constant Single whose value is 5.0
Const e& = 5'Constant Long whose value is 5
If an explicit type is not given, then Docbasic will choose the most imprecise type
that completely represents the data, as shown below:
Const a = 5 'Integer constant
Constants defined within a Sub or Function are local to that subroutine or function.
Constants defined outside of all subroutines and function can be used anywhere
within that procedure. The following example demonstrates the scoping of
constants:
Const DefFile = "default.txt"
Sub Test1
Const DefFile = "foobar.txt"
MsgBox DefFile 'Displays "foobar.txt".
End Sub
Sub Test2
MsgBox DefFile 'Displays "default.txt".
End Sub
Example
This example displays the declared constants in a dialog box (crlf produces a new
line in the dialog box).
Const crlf = Chr$(13) + Chr$(10)
Const s As String = "This is a constant."
Sub Main()
MsgBox s$ & crlf & "The constants are shown above."
End Sub
Platform(s)
All.
See Also
DefType (statement)
Let (statement)
= (statement)
Constants (topic)
Constants (topic)
Constants are variables that cannot change value during procedure execution. The
following constants are predefined by Docbasic:
PI ebRightButton ebLeftButton
ebObject ebDataObject
You can define your own constants using the Const statement.
Cos (function)
Syntax
Cos(angle)
Description
The angle parameter is a Double specifying an angle in radians.
Example
This example assigns the cosine of pi/4 radians (45 degrees) to C# and displays its
value.
Sub Main()
c# = Cos(3.14159 / 4)
MsgBox "The cosine of 45 degrees is: " & c#
End Sub
Platform(s)
All.
See Also
Tan (function)
Sin (function)
Atn (function)
CreateObject (function)
Syntax
CreateObject(class$)
Description
The class$ parameter specifies the application used to create the object and the type
of object being created. It uses the following syntax:
"application.class",
where application is the application used to create the object and class is the type of
the object to create.
At runtime, CreateObject looks for the given application and runs that application
if found. Once the object is created, its properties and methods can be accessed
using the dot syntax (e.g., object.property = value).
There may be a slight delay when an automation server is loaded (this depends on
the speed with which a server can be loaded from disk). This delay is reduced if an
instance of the automation server is already loaded.
Examples
This first example instantiates Microsoft Excel. It then uses the resulting object to
make Excel visible and then close Excel.
Sub Main()
Dim Excel As Object
Trap1:
MsgBox "Can't create Excel object."'Display error message.
Exit Sub 'Reset error handler.
End Sub
This second example uses CreateObject to instantiate a Visio object. It then uses the
resulting object to create a new document.
Sub Main()
Dim Visio As Object
Dim doc As Object
Dim page As Object
Dim shape As Object
Platform(s)
Windows, Win32, Macintosh
See Also
GetObject (function)
Object (data type)
This section discusses different techniques that can be used to ensure that a given
procedure runs on all platforms that support Docbasic.
Byte ordering becomes problematic if binary data is transferred from one platform
to another. This can only occur when writing data to files. For this reason, it is
Type OneLong
first As Long
End Type
Sub Main()
Dim l As OneLong
Dim i As TwoInts
l.First = 4
LSet i = l
MsgBox "First integer: " & i.first
MsgBox "Second integer: " & i.second
End Sub
On Intel-based platforms, bytes are stored in memory with the most significant
byte first (known as little-endian format). Thus, the above example displays two
dialog boxes, the first one displaying the number 4 and the second displaying the
number 0.
On UNIX and Macintosh platforms, bytes are stored in memory with the least
significant byte first (known as big-endian format). Thus, the above example
displays two dialog boxes, the first one displaying the number 0 and the second
displaying the number 4.
Procedures that rely on binary images of data must take the byte ordering of the
current platform into account.
Docbasic takes this into account when reading text files. The following
combinations are recognized and interpreted as end-of-line:
When writing to text files, Docbasic uses the end-of-line appropriate to that
platform. You can retrieve the same end-of-line used by Docbasic using the
Basic.Eoln$ property:
crlf = Basic.Eoln$
Alignment
A major difference between platforms supported by Docbasic is the forced
alignment of data. Docbasic handles most alignment issues itself.
If you trap a call to an unsupported function, the function will return one of the
following values:
Integer 0
Double 0.0
Single 0.0
Long 0
Boolean False
Variant Empty
Object Nothing
Path Separators
Different file systems use different characters to separate parts of a pathname. For
example, under Windows and Win32, the backslash character is used:
s$ = "c:\sheets\bob.xls"
On the Macintosh, the slashes are valid filename characters. Instead, Docbasic
recognizes the colon as the valid file separator character:
s$ = "sheets:bob.xls"
You can find out the path separator character for your platform using the
Basic.PathSeparator$ property:
s$ = "sheets" & Basic.PathSeparator$ & "bob.xls"
Relative Paths
Specifying relative paths is different across platforms. Under UNIX, Windows, and
Win32, a period (.) is used to specify the current directory, and two periods (..) are
used to indicate the parent directory, as shown below:
s$ = ".\bob.xls"'File in the current directory
s$ = "..\bob.xls"'File in the parent directory
On the Macintosh, double colons are used to specify the parent folder:
s$ = "::bob.xls"'File in the parent folder
Drive Letters
Not all platforms support drive letters. For example, considering the following file
specification:
c:\test.txt
Under UNIX, this specifies a single file called c:\test.txt. Under Windows, this
specifies a file called test.txt in the root directory of drive c. On the Macintosh, this
specifies a file called \test.txt in a folder called c. You can use the Basic.Capability
method to determine whether your platform supports drive letters:
Sub Main()
If Basic.Capability(1) Then s$ = "c:/" Else s$ = ""
s$ = s$ & "test.xls"
MsgBox "The platform-specific filename is: " & s$
End Sub
CSng (function)
Syntax
CSng(expression)
Description
This function accepts any expression convertible to a Single, including strings. A
runtime error is generated if expression is Null. Empty is treated as 0.0.
A runtime error results if the passed expression is not within the valid range for
Single.
When passed a numeric expression, this function has the same effect as assigning
the numeric expression to a Single.
When used with variants, this function guarantees that the expression is converted
to a Single variant (VarType 4).
Example
This example displays the value of a String converted to a Single.
Sub Main()
s$ = "100"
MsgBox "The single value is: " & CSng(s$)
End Sub
Platform(s)
All.
See Also
CCur (function)
CBool (function)
CDate, CVDate (functions)
CDbl (function)
CInt (function)
CLng (function)
CStr (function)
CVar (function)
CVErr (function)
Single (data type)
CStr (function)
Syntax
CStr(expression)
Description
Unlike Str$ or Str, the string returned by CStr will not contain a leading space if the
expression is positive. Further, the CStr function correctly recognizes thousands
and decimal separators for your locale.
Different data types are converted to String in accordance with the following rules:
Any numeric type A string containing the number without the leading space for
positive values.
Example
This example displays the value of a Double converted to a String.
Sub Main()
s# = 123.456
MsgBox "The string value is: " & CStr(s#)
End Sub
Platform(s)
All.
See Also
CCur (function)
CBool (function)
CDate, CVDate (functions)
CDbl (function)
CInt (function)
CLng (function)
CSng (function)
CVar (function)
CVErr (function)
String (data type)
Str, Str$ (functions)
Syntax
CurDir[$][(drive$)]
Description
CurDir$ returns a String, whereas CurDir returns a String variant.
Example
This example saves the current directory, changes to the next higher directory, and
displays the change; then restores the original directory and displays the change.
Note: The dot designators will not work with all platforms.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
save$ = CurDir$
ChDir ("..")
MsgBox "Old directory: " & save$ & crlf & "New directory: " & CurDir$
ChDir (save$)
MsgBox "Directory restored to: " & CurDir$
End Sub
Platform(s)
All.
See Also
ChDir (statement)
ChDrive (statement)
A data type used to declare variables capable of holding fixed-point numbers with
15 digits to the left of the decimal point and 4 digits to the right.
Syntax
Currency
Description
Currency variables are used to hold numbers within the following range:
-922,337,203,685,477.5808 <= currency <= 922,337,203,685,477.5807
Due to their accuracy, Currency variables are useful within calculations involving
money.
Storage
Internally, currency values are 8-byte integers scaled by 10000. Thus, when
appearing within a structure, currency values require 8 bytes of storage. When
used with binary or random files, 8 bytes of storage are required.
Platform(s)
All.
See Also
Date (data type)
Double (data type)
Integer (data type)
Long (data type)
Object (data type)
Single (data type)
String (data type)
Variant (data type)
Boolean (data type)
DefType (statement)
CCur (function)
CVar (function)
Syntax
CVar(expression)
Description
This function is used to convert an expression into a variant. Use of this function is
not necessary (except for code documentation purposes) because assignment to
variant variables automatically performs the necessary conversion:
Sub Main()
Dim v As Variant
v = 4 & "th"'Assigns "4th" to v.
MsgBox "You came in: " & v
v = CVar(4 & "th")'Assigns "4th" to v.
MsgBox "You came in: " & v
End Sub
Example
This example converts an expression into a Variant.
Sub Main()
Dim s As String
Dim a As Variant
s = CStr("The quick brown fox ")
msg = CVar(s & "jumped over the lazy dog.")
MsgBox msg
End Sub
Platform(s)
All.
See Also
CCur (function)
CBool (function)
CDate, CVDate (functions)
CDbl (function)
CInt (function)
CLng (function)
CSng (function)
CStr (function)
CVErr (function)
Variant (data type)
CVErr (function)
Syntax
CVErr(expression)
Description
This function is used to convert an expression into a user-defined error number.
If expression is Null.
If expression is a number outside the legal range for errors, which is as follows:
0 <= expression <= 65535
If expression is Boolean.
If expression is a String that can't be converted to a number within the legal range.
Empty is treated as 0.
Example
This example simulates a user-defined error and displays the error number.
Sub Main()
MsgBox "The error is: " & CStr(CVErr(2046))
End Sub
Platform(s)
All.
See Also
CCur (function)
CBool (function)
CDate, CVDate (functions)
CDbl (function)
CInt (function)
CLng (function)
CSng (function)
CStr (function)
CVar (function)
IsError (function)
Syntax
Date
Description
Date variables are used to hold dates within the following range:
January 1, 100 00:00:00 <= date <= December 31, 9999 23:59:59
Internally, dates are stored as 8-byte IEEE double values. The integer part holds the
number of days since December 31, 1899, and the fractional part holds the number
of seconds as a fraction of the day. For example, the number 32874.5 represents
January 1, 1990 at 12:00:00.
Date variables that haven't been assigned are given an initial value of 0 (i.e.,
December 31, 1899).
The interpretation of the date string (i.e., January 1, 1990 in the above example)
occurs at runtime, using the current country settings. This is a problem when
interpreting dates such as 1/2/1990. If the date format is M/D/Y, then this date is
January 2, 1990. If the date format is D/M/Y, then this date is February 1, 1990. To
remove any ambiguity when interpreting dates, use the universal date format:
date_variable = #YY/MM/DD HH:MM:SS#
The following example specifies the date June 3, 1965 using the universal date
format:
Dim d As Date
d = #1965/6/3 10:23:45#
Platform(s)
All.
See Also
Currency (data type)
Double (data type)
Integer (data type)
Long (data type)
Object (data type)
Single (data type)
String (data type)
Variant (data type)
Boolean (data type)
Deftype (statement)
CDate, CVDate (functions)
Syntax
Date[$][()]
Description
The Date$ function returns the date using the short date format. The Date function
returns the date as a Date variant.
Example
This example saves the current date to Cdate$, then changes the date and displays
the result. It then changes the date back to the saved date and displays the result.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
TheDate$ = Date$()
Date$ = "01/01/95"
MsgBox "Saved date is: " & TheDate$ & crlf & "Changed date is: " & Date$()
Date$ = TheDate$
MsgBox "Restored date to: " & TheDate$
End Sub
Platform(s)
All.
See Also
CDate, CVDate (functions)
Time, Time$ (functions)
Date, Date$ (statements)
Now (function)
Format, Format$ (functions)
DateSerial (function)
DateValue (function)
Syntax
Date[$] = newdate
Description
The Date$ statement requires a string variable using one of the following formats:
MM-DD-YYYY
MM-DD-YY
MM/DD/YYYY
MM/DD/YY,
The Date statement converts any expression to a date, including string and
numeric values. Unlike the Date$ statement, Date recognizes many different date
formats, including abbreviated and full month names and a variety of ordering
options. If newdate contains a time component, it is accepted, but the time is not
changed. An error occurs if newdate cannot be interpreted as a valid date.
Example
This example saves the current date to Cdate$, then changes the date and displays
the result. It then changes the date back to the saved date and displays the result.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
TheDate$ = Date$()
Date$ = "01/01/95"
MsgBox "Saved date is: " & TheDate$ & crlf & "Changed date is: " & Date$()
Date$ = TheDate$
MsgBox "Restored date to: " & TheDate$
End Sub
Platform(s)
All.
Platform Notes
On some platforms, you may not have permission to change the date, causing
runtime error 70 to be generated. This can occur on all UNIX platforms and Win32.
The range of valid dates varies from platform to platform. The following table
describes the minimum and maximum dates accepted by various platforms:
Win32
UNIX
See Also
Date, Date$ (functions)
Time, Time$ (statements)
DateAdd (function)
Returns a Date variant representing the sum of date and a specified number
(increment) of time intervals (interval$).
Syntax
DateAdd(interval$, increment&, date)
Argument Descriptions
Description
This function adds a specified number (increment) of time intervals (interval$) to the
specified date (date). The following table describes the parameters to the DateAdd
function:
The interval$ parameter specifies what unit of time is to be added to the given date.
It can be any of the following:
Time Interval
"yyyy" Year
"d" Day
"m" Month
"q" Quarter
"ww" Week
"h" Hour
Time Interval
"n" Minute
"s" Second
"w" Weekday
To add days to a date, you may use either day, day of the year, or weekday, as they
are all equivalent ("d", "y", "w").
The DateAdd function will never return an invalid date/time expression. The
following example adds two months to December 31, 1992:
s# = DateAdd("m", 2, "December 31, 1992")
Docbasic generates a runtime error if you try subtracting a time interval that is
larger than the time value of the date.
Example
This example gets today's date using the Date$ function; adds three years, two
months, one week, and two days to it; and then displays the result in a dialog box.
Sub Main()
Dim sdate$
sdate$ = Date$
NewDate# = DateAdd("yyyy", 4, sdate$)
NewDate# = DateAdd("m", 3, NewDate#)
NewDate# = DateAdd("ww", 2, NewDate#)
NewDate# = DateAdd("d", 1, NewDate#)
s$ = "Four years, three months, two weeks, and one day from now will be: "
s$ = s$ & Format(NewDate#, "long date")
MsgBox s$
End Sub
Platform(s)
All.
See Also
DateDiff (function)
DateDiff (function)
Returns a Date variant representing the number of given time intervals between
date1 and date2.
Syntax
DateDiff(interval$,date1,date2)
Argument Descriptions
Description
The following lists the valid time interval strings and the meanings of each. The
Format$ function uses the same expressions.
Time Interval
"yyyy" Year
"d" Day
"m" Month
"q" Quarter
"ww" Week
"h" Hour
"n" Minute
"s" Second
"w" Weekday
To find the number of days between two dates, you may use either day or day of
the year, as they are both equivalent ("d", "y").
The time interval weekday ("w") will return the number of weekdays occurring
between date1 and date2, counting the first occurrence but not the last. However, if
the time interval is week ("ww"), the function will return the number of calendar
weeks between date1 and date2, counting the number of Sundays. If date1 falls on a
Sunday, then that day is counted, but if date2 falls on a Sunday, it is not counted.
The DateDiff function will return a negative date/time value if date1 is a date later
in time than date2.
Example
This example gets today's date and adds ten days to it. It then calculates the
difference between the two dates in days and weeks and displays the result.
Sub Main()
today$ = Format(Date$,"Short Date")
NextWeek = Format(DateAdd("d", 14, today$),"Short Date")
DifDays# = DateDiff("d", today$, NextWeek)
DifWeek# = DateDiff("w", today$, NextWeek)
s$ = "The difference between " & today$ & " and " & NextWeek
s$ = s$ & " is: " & DifDays# & " days or " & DifWeek# & " weeks"
MsgBox s$
End Sub
Platform(s)
All.
See Also
DateAdd (function)
DatePart (function)
Syntax
DatePart(interval$,date)
Argument Descriptions
Description
The DatePart function decomposes the specified date and returns a given date/
time element.
The following table lists the valid time interval strings and the meanings of each.
The Format$ function uses the same expressions.
Time Interval
"yyyy" Year
"d" Day
"m" Month
"q" Quarter
"ww" Week
"h" Hour
"n" Minute
"s" Second
"w" Weekday
The weekday expression starts with Sunday as 1 and ends with Saturday as 7.
Example
This example displays the parts of the current date.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
today$ = Date$
qtr = DatePart("q",today$)
yr = DatePart("yyyy",today$)
mo = DatePart("m",today$)
wk = DatePart("ww",today$)
da = DatePart("d",today$)
s$ = "Quarter: " & qtr & crlf
s$ = s$ & "Year: " & yr & crlf
s$ = s$ & "Month: " & mo & crlf
s$ = s$ & "Week: " & wk & crlf
s$ = s$ & "Day: " & da & crlf
MsgBox s$
End Sub
Platform(s)
All.
See Also
Day (function)
Minute (function)
Second (function)
Month (function)
Year (function)
Hour (function)
Weekday (function)
Format (function)
DateSerial (function)
Syntax
DateSerial(year,month,day)
Argument Descriptions
Example
This example converts a date to a real number representing the serial date in days
since December 30, 1899 (which is day 0).
Sub Main()
tdate# = DateSerial(1993,08,22)
MsgBox "The DateSerial value for August 22, 1993, is: " & tdate#
End Sub
Platform(s)
All.
See Also
DateValue (function)
TimeSerial (function)
TimeValue (function)
CDate, CVDate (functions)
DateValue (function)
Returns a Date variant representing the date contained in the specified string
argument.
Syntax
DateValue(date_string$)
Example
This example returns the day of the month for today's date.
Sub Main()
tdate$ = Date$
tday = DateValue(tdate$)
MsgBox tdate & " date value is: " & tday$
End Sub
Platform(s)
All.
See Also
TimeSerial (function)
TimeValue (function)
DateSerial (function)
Day (function)
Syntax
Day(date)
Description
The value returned is an Integer between 0 and 31 inclusive.
Example
This example gets the current date and then displays it.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
CurDate = Now()
MsgBox "Today is day " & Day(CurDate) & " of the month." & crlf &
"Tomorrow is day " & Day(CurDate + 1)
End Sub
Platform(s)
All.
See Also
Minute (function)
Second (function)
Month (function)
Year (function)
Hour (function)
Weekday (function)
DatePart (function)
DDB (function)
Calculates the depreciation of an asset for a specified Period of time using the
double-declining balance method.
Syntax
DDB(Cost, Salvage, Life, Period)
Argument Descriptions
Description
The double-declining balance method calculates the depreciation of an asset at an
accelerated rate. The depreciation is at its highest in the first period and becomes
progressively lower in each additional period. DDB uses the following formula to
calculate the depreciation:
DDB =((Cost-Total_depreciation_from_all_other_periods) * 2)/Life
Life and Period must be expressed using the same units. For example, if Life is
expressed in months, then Period must also be expressed in months.
Example
This example calculates the depreciation for capital equipment that cost $10,000,
has a service life of ten years, and is worth 2,000 as scrap. The dialog box displays
the depreciation for each of the first four years.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
s$ = "Depreciation Table" & crlf & crlf
For yy = 1 To 4
CurDep# = DDB(10000.0,2000.0,10,yy)
s$ = s$ & "Year " & yy & " : " & CurDep# & crlf
Next yy
MsgBox s$
End Sub
Platform(s)
All.
See Also
Sln (function)
SYD (function)
DDEExecute (statement)
Syntax
DDEExecute channel, command$
Argument Descriptions
Description
If the receiving application does not execute the instructions, Docbasic generates a
runtime error.
Example
This example selects a cell in an Excel spreadsheet.
Sub Main()
q$ = Chr(34)
ch% = DDEInitiate("Excel","c:\sheets\test.xls")
cmd$ = "Select(" & q$ & "R1C1:R8C1" & q$ & ")"
DDEExecute ch%,cmd$
DDETerminate ch%
End Sub
Platform(s)
Windows, Win32.
See Also
DDEInitiate (function)
DDEPoke (statement)
DDERequest, DDERequest$ (functions)
DDESend (function)
DDETerminate (statement)
DDETerminateAll (statement)
DDETimeout (statement)
DDEInitiate (function)
Syntax
DDEInitiate(application$, topic$)
Argument Descriptions
Description
This function returns 0 if Docbasic cannot establish the link. This will occur under
any of the following circumstances:
The specified application is not running.
The topic was invalid for that application.
Memory or system resources are insufficient to establish the DDE link.
Example
This example selects a range of cells in an Excel spreadsheet.
Sub Main()
q$ = Chr(34)
ch% = DDEInitiate("Excel","c:\sheets\test.xls")
cmd$ = "Select(" & q$ & "R1C1:R8C1" & q$ & ")"
DDEExecute ch%,cmd$
DDETerminate ch%
End Sub
Platform(s)
Windows, Win32.
See Also
DDEExecute (statement)
DDEPoke (statement)
DDERequest, DDERequest$ (functions)
DDESend (function)
DDETerminate (statement)
DDETerminateAll (statement)
DDETimeout (statement)
DDEPoke (statement)
Sets the value of a data item in the receiving application associated with an open
DDE link.
Syntax
DDEPoke channel, DataItem, value
Argument Descriptions
value The new value for the data item. This parameter can be any
expression convertible to a String. The format depends on
the server. A runtime error is generated if value is Null.
Example
This example pokes a value into an Excel spreadsheet.
Sub Main()
ch% = DDEInitiate("Excel","c:\sheets\test.xls")
DDEPoke ch%,"R1C1","980"
DDETerminate ch%
End Sub
Platform(s)
Windows, Win32.
See Also
DDEExecute (statement)
DDEInitiate (function)
DDERequest, DDERequest$ (functions)
DDESend (function)
DDETerminate (statement)
DDETerminateAll (statement)
DDETimeout (statement)
Returns the value of the given data item in the receiving application associated
with the open DDE channel.
Syntax
DDERequest[$](channel,DataItem$)
Argument Descriptions
DataItem$ String containing the name of the data item to request. The
format for this parameter depends on the server.
Description
DDERequest$ returns a String, whereas DDERequest returns a String variant.
Example
This example gets a value from an Excel spreadsheet.
Sub Main()
ch% = DDEInitiate("Excel","c:\excel\test.xls")
s$ = DDERequest$(ch%,"R1C1")
DDETerminate ch%
MsgBox s$
End Sub
Platform(s)
Windows, Win32.
until the Docbasic system is terminated. Thus, the DDEML library is required only
if DDE statements are used within a procedure.
See Also
DDEExecute (statement)
DDEInitiate (function)
DDEPoke (statement)
DDESend (function)
DDETerminate (statement)
DDETerminateAll (statement)
DDETimeout (statement)
DDESend (statement)
Initiates a DDE conversation with the server as specified by application$ and topic$
and sends that server a new value for the specified item.
Syntax
DDESend application$, topic$, DataItem, value
Argument Descriptions
value New value for the data item. This parameter can be any
expression convertible to a String. The format depends on
the server. A runtime error is generated if value is Null.
Description
The DDESend statement performs the equivalent of the following statements:
ch% = DDEInitiate(application$, topic$)
DDEPoke ch%, item, data
DDETerminate ch%
Example
This code fragment sets the content of the first cell in an Excel spreadsheet.
Sub Main()
On Error Goto Trap1
DDESend "Excel","c:\excel\test.xls","R1C1","Hello, world."
On Error Goto 0
'Add more lines here.
Trap1:
MsgBox "Error sending data to Excel."
Exit Sub'Reset error handler.
End Sub
Platform(s)
Windows, Win32.
See Also
DDEExecute (statement)
DDEInitiate (function)
DDEPoke (statement)
DDERequest, DDERequest$ (functions)
DDETerminate (statement)
DDETerminateAll (statement)
DDETimeout (statement)
DDETerminate (statement)
Syntax
DDETerminate channel
Description
The channel parameter is an Integer containing the DDE channel number returned
from DDEInitiate. An error will result if channel is invalid.
All open DDE channels are automatically terminated when the procedure ends.
Example
This code fragment sets the content of the first cell in an Excel spreadsheet.
Sub Main()
q$ = Chr(34)
ch% = DDEInitiate("Excel","c:\sheets\test.xls")
cmd$ = "Select(" & q$ & "R1C1:R8C1" & q$ & ")"
DDEExecute ch%,cmd$
DDETerminate ch%
End Sub
Platform(s)
Windows, Win32.
See Also
DDEExecute (statement)
DDEInitiate (function)
DDEPoke (statement)
DDERequest, DDERequest$ (functions)
DDESend (function)
DDETerminateAll (statement)
DDETimeout (statement)
DDETerminateAll (statement)
Syntax
DDETerminateAll
Description
All open DDE channels are automatically terminated when the procedure ends.
Example
This code fragment selects the contents of the first cell in an Excel spreadsheet.
Sub Main()
q$ = Chr(34)
ch% = DDEInitiate("Excel","c:\sheets\test.xls")
cmd$ = "Select(" & q$ & "R1C1:R8C1" & q$ & ")"
DDEExecute ch%,cmd$
DDETerminateAll
End Sub
Platform(s)
Windows, Win32.
See Also
DDEExecute (statement)
DDEInitiate (function)
DDEPoke (statement)
DDERequest, DDERequest$ (functions)
DDESend (function)
DDETerminate (statement)
DDETimeout (statement)
DDETimeout (statement)
Sets the number of milliseconds that must elapse before any DDE command times
out.
Syntax
DDETimeout milliseconds
Description
The milliseconds parameter is a Long and must be within the following range:
0 <= milliseconds <= 2,147,483,647
Example
Sub Main()
q$ = Chr(34)
ch% = DDEInitiate("Excel","c:\sheets\test.xls")
DDETimeout(20000)
cmd$ = "Select(" & q$ & "R1C1:R8C1" & q$ & ")"
DDEExecute ch%,cmd$
DDETerminate ch%
End Sub
Platform(s)
Windows, Win32.
See Also
DDEExecute (statement)
DDEInitiate (function)
DDEPoke (statement)
DDERequest, DDERequest$ (functions)
DDESend (function)
DDETerminate (statement)
DDETerminateAll (statement)
Declare (statement)
Creates a prototype for either an external routine or a Docbasic routine that occurs
later in the source module or in another source module.
Syntax
Declare {Sub | Function} name[TypeChar] [CDecl | Pascal | System |
StdCall] _ [Lib "LibName$" [Alias "AliasName$"]] [([ParameterList])] [As
type]
Argument Descriptions
Description
Declare statements must appear outside of any Sub or Function declaration.
Declare statements are only valid during the life of the procedure in which they
appear.
In addition to the default Docbasic data types, ParameterType can specify any user-
defined structure, data object, or OLE automation object. If the data type of the
parameter is not known in advance, then the Any keyword can be used. This forces
the Docbasic compiler to relax type checking, allowing any data type to be passed
in place of the given argument.
The Any data type can only be used when passing parameters to external routines.
Passing Parameters
void MessageBeep(int);
AliasName$ Alias name that must be given to provide the name of the
routine if the name parameter is not the routine's real name.
For example, the following two statements declare the
same routine:
As Integer
ByVal Optional keyword indicating that the caller will pass the
parameter by value. Parameters passed by value cannot be
changed by the called routine.
ByRef Optional keyword indicating that the caller will pass the
parameter by reference. Parameters passed by reference
can be changed by the called routine. If neither ByVal or
ByRef are specified, then ByRef is assumed.
This routine would be declared as follows (notice the ByRef keyword in the third
parameter):
Strings can be passed by reference or by value. When they are passed by reference,
a pointer to the internal handle to the Docbasic string is passed. When they are
passed by value, Docbasic passes a 32-bit pointer to a null-terminated string (i.e.,
a C string). If an external routine modifies a passed string variable, then there must
be sufficient space within the string to hold the returned characters. This can be
accomplished using the Space function, as shown in the following example:
Declare Sub GetWindowsDirectory Lib "kernel" (ByVal dirname$, ByVal
length%)
:
Dim s As String
s = Space(128)
GetWindowsDirectory s,128
Another alternative to ensure that a string has sufficient space is to declare the
string with a fixed length:
Declare Sub GetWindowsDirectory Lib "kernel" (ByVal dirname$, ByVal
length%)
:
Dim s As String * 128'Declare a fixed-length string.
For external routines, the argument list must exactly match that of the referenced
routine. When calling an external subroutine or function, Docbasic needs to be told
how that routine expects to receive its parameters and who is responsible for
cleanup of the stack.
The following table describes which calling conventions are supported on which
platform, and indicates what the default calling convention is when no explicit
calling convention is specified in the Declare statement.
Sub Main()
Sub Foo "Hello"'Pass a 32-bit pointer to a null-terminated string
Sub Foo ByVal 0&'Pass a null pointer
End Sub
Table Table 3-26 shows how the different data types are passed to external routines:
ByRef Single A 32-bit pointer to a 4-byte IEEE floating point value (a float).
ByVal String A 2-byte internal value representing the string. This value can only
be used by external routines written specifically for Docbasic.
ByRef Variant A 32-bit pointer to a 16-byte internal variant structure. This structure
contains a 2-byte type (the same as that returne by the VarType
function), followed by 6-bytes of slop (for alignment), followed by 8-
bytes containing the value.
ByVal Variant A 16-byte variant structure. This structure contains a 2-byte type (the
same as that returned by the VarType function), followed by 6-bytes
of slop (for alignment), followed by 8-bytes containing the value.
ByVal Object For data objects, a 32-bit pointer to a 4-byte unsigned long integer.
This value can only be used by external routines written specifically
for Docbasic.
For OLE Automation objects, a 32-bit pointer to an LPDISPATCH
handle is passed.
ByRef Object For data objects, a 32-bit pointer to a 4-byte unsigned long integer
that references the object. This value can only be used by external
routines written specifically for Docbasic.
For OLE Automation objects, a 32-bit pointer to a 4-byte internal ID is
passed. This value can only be used by external routines written
specifically for Docbasic.
User-defined type A 32-bit pointer to the structure. User-defined types can only be
passed by reference.
It is important to remember that structures in Docbasic are packed on
2-byte boundaries, meaning that the individual structure members
may not be aligned consistently with similar structures declared in C.
Docbasic passes data to external functions consistent with that routine's prototype
as defined by the Declare statement. There is one exception to this rule: you can
override ByRef parameters using the ByVal keyword when passing individual
parameters. The following example shows a number of different ways to pass an
Integer to an external routine called Foo:
Declare Sub Foo Lib "MyLib" (ByRef i As Integer)
Sub Main
Dim i As Integer
i = 6
Foo 6 'Passes a temporary integer (value 6) by reference
Foo i 'Passes variable "i" by reference
Foo (i) 'Passes a temporary integer (value 6) by reference
Foo i + 1'Passes temporary integer (value 7) by reference
Foo ByVal i'Passes i by value
End Sub
The above example shows that the only way to override passing a value by
reference is to use the ByVal keyword.
Note: Use caution when using the ByVal keyword in this way. The external routine
Foo expects to receive a pointer to an Integer—a 32-bit value; using ByVal causes
Docbasic to pass the Integer by value—a 16-bit value. Passing data of the wrong
size to any external routine will have unpredictable results.
Example
Declare Function IsLoaded% Lib "Kernel" Alias "GetModuleHandle" (ByVal
name$)
Sub Main()
SName$ = "Intl"'Win.ini section name.
KName$ = "sCountry"'Win.ini country setting.
ret$ = String$(255, 0)'Initialize return string.
If GetProfileString(SName$,KName$,"",ret$,Len(ret$)) Then
MsgBox "Your country setting is: " & ret$
Else
MsgBox "There is no country setting in your win.ini file."
End If
If IsLoaded("Progman") Then
MsgBox "Progman is loaded."
Else
MsgBox "Progman is not loaded."
End If
End Sub
Platform(s)
All platforms support Declare for forward referencing.
The following platforms currently support the use of Declare for referencing
external routines: Windows, Win32, Macintosh. See below for details.
All the Windows API routines are contained in DLLs, such as "user", "kernel", and
"gdi". The file extension ".exe" is implied if another extension is not given.
If the libname$ parameter does not contain an explicit path to the DLL, the
following search will be performed for the DLL (in this order):
If the first character of aliasname$ is #, then the remainder of the characters specify
the ordinal number of the routine to be called. For example, the following two
statements are equivalent (under Windows, GetCurrentTime is defined as ordinal
15 in the user.exe module):
Under Windows, the names of external routines declared using the CDecl keyword
are usually preceeded with an underscore character. When Docbasic searches for
your external routine by name, it first attempts to load the routine exactly as
specified. If unsuccessful, Docbasic makes a second attempt by prepending an
underscore character to the specified name. If both attempts fail, then Docbasic
generates a runtime error.
Windows has a limitation that prevents Double, Single, and Date values from
being returned from routines declared with the CDecl keyword. Routines that
return data of these types should be declared Pascal.
All the Win32 API routines are contained in DLLs, such as "user32", "kernel32", and
"gdi32". The file extension ".exe" is implied if another extension is not given.
The Pascal and StdCall calling conventions are identical on Win32 platforms.
Furthermore, on this platform, the arguments are passed using C ordering
regardless of the calling convention -- right to left on the stack.
If the libname$ parameter does not contain an explicit path to the DLL, the
following search will be performed for the DLL (in this order):
If the first character of aliasname$ is #, then the remainder of the characters specify
the ordinal number of the routine to be called. For example, the following two
statements are equivalent (under Win32, GetCurrentTime is defined as
GetTickCount, ordinal 300, in kernel32.dll):
When using the C calling convention (with the CDecl keyword), Docbasic assumes
4-byte integers (the int data type in C). This may be problematic, as some compilers
on the Macintosh assume 2-byte integers.
If the libname$ parameter does not contain an explicit path to the DLL, the
following search will be performed for the DLL (in this order):
Note: Docbasic does not support passing of Single and Double values to external
16-bit subroutines or functions. These data types are also not supported as return
values from external 16-bit functions.
If the first character of aliasname$ is #, then the remainder of the characters specify
the ordinal number of the routine to be called.
See Also
Call (statement)
Sub...End Sub (statement)
Function...End Function (statement)
DefType (statement)
Syntax
DefInt letterrange
DefLng letterrange
DefStr letterrange
DefSng letterrange
DefDbl letterrange
DefCur letterrange
DefObj letterrange
DefVar letterrange
DefBool letterrange
DefDate letterrange
Description
The DefType statement controls automatic type declaration of variables. Normally,
if a variable is encountered that hasn't yet been declared with the Dim, Public, or
Private statement or does not appear with an explicit type-declaration character,
then that variable is declared implicitly as a variant (DefVar A-Z). This can be
changed using the DefType statement to specify starting letter ranges for types
other than integer. The letterrange parameter is used to specify starting letters.
Thus, any variable that begins with a specified character will be declared using the
specified type.
The DefType statement only affects how Docbasic compiles procedures and has no
effect at runtime.
The DefType statement can only appear outside all Sub and Function declarations.
The following table describes the data types referenced by the different variations
of the DefType statement:
DefInt Integer
DefLng Long
DefStr String
DefSng Single
DefDbl Double
DefCur Currency
DefObj Object
DefVar Variant
DefBool Boolean
DefDate Date
Example
DefStr a-l
DefLng m-r
DefSng s-u
DefDbl v-w
DefInt x-z
Sub Main()
a = 100.52
m = 100.52
s = 100.52
v = 100.52
x = 100.52
msg = "The values are:"
msg = msg & "(String) a: " & a
msg = msg & "(Long) m: " & m
msg = msg & "(Single) s: " & s
msg = msg & "(Double) v: " & v
msg = msg & "(Integer) x: " & x
MsgBox msg
End Sub
Platform(s)
All.
See Also
Boolean (data type)
Currency (data type)
Date (data type)
Double (data type)
Integer (data type)
Long (data type)
Object (data type)
Single (data type)
String (data type)
Variant (data type)
Dim (statement)
Declares a list of local variables and their corresponding types and sizes.
Syntax
Dim name [(<subscripts>)] [As [New] type] [,name [(<subscripts>)] [As
[New] type]]...
Description
If a type-declaration character is used when specifying name (such as %, @, &, $, or
!), the optional [As type] expression is not allowed. For example, the following are
allowed:
Dim Temperature As Integer
Dim Temperature%
The subscripts parameter allows the declaration of dynamic and fixed arrays. The
subscripts parameter uses the following syntax:
The lower and upper parameters are integers specifying the lower and upper
bounds of the array. If lower is not specified, then the lower bound as specified by
Option Base is used (or 1 if no Option Base statement has been encountered).
Docbasic supports a maximum of 60 array dimensions.
The total size of an array (not counting space for strings) is limited to 64K.
The type parameter specifies the type of the data item being declared. It can be any
of the following data types: String, Integer, Long, Single, Double, Currency, Object,
data object, built-in data type, or any user-defined data type.
Fixed-Length Strings
If Docbasic encounters a variable that has not been explicitly declared with Dim,
then the variable will be implicitly declared using the specified type-declaration
character (#, %, @, $, or &). If the variable appears without a type-declaration
character, then the first letter is matched against any pending DefType statements,
using the specified type if found. If no DefType statement has been encountered
corresponding to the first letter of the variable name, then Variant is used.
The optional New keyword is used to declare a new instance of the specified data
object. This keyword can only be used with data object types. Furthermore, this
keyword cannot be used when declaring arrays.
At runtime, the application or extension that defines that object type is notified that
a new object is being defined. The application responds by creating a new physical
object (within the appropriate context) and returning a reference to that object,
which is immediately assigned to the variable being declared.
When that variable goes out of scope (i.e., the Sub or Function procedure in which
the variable is declared ends), the application is notified. The application then
performs some appropriate action, such as destroying the physical object.
Initial Values
All declared variables are given initial values, as described in the following table:
Integer 0
Long 0
Double 0.0
Single 0.0
Currency 0.0
Boolean False
Object Nothing
Variant Empty
User-defined type Each element of the structure is given an initial value, as described above.
Arrays Each element of the array is given an initial value, as described above.
Naming Conventions
Examples
The following examples use the Dim statement to declare various variable types.
Sub Main()
Dim i As Integer
Dim l& 'long
Dim s As Single
Dim d# 'double
Dim c$ 'string
Dim MyArray(10) As Integer'10 element integer array
Dim MyStrings$(2,10)'2-10 element string arrays
Dim Filenames$(5 to 10)'6 element string array
Dim Values(1 to 10, 100 to 200)'111 element variant array
End Sub
Platform(s)
All.
See Also
Redim (statement)
Public (statement)
Private (statement)
Option Base (statement)
Syntax
Dir$[(filespec$ [,attributes])]
Argument Descriptions
Description
If filespec$ is specified, then the first file matching that filespec$ is returned. If
filespec$ is not specified, then the next file matching the initial filespec$ is returned.
An error is generated if Dir$ is called without first calling it with a valid filespec$.
Wildcards
The filespec$ argument can include wildcards, such as * and ?. The * character
matches any sequence of zero or more characters, whereas the ? character matches
any single character. Multiple *'s and ?'s can appear within the expression to form
complete searching patterns. The following table shows some examples:
* (All files)
Attributes
You can control which files are included in the search by specifying the optional
attributes parameter. The Dir, Dir$ functions always return all normal, read-only,
and archive files (ebNormal Or ebReadOnly Or ebArchive). To include additional
files, you can specify any combination of the following attributes (combined with
the Or operator):
Example
This example dimensions a null array and fills it with directory entries. The result
is displayed in a dialog box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Dim a$(10)
a(1) = Dir$("*.*")
i% = 1
While (a(i%) <> "") And (i% < 10)
i% = i% + 1
a(i%) = Dir$
Wend
MsgBox a(1) & crlf & a(2) & crlf & a(3) & crlf & a(4)
End Sub
Platform(s)
All.
The text$ parameter is a four-character string containing a file type, a resource type,
an application signature, or an Apple event. A runtime error occurs if the MacID
function is used on platforms other than the Macintosh.
When the MacID function is used, the filespec$ parameter specifies the directory in
which to search for files of the indicated type.
See Also
ChDir (statement)
ChDrive (statement)
CurDir, CurDir$ (functions)
MkDir (statement)
RmDir (statement)
FileList (statement)
DiskDrives (statement)
Fills the specified String or Variant array with a list of valid drive letters.
Syntax
DiskDrives array()
Description
The array() parameter specifies either a zero- or a one-dimensioned array of strings
or variants. The array can be either dynamic or fixed.
If array() is dynamic, then it will be redimensioned to exactly hold the new number
of elements. If there are no elements, then the array will be redimensioned to
contain no dimensions. You can use the LBound, UBound, and ArrayDims
functions to determine the number and size of the new array's dimensions.
If the array is fixed, each array element is first erased, then the new elements are
placed into the array. If there are fewer elements than will fit in the array, then the
remaining elements are initialized to zero-length strings (for String arrays) or
Empty (for Variant arrays). A runtime error results if the array is too small to hold
the new elements.
Example
This example builds and displays an array containing the first three available disk
drives.
Sub Main()
Dim drive$()
DiskDrives drive$
MsgBox "Available Disk Drives " + drive$
End Sub
Platform(s)
Windows, Win32.
See Also
ChDrive (statement)
DiskFree (function)
DiskFree (function)
Returns a Long containing the free space (in bytes) available on the specified drive.
Syntax
DiskFree&([drive$])
Description
If drive$ is zero-length or not specified, then the current drive is assumed.
Example
This example uses DiskFree to set the value of i and then displays the result in a
message box.
Sub Main()
s$ = "c"
i# = DiskFree(s$)
MsgBox "Free disk space on drive '" & s$ & "' is: " & i#
End Sub
Platform(s)
All.
Platform Notes:
On systems that do not support drive letters, the drive$ parameter specifies the
name of the path from which to retrieve the free disk space.
See Also
ChDrive (statement)
DiskDrives (statement)
dmAPIExec (function)
Invokes a method. Use with methods that perform operations but do not set or
retrieve values, such as the Disconnect method. Returns a Boolean, True if the
method executed successfully, False otherwise.
Syntax
dmAPIExec (method$)
Argument Descriptions
Example
This example displays an alert message in a dialog box.
Sub Main()
ret% = dmAPIExec("alert,c,dcapp,A message using the API")
End Sub
Platform(s)
All.
See Also
dmAPIGet (function)
dmAPISet (function)
dmAPIGet (function)
Invokes a method. Use with methods that return data or objects to the user or
application, such as the Connect method. Returns a pointer to a data storage area.
Syntax
dmAPIGet (method$)
Argument Descriptions
Description
When you execute a method that returns data, the system places the data in the
client memory cache associated with the running application. At this point, the
application can utilize the data. If the method was a Getfile method, the server
copies the requested file to the location specified in the method call.
Each time you issue a dmAPIGet function, the data returned by the invoked
method overwrites any existing data in the storage area. Consequently, do not
execute consecutive dmAPIGet functions without retrieving the data from the first
call before you issue the second.
Example
This example returns the object ID of the currently active window in Workspace.
Sub Main()
id$ = dmAPIGet("getdata,c,dcapp,active_window")
MsgBox "The active window ID is: " + id$
End Sub
Platform(s)
All.
See Also
dmAPIExec (function)
dmAPISet (function)
dmAPISet (function)
Invokes a method. Use with methods that write data to the docbase or assign
values to attributes, such as the Set method. Returns a Boolean, True if the method
executed successfully, False otherwise.
Syntax
dmAPISet (method$, newvalue$)
Argument Descriptions
Example
This example changes the title of the Workspace application window to New Title.
Sub Main()
ret% = dmAPISet("setdata,c,dcapp,title","New Title")
End Sub
Platform(s)
All.
See Also
dmAPIExec (function)
dmAPIGet (function)
dmExit (function)
Syntax
dmExit (return_status)
Argument Descriptions
Description
The dmExit function applies to procedures stored in dm_method objects on the
server. dmExit is non-operational if executed in a procedure for customizing
Workspace.
The dmExit function closes all files before terminating the procedure.
Example
This example checks to see whether a user belongs to a certain group. If so, dmExit
passes 0 to the operating system; otherwise dmExit returns -1. For simplicity error
handling is ignored.
Function check_group(ByVal usr As String, ByVal grp As String) As Integer
col_id = dmAPIGet(buff)
buff = "next,c," & col_id
status = dmAPIExec(buff)
buff = "get,c," & col_id & ",exist"
value = Val(dmAPIGet(buff))
Platform(s)
All.
See Also
dmAPIExec (function)
dmAPIGet (function)
dmAPISet (function)
Do...Loop (statement)
Syntax 1
Do {While | Until} condition statements Loop
Syntax 2
Do
statements
Loop {While | Until} condition
Syntax 3
Do
statements
Loop
Description
If the {While | Until} conditional clause is not specified, then the loop repeats the
statements forever (or until Docbasic encounters an Exit Do statement).
Examples
This first example uses the Do...While statement, which performs the iteration,
then checks the condition, and repeats if the condition is True.
Sub Main()
Dim a$(100)
i% = -1
Do
i% = i% + 1
If i% = 0 Then
a(i%) = Dir$("*")
Else
a(i%) = Dir$
End If
Loop While (a(i%) <> "" And i% <= 99)
r% = SelectBox(i% & " files found",,a)
This second example uses the Do While...Loop, which checks the condition and
then repeats if the condition is True.
Dim a$(100)
i% = 0
a(i%) = Dir$("*")
Do While a(i%) <> "" And i% <= 99
i% = i% + 1
a(i%) = Dir$
Loop
r% = SelectBox(i% & " files found",,a)
This third example uses the Do Until...Loop, which does the iteration and then
checks the condition and repeats if the condition is True.
Dim a$(100)
i% = 0
a(i%) = Dir$("*")
Do Until a(i%) = "" Or i% = 100
i% = i% + 1
a(i%) = Dir$
Loop
r% = SelectBox(i% & " files found",,a)
This last example uses the Do...Until Loop, which performs the iteration first,
checks the condition, and repeats if the condition is True.
Dim a$(100)
i% = -1
Do
i% = i% + 1
If i% = 0 Then
a(i%) = Dir$("*")
Else
a(i%) = Dir$
End If
Loop Until (a(i%) = "" Or i% = 100)
r% = SelectBox(i% & " files found",,a)
End Sub
Platform(s)
All.
See Also
For...Next (statement)
While ...WEnd (statement)
A data type used to declare variables capable of holding real numbers with 15-16
digits of precision.
Syntax
Double
Description
Double variables are used to hold numbers within the following ranges:
Sign Range
Storage
Internally, doubles are 8-byte (64-bit) IEEE values. Thus, when appearing within a
structure, doubles require 8 bytes of storage. When used with binary or random
files, 8 bytes of storage are required.
Platform(s)
All.
See Also
Boolean (data type)
Currency (data type)
Date (data type)
Integer (data type)
ebBoolean (constant)
Description
This constant is equal to 11.
Example
Sub Main()
Dim MyVariant as variant
MyVariant = True
If VarType(MyVariant) = ebBoolean Then
MyVariant = 5.5
End If
End Sub
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebCancel (constant)
Description
This constant is equal to 2.
Example
Sub Main()
'Invoke MsgBox and check whether the Cancel button was pressed.
rc% = MsgBox("Are you sure you want to quit?",ebOKCancel)
If rc% = ebCancel Then
MsgBox "The user clicked Cancel."
End If
End Sub
Platform(s)
Windows, Win32, Macintosh.
See Also
MsgBox (function)
MsgBox (statement)
ebCritical (constant)
Description
This constant is equal to 16.
Example
Sub Main()
'Invoke MsgBox with Abort, Retry, and Ignore buttons and a Stop icon.
rc% = MsgBox("Disk drive door is open.",ebAbortRetryIgnore Or
ebCritical)
If rc% = 3 Then
'The user selected Abort from the dialog box.
MsgBox "The user clicked Abort."
End If
End Sub
Platform(s)
Windows, Win32, Macintosh.
See Also
MsgBox (function)
MsgBox (statement)
ebCurrency (constant)
Description
This constant is equal to 6.
Example
This example checks to see whether a variant is of type Currency.
Sub Main()
Dim MyVariant
If VarType(MyVariant) = ebCurrency Then
MsgBox "Variant is Currency."
End If
End Sub
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebDataObject (constant)
Description
This constant is equal to 13.
Example
This example checks to see whether a variable is a data object.
Sub Main()
Dim MyVariant as Variant
If VarType(MyVariant) = ebDataObject Then
MsgBox "Variant contains a data object."
End If
End Sub
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebDate (constant)
Description
This constant is equal to 7.
Example
Sub Main()
Dim MyVariant as Variant
If VarType(MyVariant) = ebDate Then
MsgBox "This variable is a Date type!"
Else
MsgBox "This variable is not a Date type!"
End If
End Sub
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebEmpty (constant)
Description
This constant is equal to 0.
Example
Sub Main()
Dim MyVariant as Variant
If VarType(MyVariant) = ebEmpty Then
MsgBox "No data has been input yet!"
End If
End Sub
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebError (constant)
Description
This constant is equal to 10.
Example
This example checks to see whether a variable is an error.
Function Div(ByVal a As Variant,ByVal b As Variant) As Variant
If b = 0 Then
Div = CVErr(20000)
Else
Div = a / b
End If
End Function
Sub Main()
Dim Result as Variant
Randomize
Result = Div(10,Random(0,2))
If VarType(Result) = ebError Then
MsgBox "An error occurred"
Else
MsgBox "The result of the division is: " & Result
End If
End Sub
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebHidden (constant)
Description
This constant is equal to 2.
Example
This example dimensions an array and fills it with filenames using the ebHidden
attribute.
Sub Main()
Dim s$()
FileList s$,"*",ebHidden
If ArrayDims(s$) = 0 Then
MsgBox "No hidden files found!"
End
End If
MsgBox("Hidden Files " + s$)
End Sub
Platform(s)
Windows, Win32, Macintosh.
See Also
Dir, Dir$ (functions)
FileList (statement)
SetAttr (statement)
FileAttr (function)
ebInteger (constant)
Description
This constant is equal to 2.
Example
This example defines a function that returns True if a variant contains an Integer
value (either a 16-bit or 32-bit Integer).
Function IsInteger(v As Variant) As Boolean
If VarType(v) = ebInteger Or VarType(v) = ebLong Then
IsInteger = True
Else
IsInteger = False
End If
End Function
Sub Main()
Dim i as Integer
i = 123
If IsInteger(i) then
Msgbox "i is an Integer."
End If
End Sub
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebLong (constant)
Description
This constant is equal to 3.
Example
See ebInteger (constant).
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebNone (constant)
Description
This value can be used with the Dir$ and FileList commands. These functions will
return only files with no attributes set when used with this constant. This constant
is equal to 64.
Example
This example dimensions an array and fills it with filenames with no attributes set.
Sub Main()
Dim s$()
FileList s$,"*",ebNone
If ArrayDims(s$) = 0 Then
MsgBox "No files found without attributes!"
End
End If
MsgBox "Files with attributes " + s$
End Sub
Platform(s)
All.
See Also
Dir, Dir$ (functions)
FileList (statement)
SetAttr (statement)
FileAttr (function)
ebNormal (constant)
Description
This value can be used with the Dir$ and FileList commands and will return files
with the Archive, Volume, ReadOnly, or no attributes set. It will not match files
with Hidden, System, or Directory attributes. This constant is equal to 0.
Example
This example dimensions an array and fills it with filenames with Normal
attributes.
Sub Main()
Dim s$()
FileList s$,"*", ebNormal
If ArrayDims(s$) = 0 Then
MsgBox "No filesfound!"
End
End If
MsgBox "Normal files " + s$
End Sub
Platform(s)
All.
See Also
Dir, Dir$ (functions)
FileList (statement)
SetAttr (statement)
FileAttr (function)
ebNull (constant)
Description
This constant is equal to 1.
Example
Sub Main()
Dim MyVariant
MyVariant = Null
If VarType(MyVariant) = ebNull Then
MsgBox "This variant is Null"
End If
End Sub
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebObject (constant)
Number representing the type of an Object variant (an OLE automation object).
Description
This constant is equal to 9.
Example
Sub Main()
If VarType(MyVariant) = ebObject Then
MsgBox MyVariant.Value
End If
End Sub
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebReadOnly (constant)
Description
This constant is equal to 1.
Example
This example dimensions an array and fills it with filenames with ReadOnly
attributes.
Sub Main()
Dim s$()
FileList s$, "*", ebReadOnly
If ArrayDims(s$) = 0 Then
MsgBox "No read only files found!"
End
End If
MsgBox "ReadOnly Files " + s$
End Sub
Platform(s)
All.
See Also
Dir, Dir$ (functions)
FileList (statement)
SetAttr (statement)
FileAttr (function)
ebSingle (constant)
Description
This constant is equal to 4.
Example
This example defines a function that returns True if the passed variant is a Real
number.
Function IsReal(v As Variant) As Boolean
If VarType(v) = ebSingle Or VarType(v) = ebDouble Then
IsReal = True
Else
IsReal = False
End If
End Function
Sub Main()
Dim i as Integer
i = 123
If IsReal(i) then
Msgbox "i is Real."
End If
End Sub
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebString (constant)
Description
This constant is equal to 8.
Example
Sub Main()
Dim MyVariant as variant
MyVariant = "This is a test."
If VarType(MyVariant) = ebString Then
MsgBox "Variant is a string."
End If
End Sub
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebSystem (constant)
Description
This constant is equal to 4.
Example
This example dimensions an array and fills it with filenames with System
attributes.
Sub Main()
Dim s$()
FileList s$,"*",ebSystem
MsgBox "System files " + s$
End Sub
Platform(s)
Windows, Win32.
See Also
Dir, Dir$ (functions)
FileList (statement)
SetAttr (statement)
FileAttr (function)
ebSystemModal (constant)
Description
This constant is equal to 4096.
Example
Sub Main()
MsgBox "All applications are halted!",ebSystemModal
End Sub
Platform(s)
Windows, Win32, Macintosh.
See Also
Constants (topic)
MsgBox (function)
MsgBox (statement)
ebVariant (constant)
Description
Currently, it is not possible for variants to use this subtype. This constant is equal
to 12.
Platform(s)
All.
See Also
VarType (function)
Variant (data type)
ebVolume (constant)
Bit position of a file attribute indicating that a file is the volume label.
Description
This constant is equal to 8.
Example
This example dimensions an array and fills it with filenames with Volume
attributes.
Sub Main()
Dim s$()
FileList s$, "*", ebVolume
If ArrayDims(s$) > 0 Then
MsgBox "The volume name is: " & s(1)
Else
MsgBox "No volumes found."
End If
End Sub
Platform(s)
Windows, Win32.
See Also
Dir, Dir$ (functions)
FileList (statement)
SetAttr (statement)
FileAttr (function)
Empty (constant)
Description
The Empty value has special meaning indicating that a Variant is uninitialized.
Example
Sub Main()
Dim a As Variant
a = Empty
End Sub
Platform(s)
All.
See Also
Null (constant)
Variant (data type)
VarType (function)
End (statement)
Syntax
End
Example
This example uses the End statement to stop execution.
Sub Main()
MsgBox "The next line will terminate the procedure."
End
End Sub
Platform(s)
All.
See Also
Close (statement)
Stop (statement)
Exit For (statement)
Exit Do (statement)
Exit Function (statement)
Exit Sub (function)
Syntax
Environ[$](variable$ | VariableNumber)
Description
Environ$ returns a String, whereas Environ returns a String variant.
If variable$ is specified, then this function looks for that variable in the
environment. If the variable name cannot be found, then a zero-length string is
returned.
If VariableNumber is specified, then this function looks for the Nth variable within
the environment (the first variable being number 1). If there is no such
environment variable, then a zero-length string is returned. Otherwise, the entire
entry from the environment is returned in the following format:
variable = value
Example
This example looks for the DOS Comspec variable and displays the value in a
dialog box.
Sub Main()
Dim a$(1)
a$(1) = Environ$("COMSPEC")
MsgBox "The DOS Comspec variable is set to: " & a$(1)
End Sub
Platform(s)
All.
See Also
Command, Command$ (functions)
EOF (function)
Returns True if the end-of-file has been reached for the given file; returns False
otherwise.
Syntax
EOF(filenumber)
Description
The filenumber parameter is an Integer used by Docbasic to refer to the open file—
the number passed to the Open statement.
With sequential files, EOF returns True when the end of the file has been reached
(i.e., the next file read command will result in a runtime error).
With Random or Binary files, EOF returns True after an attempt has been made to
read beyond the end of the file. Thus, EOF will only return True when Get was
unable to read the entire record.
Example
This example opens the autoexec.bat file and reads lines from the file until the end-
of-file is reached.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Dim s$
Open "c:\autoexec.bat" For Input As #1
Do While Not EOF(1)
Input #1,s$
Loop
Close
MsgBox "The last line was:" & crlf & s$
End Sub
Platform(s)
All.
See Also
Open (statement)
LOF (function)
Eqv (operator)
Syntax
expression1 Eqv expression2
Description
If both expressions are either Boolean, Boolean variants, or Null variants, then a
logical equivalence is performed as follows:
If the first expression is and the second expression is Then the result is
Binary Equivalence
1 Eqv 1 = 1
0 Eqv 1 = 0
1 Eqv 0 = 0
0 Eqv 0 = 1
Example
This example assigns False to A, performs some equivalent operations, and
displays a dialog box with the result. Since A is equivalent to False, and False is
equivalent to 0, and by definition, A = 0, then the dialog box will display "A is
False."
Sub Main()
a = False
If ((a Eqv False) And (False Eqv 0) And (a = 0)) Then
MsgBox "a is False."
Else
MsgBox "a is True."
End If
End Sub
Platform(s)
All.
See Also
Operator Precedence (topic)
Or (operator)
Xor (operator)
Imp (operator)
And (operator)
Erase (statement)
Syntax
Erase array1 [, array2]...
Description
For dynamic arrays, the elements are erased, and the array is redimensioned to
have no dimensions (and therefore no elements). For fixed arrays, only the
elements are erased; the array dimensions are not changed.
After a dynamic array is erased, the array will contain no elements and no
dimensions. Thus, before the array can be used by your program, the dimensions
must be reestablished using the Redim statement.
The meaning of erasing an array element depends on the type of the element being
erased:
String (variable-length) Frees the string, then sets the element to a zero-length string.
Object Decrements the reference count and sets the element to Nothing.
Example
This example puts a value into an array and displays it. Then it erases the value
and displays it again.
Sub Main()
Dim a$(10) 'Declare an array.
a$(1) = Dir$("*")'Fill element 1 with a filename.
MsgBox "Array before Erase: " & a$(1)'Display element 1.
Erase a$ 'Erase all elements in the array.
MsgBox "Array after Erase: " & a$(1)'Display element 1 again (should be
erased).
End Sub
Platform(s)
All.
See Also
Redim (statement)
Arrays (topic)
Erl (function)
Syntax
Erl[()]
Description
The first line of the procedure is 1, the second line is 2, and so on.
The internal value of Erl is reset to 0 with any of the following statements: Resume,
Exit Sub, Exit Function. Thus, if you want to use this value outside an error
handler, you must assign it to a variable.
Example
This example generates an error and then determines the line on which the error
occurred.
Sub Main()
Dim i As Integer
On Error Goto Trap1
i = 32767 'Generate an error--overflow.
i = i + 1
Exit Sub
Trap1:
MsgBox "Error on line: " & Erl
Exit Sub 'Reset the error handler.
End Sub
Platform(s)
All.
See Also
Err (function)
Error, Error$ (functions)
Error Handling (topic)
Err (function)
Returns an Integer representing the error that caused the current error trap.
Syntax
Err[()]
Description
The Err function can only be used while within an error trap.
The internal value of Err is reset to 0 with any of the following statements: Resume,
Exit Sub, Exit Function. Thus, if you want to use this value outside an error
handler, you must assign it to a variable.
Example
This example forces error 10, with a subsequent transfer to the TestError label.
TestError tests the error and, if not error 55, resets Err to 999 (user-defined error)
and returns to the Main subroutine.
Sub Main()
On Error Goto TestError
Error 10
MsgBox "The returned error is: '" & Err() & " - " & Error$ & "'"
Exit Sub
TestError:
If Err = 55 Then 'File already open.
MsgBox "Cannot copy an open file. Close it and try again."
Else
MsgBox "Error '" & Err & "' has occurred!"
Err = 999
End If
Resume Next
End Sub
Platform(s)
All.
See Also
Erl (function)
Error, Error$ (functions)
Error Handling (topic)
Err (statement)
Sets the value returned by the Err function to a specific Integer value.
Syntax
Err = value
Description
Only positive values less than or equal to 32767 can be used.
Setting value to -1 has the side effect of resetting the error state. This allows you to
perform error trapping within an error handler. The ability to reset the error
handler while within an error trap is not standard Basic. Normally, the error
handler is reset only with the Resume, Exit Sub, or Exit Function statement.
Example
This example forces error 10, with a subsequent transfer to the TestError label.
TestError tests the error and, if not error 55, resets Err to 999 (user-defined error)
and returns to the Main subroutine.
Sub Main()
On Error Goto TestError
Error 10
MsgBox "The returned error is: '" & Err() & " - " & Error$ & "'"
Exit Sub
TestError:
If Err = 55 Then 'File already open.
MsgBox "Cannot copy an open file. Close it and try again."
Else
MsgBox "Error '" & Err & "' has occurred."
Err = 999
End If
Resume Next
End Sub
Platform(s)
All.
See Also
Error (statement)
Error Handling (topic)
Error (statement)
Syntax
Error errornumber
Description
The errornumber parameter is any Integer containing either a built-in error number
or a user-defined error number. The Err function can be used within the error trap
handler to determine the value of the error.
Example
This example forces error 10, with a subsequent transfer to the TestError label.
TestError tests the error and, if not error 55, resets Err to 999 (user-defined error)
and returns to the Main subroutine.
Sub Main()
On Error Goto TestError
Error 10
MsgBox "The returned error is: '" & Err() & " - " & Error$ & "'"
Exit Sub
TestError:
If Err = 55 Then 'File already open.
MsgBox "Cannot copy an open file. Close it and try again."
Else
MsgBox "Error '" & Err & "' has occurred."
Err = 999
End If
Resume Next
End Sub
Platform(s)
All.
See Also
Err (statement)
Error Handling (topic)
Error Handlers
Docbasic supports nested error handlers. When an error occurs within a
subroutine, Docbasic checks for an On Error handler within the currently
executing subroutine or function. An error handler is defined as follows:
Sub foo()
On Error Goto catch
'Do something here.
Exit Sub
catch:
'Handle error here.
End Sub
Error handlers have a life local to the procedure in which they are defined. The
error is reset when (1) another On Error statement is encountered, (2) an error
occurs, or (3) the procedure returns.
Cascading Errors
If a runtime error occurs and no On Error handler is defined within the currently
executing procedure, then Docbasic returns to the calling procedure and executes
the error handler there. This process repeats until a procedure is found that
contains an error handler or until there are no more procedures. If an error is not
trapped or if an error occurs within the error handler, then Docbasic displays an
error message, halting execution of the procedure.
Once an error handler has control, it must address the condition that caused the
error and resume execution with the Resume statement. This statement resets the
error handler, transferring execution to an appropriate place within the current
procedure. An error is displayed if a procedure exits without first executing
Resume or Exit.
Handling errors in Docbasic involves querying the error number or error text
using the Error$ or Err function. Since this is the only way to handle errors in
Docbasic, compatibility with Visual Basic's error numbers and messages is
essential.
You can intercept trappable errors using Docbasic's On Error construct. Almost all
errors in Docbasic are trappable except for various system errors.
Returns a String containing the text corresponding to the given error number or the
most recent error.
Syntax
Error[$][(errornumber)]
Description
Error$ returns a String, whereas Error returns a String variant.
If the Error statement was used to generate a user-defined runtime error, then this
function will return a zero-length string ("").
Example
This example forces error 10, with a subsequent transfer to the TestError label.
TestError tests the error and, if not error 55, resets Err to 999 (user-defined error)
and returns to the Main subroutine.
Sub Main()
On Error Goto TestError
Error 10
MsgBox "The returned error is: '" & Err() & " - " & Error$ & "'"
Exit Sub
TestError:
If Err = 55 Then 'File already open.
MsgBox "Cannot copy an open file. Close it and try again."
Else
MsgBox "Error '" & Err & "' has occurred."
Err = 999
End If
Resume Next
End Sub
Platform(s)
All.
See Also
Erl (function)
Err (function)
Error Handling (topic)
Exit Do (statement)
Syntax
Exit Do
Description
This statement can only appear within a Do...Loop statement.
Example
This example will load an array with directory entries unless there are more than
ten entries--in which case, the Exit Do terminates the loop.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Dim a$(5)
Do
i% = i% + 1
If i% = 1 Then
a(i%) = Dir$("*")
Else
a(i%) = Dir$
End If
If i% >= 10 Then Exit Do
Loop While (a(i%) <> "")
If i% = 10 Then
MsgBox i% & " entries processed!"
Else
MsgBox "Less than " & i% & " entries processed!"
End If
End Sub
Platform(s)
All.
See Also
Stop (statement)
Exit For (statement)
Exit Function (statement)
Causes execution to exit the innermost For loop, continuing execution on the line
following the Next statement.
Syntax
Exit For
Description
This statement can only appear within a For...Next block.
Example
This example will fill an array with directory entries until a null entry is
encountered or 100 entries have been processed--at which time, the loop is
terminated by an Exit For statement. The dialog box displays a count of files found
and then some entries from the array.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Dim a$(100)
For i = 1 To 100
If i = 1 Then
a$(i) = Dir$("*")
Else
a$(i) = Dir$
End If
If (a$(i) = "") Or (i >= 100) Then Exit For
Next i
msg = "There are " & i & " files found." & crlf
MsgBox msg & a$(1) & crlf & a$(2) & crlf & a$(3) & crlf & a$(10)
End Sub
Platform(s)
All.
See Also
Stop (statement)
Exit Do (statement)
Exit Function (statement)
Exit Sub (statement)
End (statement)
For...Next (statement)
Syntax
Exit Function
Description
This statement can only appear within a function.
Example
This function displays a message and then terminates with Exit Function.
Function Test_Exit() As Integer
MsgBox "Testing function exit, returning to Main()."
Test_Exit = 0
Exit Function
MsgBox "This line should never execute."
End Function
Sub Main()
a% = Test_Exit()
MsgBox "This is the last line of Main()."
End Sub
Platform(s)
All.
See Also
Stop (statement)
Exit For (statement)
Exit Do (statement)
Exit Sub (statement)
End (statement)
Function...End Function (statement)
Syntax
Exit Sub
Description
This statement can appear anywhere within a subroutine. It cannot appear within
a function.
Example
This example displays a dialog box and then exits. The last line should never
execute because of the Exit Sub statement.
Sub Main()
MsgBox "Terminating Main()."
Exit Sub
MsgBox "Still here in Main()."
End Sub
Platform(s)
All.
See Also
Stop (statement)
Exit For (statement)
Exit Do (statement)
Exit Function (statement)
End (function)
Sub...End Sub (statement)
Exp (function)
Syntax
Exp(value)
Description
The value parameter is a Double within the following range:
Example
This example assigns a to e raised to the 12.4 power and displays it in a dialog box.
Sub Main()
a# = Exp(12.40)
MsgBox "e to the 12.4 power is: " & a#
End Sub
Platform(s)
All.
See Also
Log (function)
Docbasic allows expressions to involve data of different types. When this occurs,
the two arguments are converted to be of the same type by promoting the less
precise operand to the same type as the more precise operand. For example,
Docbasic will promote the value of i% to a Double in the following expression:
result# = i% * d#
In some cases, the data type to which each operand is promoted is different than
that of the most precise operand. This is dependent on the operator and the data
types of the two operands and is noted in the description of each operator.
There are exceptions to this rule as noted in the description of the indicidual
operators.
Type Coercion
Docbasic performs numeric type conversion automatically. Automatic conversions
sometimes result in overflow errors, as shown in the following example:
d# = 45354
i% = d#
Rounding
When floating-point values (Single or Double) are converted to integer values
(Integer or Long), the fractional part of the floating-point number is lost, rounding
to the nearest integer value. Docbasic uses Baker's rounding:
If the fractional part is larger than .5, the number is rounded up.
If the fractional part is smaller than .5, the number is rounded down.
If the fractional part is equal to .5, then the number is rounded up if it is odd
and down if it is even.
The following table shows sample values before and after rounding:
2.1 2
4.6 5
2.5 2
3.5 4
Default Properties
When an OLE object variable or an Object variant is used with numerical operators
such as addition or subtraction, then the default property of that obect is
automatically retrieved. For example, consider the following:
The above example displays This application is Microsoft Excel in a dialog box.
When the variable Excel is used within the expression, the default property is
automatically retrieved, which, in this case, is the string Microsoft Excel.
Considering that the default property of the Excel object is .Value, then the
following two statements are equivalent:
External (function)
Syntax
External(object$)
Description
Before one procedure can call another procedure stored in a different
dm_procedure object, you must load the dm_procedure object into memory. The
External function does this for you. After loading a dm_procedure object, you can
call any of its procedures.
The object$ argument can be the object ID or the full path and object name of the
dm_procedure object to load.
/cabinet{/folder}/object_name
Example
This example loads a dm_procedure object called "My Procedure" stored in the
System cabinet.
Sub Main()
ret% = External("/System/My Procedure")
End Sub
Platform(s)
All.
False (Constant)
Description
Used in conditionals and Boolean expressions.
Example
This example assigns False to A, performs some equivalent operations, and
displays a dialog box with the result. Since A is equivalent to False, and False is
equivalent to 0, and by definition, A = 0, then the dialog box will display "A is
False."
Sub Main()
a = False
If ((a = False) And (False Eqv 0) And (a = 0)) Then
MsgBox "a is False."
Else
MsgBox "a is True."
End If
End Sub
Platform(s)
All.
See Also
True (constant)
Constants (topic)
Boolean (data type)
FileAttr (function)
Returns an Integer specifying the file mode (if attribute is 1) or the operating system
file handle (if attribute is 2).
Syntax
FileAttr(filenumber, attribute)
Description
The FileAttr function takes the following parameters:
Example
This example opens a file for input, reads the file attributes, and determines the file
mode for which it was opened. The result is displayed in a dialog box.
Sub Main()
Open "c:\autoexec.bat" For Input As #1
a% = FileAttr(1,1)
Select Case a%
Case 1
MsgBox "Opened for input."
Case 2
MsgBox "Opened for output."
Case 4
MsgBox "Opened for random."
Case 8
MsgBox "Opened for append."
Case 32
MsgBox "Opened for binary."
Case Else
MsgBox "Unknown file mode."
End Select
a% = FileAttr(1,2)
MsgBox "File handle is: " & a%
Close
End Sub
Platform(s)
All.
See Also
FileLen (function)
FileType (function)
FileExists (function)
Open (statement)
SetAttr (statement)
FileCopy (statement)
Syntax
FileCopy source$, destination$
Description
The FileCopy function takes the following parameters:
The file will be copied and renamed if the source$ and destination$ filenames are not
the same.
Some platforms do not support drive letters and may not support dots to indicate
current and parent directories.
Example
This example copies the autoexec.bat file to "autoexec.sav", then opens the copied
file and tries to copy it again--which generates an error.
Sub Main()
On Error Goto ErrHandler
FileCopy "c:\autoexec.bat", "c:\autoexec.sav"
Open "c:\autoexec.sav" For Input As # 1
FileCopy "c:\autoexec.sav", "c:\autoexec.sv2"
Close
Exit Sub
ErrHandler:
If Err = 55 Then 'File already open.
MsgBox "Cannot copy an open file. Close it and try again."
Else
MsgBox "An unspecified file copy error has occurred."
End If
Resume Next
End Sub
Platform(s)
All.
See Also
Kill (statement)
Name (statement)
FileDateTime (function)
Returns a Date variant representing the date and time of the last modification of a
file.
Syntax
FileDateTime(filename$)
Description
This function retrieves the date and time of the last modification of the file
specified by filename$ (wildcards are not allowed). A runtime error results if the file
does not exist. The value returned can be used with the date/time functions (i.e.,
Year, Month, Day, Weekday, Minute, Second, Hour) to extract the individual
elements.
Example
This example gets the file date/time of the autoexec.bat file and displays it in a
dialog box.
Sub Main()
If FileExists("c:\autoexec.bat") Then
a# = FileDateTime("c:\autoexec.bat")
MsgBox "The date/time information for the file is: " & Year(a#) & "-
" & Month(a#) & "-" & Day(a#)
Else
MsgBox "The file does not exist."
End If
End Sub
Platform(s)
All.
Platform Notes:
Some operating systems (such as Win32) store the file creation date, last
modification date, and the date the file was last written to. The FileDateTeime
function only returns the last modification date.
See Also
FileLen (function)
FileType (function)
FileAttr (function)
FileExists (function)
FileDirs (statement)
Syntax
FileDirs array() [,dirspec$]
Description
The FileDirs statement takes the following parameters:
t*.
c:\*.*
Example
This example fills an array with directory entries and displays the first one.
Sub Main()
Dim a$()
FileDirs a$,"c:\*.*"
Platform(s)
All.
See Also
FileList (statement)
Dir, Dir$ (functions)
CurDir, CurDir$ (functions)
ChDir (statement)
FileExists (function)
Syntax
FileExists(filename$)
Description
This function determines whether a given filename$ is valid.
Example
This example checks to see whether there is an autoexec.bat file in the root
directory of the C drive, then displays either its date and time of creation or the fact
that it does not exist.
Sub Main()
If FileExists("c:\autoexec.bat") Then
Msgbox "This file exists!"
Else
MsgBox "File does not exist."
End If
End Sub
Platform(s)
All.
See Also
FileLen (function)
FileType (function)
FileAttr (function)
FileParse$ (function)
FileLen (function)
Syntax
FileLen(filename$)
Description
This function is used in place of the LOF function to retrieve the length of a file
without first opening the file. A runtime error results if the file does not exist.
Example
This example checks to see whether there is a c:\autoexec.bat file and, if there is,
displays the length of the file.
Sub Main()
If (FileExists("c:\autoexec.bat") And (FileLen("c:\autoexec.bat") <> 0))
Then
b% = FileLen("c:\autoexec.bat")
MsgBox "The length of autoexec.bat is: " & b%
Else
MsgBox "File does not exist."
End If
End Sub
Platform(s)
All.
See Also
FileType (function)
FileAttr (function)
FileParse$ (function)
FileExists (function)
Loc (function)
FileList (statement)
Syntax
FileList array() [,[filespec$] [,[include_attr] [,exclude_attr]]]
Description
The FileList function takes the following parameters:
Wildcards
The * character matches any sequence of zero or more characters, whereas the ?
character matches any single character. Multiple *'s and ?'s can appear within the
expression to form complete searching patterns. The following table shows some
examples:
* (All files)
File Attributes
Table 3-36 Constants for Use with Include_attr and Exclude_attr Parameters
Example
This example fills an array a with the directory of the current drive for all files that
have normal or no attributes and excludes those with system attributes. The dialog
box displays four filenames from the array.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Dim a$()
FileList a$,"*.*", (ebNormal + ebNone), ebSystem
If ArrayDims(a$) > 0 Then
MsgBox a$(1) & crlf & a$(2) & crlf & a$(3) & crlf & a$(4)
Else
MsgBox "No files found."
End If
End Sub
Platform(s)
All.
See Also
FileDirs (statement)
Dir, Dir$ (functions)
FileParse$ (function)
Returns a String containing a portion of filename$ such as the path, drive, or file
extension.
Syntax
FileParse$(filename$[, operation])
Description
The filename$ parameter can specify any valid filename (it does not have to exist).
For example:
..\test.dat
c:\sheets\test.dat
test.dat
1 Drive c
2 Path c:\sheets
3 Name test.dat
4 Root test
5 Extension dat
If operation is not specified, then the full name is returned. A runtime error will
result if operation is not one of the above values.
Example
This example parses the file string "c:\testsub\autoexec.bat" into its component
parts and displays them in a dialog box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Dim a$(6)
For i = 1 To 5
a$(i) = FileParse$("c:\testsub\autoexec.bat",i - 1)
Next i
MsgBox a$(1) & crlf & a$(2) & crlf & a$(3) & crlf & a$(4) & crlf & a$(5)
End Sub
Platform(s)
All.
Platform Notes:
On systems that do not support drive letters, operation 1 will return a zero-length
string.
The path separator is different on different platforms. Under Windows and Win32,
the backslash and forward slash can be used interchangeably. For example,
"c:\test.dat" is the same as "c:/test.dat".
See Also
FileLen (function)
FileType (function)
FileAttr (function)
FileExists (function)
FileType (function)
Syntax
FileType(filename$)
Description
One of the following Integer constants is returned:
ebDOS 1 A DOS executable file (exe files only; com files are not
recognized)
If one of the above values is not returned, then the file type is unknown.
Example
This example looks at c:\windows\winfile.exe and determines whether it is a DOS
or a Windows file. The result is displayed in a dialog box.
Sub Main()
a = FileType("c:\windows\winfile.exe")
If a = ebDos Then
MsgBox "This is a DOS file."
Else
MsgBox "This is a Windows file of type '" & a & "'"
End If
End Sub
Platform(s)
Windows.
See Also
FileLen (function)
FileAttr (function)
FileExists (function)
Fix (function)
Syntax
Fix(number)
Description
This function returns the integer part of the given value by removing the fractional
part. The sign is preserved.
The Fix function returns the same type as number, with the following exceptions:
If number is Empty, then an Integer variant of value 0 is returned.
If number is a String, then a Double variant is returned.
If number contains no valid data, then a Null variant is returned.
Example
This example returns the fixed part of a number and assigns it to b, then displays
the result in a dialog box.
Sub Main()
a# = -19923.45
b% = Fix(a#)
MsgBox "The fixed portion of -19923.45 is: " & b%
End Sub
Platform(s)
All.
See Also
Int (function)
CInt (function)
For...Next (statement)
Syntax
For counter = start To end [Step increment]
[statements]
[Exit For]
[statements]
Next [counter [,nextcounter]... ]
Description
The For statement takes the following parameters:
start Initial value for counter. The first time through the loop,
counter is assigned this value.
increment Amount added to counter each time through the loop. If end
is greater than start, then increment must be positive. If end
is less than start, then increment must be negative.
For...Next statements can be nested. In such a case, the Next [counter] statement
applies to the innermost For...Next.
The Next clause can be optimized for nested next loops by separating each counter
with a comma. The ordering of the counters must be consistent with the nesting
order (innermost counter appearing before outermost counter). The following
example shows two equivalent For statements:
For i = 1 To 10 For i = 1 To 10
For j = 1 To 10 For j = 1 To 10
Next j Next j,i
Next i
A Next clause appearing by itself (with no counter variable) matches the innermost
For loop.
The counter variable can be changed within the loop but will have no effect on the number
of times the loop will execute.
Example
Sub Main()
'This example constructs a truth table for the OR statement 'using
nested For...Next loops.
For x = -1 To 0
For y = -1 To 0
Z = x Or y
msg = msg & Format(Abs(x%),"0") & " Or "
msg = msg & Format(Abs(y%),"0") & " = "
msg = msg & Format(Z,"True/False") & Basic.Eoln$
Next y
Next x
MsgBox msg
End Sub
Platform(s)
All.
See Also
Do...Loop (statement)
While...WEnd (statement)
Syntax
Format[$](expression [,Userformat$])
Description
Format$ returns a String, whereas Format returns a String variant.
Built-In Formats
To format numeric expressions, you can specify one of the built-in formats. There
are two categories of built-in formats: one deals with numeric expressions and the
other with date/time values.The following tables list the built-in numeric and
date/time format strings, followed by an explanation of what each does.
Format Description
Format Description
Format Description
General date Displays the date and time. If there is no fractional part in
the numeric expression, then only the date is displayed. If
there is no integral part in the numeric expression, then
only the time is displayed. Output is in the following
form: 1/1/95 01:00:00 AM.
Lone time Displays the long time. The default is: h:mm:ss.
Medium time Displays the time using a 12-hour clock. Hours and
minutes are displayed, and the AM/PM designator is at
the end.
Short time Displays the time using a 24-hour clock. Hours and
minutes are displayed.
User-Defined Formats
In addition to the built-in formats, you can specify a user-defined format by using
characters that have special meaning when used in a format expression. The
following tables list the characters you can use for numeric, string, and date/time
formats and explain their functions.
Character Meaning
Empty string Displays the numeric expression as is, with no additional formatting.
Designates the number of digits to the left of the decimal and the number
of digits to the right. The character used in the formatted string depends
on the decimal placeholder, as specified by your locale.
E-E+e-e+ These are the scientific notation operators, which display the number in
scientific notation. At least one digit placeholder must exist to the left of E-
, E+, e-, or e+. Any digit placeholders displayed to the left of E-, E+, e-, or
e+ determine the number of digits displayed in the exponent. Using E+ or
e+ places a + in front of positive exponents and a - in front of negative
exponents. Using E- or e- places a - in front of negative exponents and
nothing in front of positive exponents.
Character Meaning
Separates hours, minutes, and seconds when time values are being
formatted. The actual character used depends on the character specified
by your locale.
Separates months, days, and years when date values are being formatted.
The actual character used depends on the character specified by your
locale.
"ABC" Displays the text between the quotation marks, but not the quotation
marks. To designate a double quotation mark within a format string, use
two adjacent double quotation marks.
Any empty space in a field will be filled with the specified fill character.
Numeric formats can contain one to three parts. Each part is separated by a
semicolon. If you specify one format, it applies to all values. If you specify two
formats, the first applies to positive values and the second to negative values. If
you specify three formats, the first applies to positive values, the second to
negative values, and the third to 0s. If you include semicolons with no format
between them, the format for positive values is used.
Character Meaning
Character Meaning
Character Meaning
c Displays the date as ddddd and the time as ttttt. Only the date is
displayed if no fractional part exists in the numeric expression. Only the
time is displayed if no integral portion exists in the numeric expression.
w Displays the number of the day of the week (1-7). Sunday is 1; Saturday is
7.
Character Meaning
AM/PM Displays the time using a 12-hour clock. Displays an uppercase AM for
time values before 12 noon. Displays an uppercase PM for time values
after 12 noon and before 12 midnight.
a/p Displays the time using a 12-hour clock. Displays a lowercase a or p at the
end.
AMPM Displays the time using a 12-hour clock. Displays the string s1159 for
values before 12 noon and s2359 for values after 12 noon and before 12
midnight.
Example
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
a# = 1199.234
msg = "Some general formats for '" & a# & "' are:"
msg = msg & Format$(a#,"General Number") & crlf
msg = msg & Format$(a#,"Currency") & crlf
msg = msg & Format$(a#,"Standard") & crlf
msg = msg & Format$(a#,"Fixed") & crlf
msg = msg & Format$(a#,"Percent") & crlf
msg = msg & Format$(a#,"Scientific") & crlf
msg = msg & Format$(True,"Yes/No") & crlf
msg = msg & Format$(True,"True/False") & crlf
msg = msg & Format$(True,"On/Off") & crlf
msg = msg & Format$(a#,"0,0.00") & crlf
msg = msg & Format$(a#,"##,###,###.###") & crlf
MsgBox msg
da$ = Date$
msg = "Some date formats for '" & da$ & "' are:"
msg = msg & Format$(da$,"General Date") & crlf
msg = msg & Format$(da$,"Long Date") & crlf
ti$ = Time$
msg = "Some time formats for '" & ti$ & "' are:"
msg = msg & Format$(ti$,"Long Time") & crlf
msg = msg & Format$(ti$,"Medium Time") & crlf
msg = msg & Format$(ti$,"Short Time") & crlf
MsgBox msg
End Sub
Platform(s)
All.
See Also
Str, Str$ (functions)
CStr (function)
FreeFile (function)
Syntax
FreeFile[()]
Description
The number returned is suitable for use in the Open statement and will always be
between 1 and 255 inclusive.
Example
This example assigns A to the next free file number and displays it in a dialog box.
Sub Main()
a = FreeFile
MsgBox "The next free file number is: " & a
End Sub
Platform(s)
All.
See Also
FileAttr (function)
Open (statement)
Syntax
[Private | Public] [Static] Function name[(arglist)] [As ReturnType]
[statements]
End Sub
Description
The Function statement has the following parts:
Part Description
Public Indicates that the function being defined can be called from
other procedures. If both the Private and Public keywords
are missing, then Public is assumed.
End Function
If no assignment is encountered before the function exits, then one of the following
values is returned:
Error Variant
False Boolean
The type of the return value is determined by the As ReturnType clause on the
Function statement itself. As an alternative, a type-declaration character can be
added to the Function name. For example, the following two definitions of Test
both return String values:
Function Test() As String
Test = "Hello, world"
End Function
Function Test$()
Test = "Hello, world"
End Function
i = UserFunction(10,12,(j))
Optional Parameters
Docbasic allows you to skip parameters when calling functions, as shown in the
following example:
Sub Main
a = Test(1,,4)'Parameter 2 was skipped.
End Sub
The call must contain the minimum number of parameters as requred by the
called function. For instance, using the above example, the following are
invalid:
a = Test(,1)'Only passes two out of three required parameters.
a = Test(1,2)'Only passes two out of three required parameters.
When you skip a parameter in this manner, Docbasic creates a temporary variable
and passes this variable instead. The value of this temporary variable depends on
the data type of the corresponding parameter in the argument list of the called
function, as described in the following table:
Error Variant
False Boolean
Within the called function, you will be unable to determine if a parameter was
skipped unless the parameter was declared as a variant in the argument list of the
function. In this case, you can use the IsMissing function to determine if the
parameter was skipped:
Function Test(a,b,c)
If IsMissing(a) Or IsMissing(b) Then Exit Sub
End Function
Example
Function Factorial(n%) As Integer
'This function calculates N! (N-factoral).
f% = 1
For i = n To 2 Step -1
f = f * i
Next i
Factorial = f
End Function
Sub Main()
'This example calls user-defined function Factoral and displays the
'result in a dialog box.
a% = 0
Do While a% < 2
a% = Val(InputBox$("Enter an integer number greater than 2.","Compute
Factorial"))
Loop
b# = Factorial(a%)
MsgBox "The factoral of " & a% & " is: " & b#
End Sub
Platform(s)
All.
See Also
Sub...End Sub (statement)
Fv (function)
Calculates the future value of an annuity based on periodic fixed payments and a
constant rate of interest.
Syntax
Fv(Rate, Nper, Pmt,Pv,Due)
Description
An annuity is a series of fixed payments made to an insurance company or other
investment company over a period of time. Examples of annuities are mortgages
and monthly savings plans.
Rate Double representing the interest rate per period. Make sure
that annual rates are normalized for monthly periods
(divided by 12).
Rate and NPer values must be expressed in the same units. If Rate is expressed as a
percentage per month, then NPer must also be expressed in months. If Rate is an
annual rate, then the NPer must also be given in years.
Example
This example calculates the future value of 100 dollars paid periodically for a
period of 10 years (120 months) at a rate of 10% per year (or .10/12 per month) with
payments made on the first of the month. The value is displayed in a dialog box.
Note: that payments are negative values.
Sub Main()
a# = Fv((.10/12),120,-100.00,0,1)
MsgBox "Future value is: " & Format(a#,"Currency")
End Sub
Platform(s)
All.
See Also
IRR (function)
MIRR (function)
Npv (function)
Pv (function)
Get (statement)
Retrieves data from a random or binary file and stores that data into the specified
variable.
Syntax
Get [#] filenumber, [recordnumber], variable
Description
The Get statement accepts the following parameters:
Get #1,,recvar
variable Variable into which data will be read. The type of the
variable determines how the data is read from the file, as
described below.
With random files, a runtime error will occur if the length of the data being read
exceeds the reclen parameter specified with the Open statement. If the length of the
data being read is less than the record length, the file pointer is advanced to the
start of the next record. With binary files, the data elements being read are
contiguousthe file pointer is never advanced.
The type of the variable parameter determines how data will be read from the file.
It can be any of the following types:
Date 8 bytes are read from the file (IEEE double format).
Boolean 2 bytes are read from the file. Nonzero values are True, and
zero values are False.
Variant A 2-byte VarType is read form the file, which determines the
format of the data that follows. Once the VarType is known, the
data is read individually, as described above. With user-
defined errors, after the 2-byte VarType, a 2-byte unsigned
integer is read and assigned as the value of the user-defined
error, followed by 2 additional bytes of information about the
error.
The exception is with strings, which are always preceded by a 2-
byte length.
Arrays Arrays cannot be read from a file using the Get statement.
Object Object variables cannot be read from a file using the Get
statement.
Example
This example opens a file for random write, then writes ten records into the file
with the values 10...50. Then the file is closed and reopened in random mode for
read, and the records are read with the Get statement. The result is displayed in a
message box.
Sub Main()
Open "test.dat" For Random Access Write As #1
For x = 1 to 10
y% = x * 10
Put #1,x,y
Next x
Close
MsgBox msg
Close
End Sub
Platform(s)
All.
See Also
Open (statement)
Put (statement)
Input# (statement)
Line Input# (statement)
Input, Input$ (functions)
GetAppInfo (function)
Syntax
GetAppInfo(section$,entry$,filename$)
Description
The GetAppInfo function accepts the following parameters:
section$ The name of the section containing the entry in the file. The
name can contain only alphabetic characters and is case-
sensitive. Do not include brackets ([ ]) around the name.
filename$ The name of the file where the settings are stored. Do not
include a file name extension. Docbasic automatically adds
".ini" as the file name extension.
Example
This example retrieves an entry called "WindowPosition" in a section called
"MyApplication" in MyFile.ini.
Sub Main()
ret$ = GetAppInfo("My Application","WindowPosition","MyFile")
End Sub
Platform(s)
All.
See Also
SetAppInfo (function)
GetAttr (function)
Syntax
GetAttr(filename$)
Description
The attribute value returned is the sum of the attributes set for the file. The value
of each attribute is as follows:
To determine whether a particular attribute is set, you can And the values shown
above with the value returned by GetAttr. If the result is True, the attribute is set,
as shown below:
Dim w As Integer
w = GetAttr("sample.txt")
If w And ebReadOnly Then MsgBox "This file is read-only."
Example
This example tests to see whether the file test.dat exists. If it does not, then it
creates the file. The file attributes are 'then retrieved with the GetAttr function, and
the result is displayed.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
If Not FileExists("test.dat") Then
Open "test.dat" For Random Access Write As #1
Close
End If
y% = GetAttr("test.dat")
If y% And ebNone Then msg = msg & "No archive bit is set." & crlf
If y% And ebReadOnly Then msg = msg & "The read-only bit is set." & crlf
If y% And ebHidden Then msg = msg & "The hidden bit is set." & crlf
If y% And ebSystem Then msg = msg & "The system bit is set." & crlf
If y% And ebVolume Then msg = msg & "The volume bit is set." & crlf
If y% And ebDirectory Then msg = msg & "The directory bit is set." & crlf
If y% And ebArchive Then msg = msg & "The archive bit is set."
MsgBox msg
Kill "test.dat"
End Sub
Platform(s)
All.
See Also
SetAttr (statement)
FileAttr (function)
GetObject (function)
Syntax
GetObject(filename$ [,class$])
Description
This function is used to retrieve an existing OLE automation object, either one that
comes from a file or one that has previously been instantiated.
The filename$ argument specifies the full pathname of the file containing the object
to be activated. The application associated with the file is determined by OLE at
runtime. For example, suppose that a file called c:\docs\resume.doc was created
by a word processor called wordproc.exe. The following statement would invoke
wordproc.exe, load the file called c:\docs\resume.doc, and assign that object to a
variable:
Dim doc As Object
Set doc = GetObject("c:\docs\resume.doc")
Specified Not Specified The default object from filename$. The application
to activate is determined by OLE based on the given
filename.
Specified Specified The object given class$ from the file given by
filename$. A runtime error occurs if an object of the
given class cannot be found in the given file.
Examples
This first example instantiates the existing copy of Excel.
Dim Excel As Object
Set Excel = GetObject(,"Excel.Application")
This second example loads the OLE server associated with a document.
Dim MyObject As Object
Set MyObject = GetObject("c:\documents\resume.doc",)
Platform(s)
Windows, Win32, Macintosh.
See Also
CreateObject (function)
Object (data type)
GetSession (function)
Syntax
GetSession()
Description
Use GetSession() to retrieve the current session for use in Workspace or Server API
commands that require a session identifier. GetSession() is most useful when more
than one session is open. You can also use GetSession() to determine if any session
is open at all.
Example
This example uses GetSession() to retrieve the current session and inserts the result
into a Fetch command:
Sub Main()
Session$ = GetSession()
cmd% = "fetch," + session$ + ",0900000987893e31"
ret% = dmAPIExec( cmd$ )
End Sub
Platform(s)
All.
Global (statement)
Description
See Public (statement).
Platform(s)
All.
GoSub (statement)
Syntax
GoSub label
Description
Execution can later be returned to the statement following the GoSub by using the
Return statement.
The label parameter must be a label within the current function or subroutine.
GoSub outside the context of the current function or subroutine is not allowed.
Example
This example gets a name from the user and then branches to a subroutine to check
the input. If the user clicks Cancel or enters a blank name, the program terminates;
otherwise, the name is set to MICHAEL, and a message is displayed.
Sub Main()
uname$ = Ucase$(InputBox$("Enter your name:","Enter Name"))
GoSub CheckName
MsgBox "Hello, " & uname$
Exit Sub
CheckName:
If (uname$ = "") Then
GoSub BlankName
ElseIf uname$ = "MICHAEL" Then
GoSub RightName
Else
GoSub OtherName
End If
Return
BlankName:
MsgBox "No name? Clicked Cancel? I'm shutting down."
Exit Sub
RightName:
Return
OtherName:
MsgBox "I am renaming you MICHAEL!"
uname$ = "MICHAEL"
Return
End Sub
Platform(s)
All.
See Also
Goto (statement)
Return (statement)
Goto (statement)
Syntax
Goto label
Description
The compiler will produce an error if label does not exist.
The label must appear within the same subroutine or function as the Goto.
Example
This example gets a name from the user and then branches to a statement,
depending on the input name. If the name is not MICHAEL, it is reset to
MICHAEL unless it is null or the user clicks Cancel--in which case, the program
displays a message and terminates.
Sub Main()
uname$ = Ucase$(InputBox$("Enter your name:","Enter Name"))
If uname$ = "MICHAEL" Then
Goto RightName
Else
Goto WrongName
End If
WrongName:
If (uname$ = "") Then
MsgBox "No name? Clicked Cancel? I'm shutting down."
Else
MsgBox "I am renaming you MICHAEL!"
uname$ = "MICHAEL"
Goto RightName
End If
Exit Sub
RightName:
MsgBox "Hello, MICHAEL!"
End Sub
Platform(s)
All.
See Also
GoSub (statement)
Call (statement)
Syntax
Hex[$](number)
Description
Hex$ returns a String, whereas Hex returns a String variant.
The returned string contains only the number of hexadecimal digits necessary to
represent the number, up to a maximum of eight.
The number parameter can be any type but is rounded to the nearest whole number
before converting to hex. If the passed number is an integer, then a maximum of
four digits are returned; otherwise, up to eight digits can be returned.
Example
This example inputs a number and displays it in decimal and hex until the input
number is 0 or an invalid input.
Sub Main()
Do
xs$ = InputBox$("Enter a number to convert:","Hex Convert")
x = Val(xs$)
If x <> 0 Then
MsgBox "Dec: " & x & " Hex: " & Hex$(x)
Else
MsgBox "Goodbye."
End If
Loop While x <> 0
End Sub
Platform(s)
All.
See Also
Oct, Oct$ (functions)
Hour (function)
Syntax
Hour(time)
Description
The value returned is as an Integer between 0 and 23 inclusive.
Example
This example takes the current time; extracts the hour, minute, and second; and
displays them as the current time.
Sub Main()
xt# = TimeValue(Time$())
xh# = Hour(xt#)
xm# = Minute(xt#)
xs# = Second(xt#)
MsgBox "The current time is: " & xh# & ":" & xm# & ":" & xs#
End Sub
Platform(s)
All.
See Also
Day (function)
Minute (function)
Second (function)
Month (function)
Year (function)
Weekday (function)
DatePart (function)
If...Then...Else (statement)
Syntax 1
If condition Then statements [Else else_statements]
Syntax 2
If condition Then
[statements]
[ElseIf else_condition Then
[elseif_statements]]
[Else
[else_statements]]
End If
Description
The single-line conditional statement (syntax 1) has the following parameters:
Example
This example inputs a name from the user and checks to see whether it is
MICHAEL or MIKE using three forms of the If...Then...Else statement. It then
branches to a statement that displays a welcome message depending on the user's
name.
Sub Main()
uname$ = UCase$(InputBox$("Enter your name:","Enter Name"))
If uname$ = "MICHAEL" Then GoSub MikeName
MikeName:
MsgBox "Hello, MICHAEL!"
Return
OtherName:
MsgBox "Hello, " & uname$ & "!"
Return
End Sub
Platform(s)
All.
See Also
Choose (function)
Switch (function)
IIf (function)
Select...Case (statement)
IIf (function)
Syntax
IIf(condition,TrueExpression,FalseExpression)
Description
Both expressions are calculated before IIf returns.
If condition Then
variable = TrueExpression
Else
variable = FalseExpression
End If
Example
Sub Main()
s$ = "Car"
MsgBox IIf(s$ = "Car","Nice Car","Nice Automobile")
End Sub
Platform(s)
All.
See Also
Choose (function)
Switch (function)
If...Then...Else (statement)
Select...Case (statement)
Imp (operator)
Syntax
expression1 Imp expression2
Description
If both expressions are either Boolean, Boolean variants, or Null variants, then a
logical implication is performed as follows:
Table 3-49 Effect of Boolean and Null Expressions on the Imp Operator
If the first expression is and the second expression is Then the result is
Binary Implication
1 Imp 1 = 1 Example:
0 Imp 1 = 1 5 01101001
1 Imp 0 = 0 6 10101010
Example
This example compares the result of two expressions to determine whether one
implies the other.
Sub Main()
a = 10 : b = 20 : c = 30 : d = 40
Platform(s)
All.
See Also
Operator Precedence (topic)
Or (operator)
Xor (operator)
Eqv (operator)
And (operator)
Inline (statement)
Syntax
Inline name [parameters]
anytext
End Inline
Description
The Inline statement takes the following parameters:
Example
Sub Main()
Inline MacScript
-- This is an AppleScript comment.
Beep
Display Dialog "AppleScript" buttons "OK" default button "OK"
Display Dialog Current Date
End Inline
End Sub
Platform(s)
All.
See Also
MacScript (statement)
Input# (statement)
Reads data from the file referenced by filenumber into the given variables.
Syntax
Input [#]filenumber%,variable[,variable]...
Description
The filenumber parameter is a number that is used by Docbasic to refer to the open
filethe number passed to the Open statement.
The file number must reference a file opened in Input mode. It is good practice to
use the Write statement to write date elements to files read with the Input
statement to ensure that the variable list is consistent between the input and output
routines.
Each variable must be type-matched to the data in the file. For example, a String
variable must be matched to a string in the file.
The following parsing rules are observed while reading each variable in the
variable list:
Leading white space is ignored (spaces and tabs).
When reading String variables, if the first character on the line is a quotation
mark, then characters are read up to the next quotation mark or the end of
the line, whichever comes first. Blank lines are read as empty strings. If the
first character read is not a quotation mark, then characters are read up to
the first comma or the end of the line, whichever comes first. String
delimiters (quotes, comma, end-of-line) are not included in the returned
string.
When reading numeric variables, scanning of the number stops when the
first non-number character (such as a comma, a letter, or any other
unexpected character) is encountered. Numeric errors are ignored while
reading numbers from a file. The resultant number is automatically
converted to the same type as the variable into which the value will be
placed. If there is an error in conversion, then 0 is stored into the variable.
&Hhexdigits[!|#|%|&]
&[O]octaldigits[!|#|%|&|@]
Normally, dates that follow the universal date format are input from
sequential files. These dates use this syntax:
#YYYY-MM-DD HH:MM:SS#
where YYYY is a year between 100 and 9999, MM is a month between 1 and
12, DD is a day between 1 and 31, HH is an hour between 0 and 23, MM is a
minute between 0 and 59, and SS is a second between 0 and 59.
When reading Variant variables, if the data begins with a quotation mark,
then a string is read consisting of the characters between the opening
quotation mark and the closing quotation mark, end-of-line, or end-of-file.
If the input does not begin with a quotation mark, then input is scanned up
to the next comma, end-of-line, or end-of-file and a determination is made as
to what data is being represented. If the data cannot be represented as a
number, Date, Error, Boolean, or Null, then it is read as a string.
Data Interpretation
character is specified, then Docbasic will read the number according to the
following rules:
Rule 2: If the number does not contain a decimal point or an exponent, then
the number is stored in the smallest of the following data types that most
accurately represents that value: Integer, Long, Currency, Double.
End-of-line is interpreted as either a single line feed, a single carriage return,
or a carriage-return/line-feed pair. Thus, text files from any platform can be
interpreted using this command.
Example
This example creates a file called test.dat and writes a series of variables into it.
Then the variables are read using the Input# function.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Open "test.dat" For Output As #1
Write #1,2112,"David","McCue","123-45-6789"
Close
Kill "test.dat"
End Sub
Platform(s)
All.
See Also
Open (statement)
Get (statement)
Line Input# (statement)
Input, Input$ (functions)
Syntax
Input[$](numbytes,[#]filenumber)
Description
Input$ returns a String, whereas Input returns a String variant.
Example
This example opens the autoexec.bat file and displays it in a dialog box.
Const crlf = Chr$(13) & Chr$(10)
Sub Main()
x& = FileLen("c:\autoexec.bat")
If x& > 0 Then
Open "c:\autoexec.bat" For Input As #1
Else
MsgBox "File not found or empty."
Exit Sub
End If
Platform(s)
All.
See Also
Open (statement)
Get (statement)
Input# (statement)
Line Input# (statement)
Displays a dialog box with a text box into which the user can type.
Syntax
InputBox[$](prompt [,[title] [,[default] [,X,Y]]])
Description
The content of the text box is returned as a String (in the case of InputBox$) or as a
String variant (in the case of InputBox). A zero-length string is returned if the user
selects Cancel.
Argument Descriptions
The InputBox/InputBox$ functions take the following parameters:
Example
Sub Main()
s$ = InputBox$("File to copy:","Copy","sample.txt")
End Sub
Platform(s)
Windows.
See Also
MsgBox (statement)
OpenFilename$ (function)
SaveFilename$ (function)
InStr (function)
Returns the first character position of string find within string search.
Syntax
InStr([start,] search, find [,compare])
Description
The InStr function takes the following parameters:
If the string is found, then its character position within search is returned, with 1
being the character position of the first character. If find is not found, or start is
greater than the length of search, or search is zero-length, then 0 is returned.
Example
This example checks to see whether one string is in another and, if it is, then it
copies the string to a variable and displays the result.
Sub Main()
a$ = "This string contains the name Stuart and other characters."
x% = InStr(a$,"Stuart",1)
If x% <> 0 Then
b$ = Mid$(a$,x%,6)
MsgBox b$ & " was found."
Exit Sub
Else
MsgBox "Stuart not found."
End If
End Sub
Platform(s)
All.
See Also
Mid, Mid$ (functions)
Option Compare (statement)
Item$ (function)
Word$ (function)
Line$ (function)
Int (function)
Syntax
Int(number)
Description
This function returns the integer part of a given value by returning the first integer
less than the number. The sign is preserved.
The Int function returns the same type as number, with the following exceptions:
If number is Empty, then an Integer variant of value 0 is returned.
If number is a String, then a Double variant is returned.
If number is Null, then a Null variant is returned.
Example
This example extracts the integer part of a number.
Sub Main()
a# = -1234.5224
b% = Int(a#)
MsgBox "The integer part of -1234.5224 is: " & b%
End Sub
Platform(s)
All.
See Also
Fix (function)
CInt (function)
A data type used to declare whole numbers with up to four digits of precision.
Syntax
Integer
Description
Integer variables are used to hold numbers within the following range:
-32768 <= integer <= 32767
Internally, integers are 2-byte short values. Thus, when appearing within a
structure, integers require 2 bytes of storage. When used with binary or random
files, 2 bytes of storage are required.
When passed to external routines, Integer values are sign-extended to the size of
an integer on that platform (either 16 or 32 bits) before pushing onto the stack.
Platform(s)
All.
See Also
Currency (data type)
Date (data type)
Double (data type)
Long (data type)
Object (data type)
Single (data type)
String (data type)
Variant (data type)
Boolean (data type)
DefType (statement)
CInt (function)
IPmt (function)
Returns the interest payment for a given period of an annuity based on periodic,
fixed payments and a fixed interest rate.
Syntax
IPmt(Rate, Per, Nper, Pv, Fv, Due)
Description
An annuity is a series of fixed payments made to an insurance company or other
investment company over a period of time. Examples of annuities are mortgages,
monthly savings plans, and retirement plans.
Per Double representing the payment period for which you are
calculating the interest payment. If you want to know the
interest paid or received during period 20 of an annuity,
this value would be 20.
Rate and Nper must be in expressed in the same units. If Rate is expressed in
percentage paid per month, then Nper must also be expressed in months. If Rate is
an annual rate, then the period given in Nper should also be in years or the annual
Rate should be divided by 12 to obtain a monthly rate.
If the function returns a negative value, it represents interest you are paying out,
whereas a positive value represents interest paid to you.
Example
This example calculates the amount of interest paid on a $1,000.00 loan financed
over 36 months with an annual interest rate of 10%. Payments are due at the
beginning of the month. The interest paid during the first 10 months is displayed
in a table.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
For x = 1 to 10
ipm# = IPmt((.10/12),x,36,1000,0,1)
msg = msg & Format(x,"00") & " : " & Format(ipm#," 0,0.00") & crlf
Next x
MsgBox msg
End Sub
Platform(s)
All.
See Also
NPer (function)
Pmt (function)
PPmt (function)
Rate (function)
IRR (function)
Returns the internal rate of return for a series of periodic payments and receipts.
Syntax
IRR(ValueArray(),Guess)
Description
The internal rate of return is the equivalent rate of interest for an investment
consisting of a series of positive and/or negative cash flows over a period of
regular intervals. It is usually used to project the rate of return on a business
investment that requires a capital investment up front and a series of investments
and returns on investment over time.
Guess Double containing your guess as to the value that the IRR
function will return. The most common guess is .1 (10
percent).
The value of IRR is found by iteration. It starts with the value of Guess and cycles
through the calculation adjusting Guess until the result is accurate within 0.00001
percent. After 20 tries, if a result cannot be found, IRR fails, and the user must pick
a better guess.
Example
This example illustrates the purchase of a lemonade stand for $800 and a series of
incomes from the sale of lemonade over 12 months. The projected incomes for this
example are generated in two For...Next Loops, and then the internal rate of return
is calculated and displayed. (Not a bad investment!)
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Dim valu#(12)
valu(1) = -800 'Initial investment
Platform(s)
All.
See Also
Fv (function)
MIRR (function)
Npv (function)
Pv (function)
Is (operator)
Returns True if the two operands refer to the same object; returns False otherwise.
Syntax
object Is [object | Nothing]
Description
This operator is used to determine whether two object variables refer to the same
object. Both operands must be object variables of the same type (i.e., the same data
object type or both of type Object).
Example
This function inserts the date into a Microsoft Word document.
Sub InsertDate(ByVal WinWord As Object)
If WinWord Is Nothing Then
MsgBox "Object variant is not set."
Else
WinWord.Insert Date$
End If
End Sub
Sub Main()
Dim WinWord As Object
On Error Resume Next
WinWord = CreateObject("word.basic")
InsertDate WinWord
End Sub
Platform(s)
All.
The following use of Is will return False, even though the actual objects may be the
same:
Dim a As Object
Dim b As Object
a = CreateObject("excel.application")
b = GetObject(,"excel.application")
If a Is b Then Beep
The Is operator may return False in the above case because, even though a and b
reference the same object, they may be treated as different objects by OLE 2.0 (this
is dependent on the OLE 2.0 server application).
See Also
Operator Precedence (topic)
Like (operator)
IsDate (function)
Syntax
IsDate(expression)
Example
Sub Main()
Dim a As Variant
Retry:
a = InputBox("Enter a date.", "Enter Date")
If IsDate(a) Then
MsgBox Format(a,"long date")
Else
Msgbox "Not quite, please try again!"
Goto Retry
End If
End Sub
Platform(s)
All.
See Also
Variant (data type)
IsEmpty (function)
IsError (function)
IsObject (function)
VarType (function)
IsNull (function)
IsEmpty (function)
Returns True if expression is a Variant variable that has never been initialized;
returns False otherwise.
Syntax
IsEmpty(expression)
Description
The IsEmpty function is the same as the following:
(VarType(expression) = ebEmpty)
Example
Sub Main()
Dim a As Variant
If IsEmpty(a) Then
a = 1.0# 'Give uninitialized data a Double value 0.0.
MsgBox "The variable has been initialized to: " & a
Else
MsgBox "The variable was already initialized!"
End If
End Sub
Platform(s)
All.
See Also
Variant (data type)
IsDate (function)
IsError (function)
IsObject (function)
VarType (function)
IsNull (function)
IsError (function)
Syntax
IsError(expression)
Example
This example creates a function that divides two numbers. If there is an error
dividing the numbers, then a variant of type "error" is returned. Otherwise, the
function returns the result of the division. The IsError function is used to determine
whether the function encountered an error.
Function Div(ByVal a,ByVal b) As Variant
If b = 0 Then
Div = CVErr(2112)'Return a special error value.
Else
Div = a / b 'Return the division.
End If
End Function
Sub Main()
Dim a As Variant
a = Div(10,12)
If IsError(a) Then
MsgBox "The following error occurred: " & CStr(a)
Else
MsgBox "The result is: " & a
End If
End Sub
Platform(s)
All.
See Also
Variant (data type)
IsEmpty (function)
IsDate (function)
IsObject (function)
VarType (function)
IsNull (function)
IsMissing (function)
Returns True if variable was passed to the current subroutine or function; returns
False if omitted.
Syntax
IsMissing(variable)
Description
IsMissing is used with variant variables passed as optional parameters (using the
Optional keyword) to the current subroutine or function. For non-variant variables
or variables that were not declared with the Optional keyword, IsMissing will
always return True.
Example
The following function runs an application and optionally minimizes it. If the
optional isMinimize parameter is not specified by the caller, then the application is
not minimized.
Sub Test(AppName As String,Optional isMinimize As Variant)
app = Shell(AppName)
If Not IsMissing(isMinimize) Then
AppMinimize app
Else
AppMaximize app
End If
End Sub
Sub Main
Test "Notepad"'Maximize this application
Test "Notepad",True'Minimize this application
End Sub
Platform(s)
All.
See Also
Declare (statement)
Sub...End Sub (statement)
Function...End Function (statement)
IsNull (function)
Returns True if expression is a Variant variable that contains no valid data; returns
False otherwise.
Syntax
IsNull(expression)
Description
The IsNull function is the same as the following:
(VarType(expression) = ebNull)
Example
Sub Main()
Dim a As Variant'Initialized as Empty
If IsNull(a) Then MsgBox "The variable contains no valid data."
a = Empty * Null
If IsNull(a) Then MsgBox "Null propagated through the expression."
End Sub
Platform(s)
All.
See Also
Empty (constant)
Variant (data type)
IsEmpty (function)
IsDate (function)
IsError (function)
IsObject (function)
VarType (function)
IsNumeric (function)
Syntax
IsNumeric(expression)
Description
If passed a number or a variant containing a number, then IsNumeric always
returns True.
If a String or String variant is passed, then IsNumeric will return True only if the
string can be converted to a number. The following syntaxes are recognized as
valid numbers:
&Hhexdigits[&|%|!|#|@]
&[O]octaldigits[&|%|!|#|@]
[-|+]digits[.[digits]][E[-|+]digits][!|%|&|#|@]
If an Object variant is passed, then the default property of that object is retrieved
and one of the above rules is applied.
Example
Sub Main()
Dim s$ As String
s$ = InputBox("Enter a number.","Enter Number")
If IsNumeric(s$) Then
MsgBox "You did good!"
Else
MsgBox "You didn't do so good!"
End If
End Sub
Platform(s)
All.
See Also
Variant (data type)
IsEmpty (function)
IsDate (function)
IsError (function)
IsObject (function)
VarType (function)
IsNull (function)
IsObject (function)
Syntax
IsObject(expression)
Example
This example will attempt to find a running copy of Excel and create an Excel
object that can be referenced as any other object in Docbasic.
Sub Main()
Dim v As Variant
On Error Resume Next
Set v = GetObject(,"Excel.Application")
If IsObject(v) Then
MsgBox"The default object value is: " & v = v.Value'Access value
property of the object.
Else
MsgBox "Excel not loaded."
End If
End Sub
Platform(s)
All.
See Also
Variant (data type)
IsEmpty (function)
IsDate (function)
IsError (function)
VarType (function)
IsNull (function)
Item$ (function)
Returns all the items between first and last within the specified formatted text list.
Syntax
Item$(text$,first,last [,delimiters$])
Description
The Item$ function takes the following parameters:
Example
This example creates two delimited lists and extracts a range from each, then
displays the result in a dialog box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
ilist$ = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15"
slist$ = "1/2/3/4/5/6/7/8/9/10/11/12/13/14/15"
list1$ = Item$(ilist$,5,12)
list2$ = Item$(slist$,2,9,"/")
MsgBox "The returned lists are: " & crlf & list1$ & crlf & list2$
End Sub
Platform(s)
All.
See Also
ItemCount (function)
Line$ (function)
LineCount (function)
Word$ (function)
WordCount (function)
ItemCount (function)
Returns an Integer containing the number of items in the specified delimited text.
Syntax
ItemCount(text$ [,delimiters$])
Description
Items are substrings of a delimited text string. Items, by default, are separated by
commas and/or end-of-lines. This can be changed by specifying different
delimiters in the delimiters$ parameter. For example, to parse items using a
backslash:
n = ItemCount(text$,"\")
Example
This example creates two delimited lists and then counts the number of items in
each. The counts are displayed in a dialog box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
ilist$ = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15"
slist$ = "1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19"
l1% = ItemCount(ilist$)
l2% = ItemCount(slist$,"/")
msg = "The first lists contains: " & l1% & " items." & crlf
msg = msg & "The second list contains: " & l2% & " items."
MsgBox msg
End Sub
Platform(s)
All.
See Also
Item$ (function)
Line$ (function)
LineCount (function)
Word$ (function)
WordCount (function)
Keywords (topic)
Restrictions
All keywords are reserved by Docbasic, in that you cannot create a variable,
function, constant, or subroutine with the same name as a keyword. However, you
are free to use all keywords as the names of structure members.
Platform(s)
All.
Kill (statement)
Syntax
Kill filespec$
Description
The filespec$ argument can include wildcards, such as * and ?. The * character
matches any sequence of zero or more characters, whereas the ? character matches
any single character. Multiple *'s and ?'s can appear within the expression to form
complex searching patterns. The following table shows some examples.
* (All files)
Example
This example looks to see whether file test1.dat exists. If it does not, then it creates
both test1.dat and test2.dat. The existence of the files is tested again; if they exist, a
message is generated, and then they are deleted. The final test looks to see whether
they are still there and displays the result.
Sub Main()
If Not FileExists("test1.dat") Then
Open "test1.dat" For Output As #1
Open "test2.dat" For Output As #2
Close
End If
Kill "test?.dat"
End If
Platform(s)
All.
The text$ parameter is a four-character string containing a file type, a resource type,
an application signature, or an Apple event. A runtime error occurs if the MacID
function is used on platforms other than the Macintosh.
See Also
Name (statement)
LBound (function)
Returns an Integer containing the lower bound of the specified dimension of the
specified array variable.
Syntax
LBound(ArrayVariable() [,dimension])
Description
The dimension parameter is an integer specifying the desired dimension. If this
parameter is not specified, then the lower bound of the first dimension is returned.
The LBound function can be used to find the lower bound of a dimension of an
array returned by an OLE automation method or property:
LBound(object.property [,dimension])
LBound(object.method [,dimension])
Examples
Sub Main()
'This example dimensions two arrays and displays their lower bounds.
lba = LBound(a)
lbb = LBound(b,2)
MsgBox "The lower bound of a is: " & lba & " The lower bound of b is: "
& lbb
Dim fl$()
FileList fl$,"*.*"
count = UBound(fl$)
If ArrayDims(a) Then
Redim nl$(LBound(fl$) To UBound(fl$))
For x = 1 To count
nl$(x) = fl$(x)
Next x
MsgBox "The last element of the new array is: " & nl$(count)
End If
End Sub
Platform(s)
All.
See Also
UBound (function)
ArrayDims (function)
Arrays (topic)
Syntax
LCase[$](text)
Description
LCase$ returns a String, whereas LCase returns a String variant.
Example
This example shows the LCase function used to change uppercase names to
lowercase with an uppercase first letter.
Sub Main()
lname$ = "WILLIAMS"
fl$ = Left$(lname$,1)
rest$ = Mid$(lname$,2,Len(lname$))
lname$ = fl$ & LCase$(rest$)
MsgBox "The converted name is: " & lname$
End Sub
Platform(s)
All.
See Also
UCase, UCase$ (functions)
Syntax
Left[$](text,NumChars)
Description
Left$ returns a String, whereas Left returns a String variant.
Example
This example shows the Left$ function used to change uppercase names to
lowercase with an uppercase first letter.
Sub Main()
lname$ = "WILLIAMS"
fl$ = Left$(lname$,1)
rest$ = Mid$(lname$,2,Len(lname$))
lname$ = fl$ & LCase$(rest$)
MsgBox "The converted name is: " & lname$
End Sub
Platform(s)
All.
See Also
Right, Right$ (functions)
Len (function)
Syntax
Len(expression)
Description
If expression evaluates to a string, then Len returns the number of characters in a
given string or 0 if the string is empty. When used with a Variant variable, the
length of the variant when converted to a String is returned. If expression is a Null,
then Len returns a Null variant.
If used with a non-String or non-Variant variable, the function returns the number
of bytes occupied by that data element.
When used with user-defined data types, the function returns the combined size
of each member within the structure. Since variable-length strings are stored
elsewhere, the size of each variable-length string within a structure is 2 bytes.
The following table describes the sizes of the individual data elements:
Integer 2 bytes.
Long 4 bytes.
Float 4 bytes.
Double 8 bytes.
Currency 8 bytes.
The Len function always returns 0 with object variables or any data object variable.
Examples
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
'This example shows the Len function used in a routine to change
'uppercase names to lowercase with an uppercase first letter.
lname$ = "WILLIAMS"
fl$ = Left$(lname$,1)
ln% = Len(lname$)
rest$ = Mid$(lname$,2,ln%)
lname$ = fl$ & LCase$(rest$)
MsgBox "The converted name is: " & lname$
Dim lns(4)
a% = 100 : b& = 200 : c! = 200.22 : d# = 300.22
lns(1) = Len(a%)
lns(2) = Len(b&)
lns(3) = Len(c!)
lns(4) = Len(d#)
msg = "Lengths of standard types:" & crlf
msg = msg & "Integer: " & lns(1) & crlf
msg = msg & "Long: " & lns(2) & crlf
msg = msg & "Single: " & lns(3) & crlf
msg = msg & "Double: " & lns(4) & crlf
MsgBox msg
End Sub
Platform(s)
All.
See Also
InStr (function)
Let (statement)
Syntax
[Let] variable = expression
Description
The use of the word Let is supported for compatibility with other implementations
of Docbasic. Normally, this word is dropped.
Example
Sub Main()
Let a$ = "This is a string."
Let b% = 100
Let c# = 1213.3443
End Sub
Platform(s)
All.
See Also
= (keyword)
Expression Evaluation (topic)
Like (operator)
Compares two strings and returns True if the expression matches the given pattern;
returns False otherwise.
Syntax
expression Like pattern
Description
Case sensitivity is controlled by the Option Compare setting.
The pattern can contain special characters that allow more flexible matching:
Table 3-54 Special Characters for Use with the Like Operator
Character Evaluates To
[!range] Matches if the character in question is not within the specified range.
If expression or pattern is not a string, then both are converted to String variants and
compared, returning a Boolean variant. If either variant is Null, then Null is
returned.
Example
This example demonstrates various uses of the Like function.
Sub Main()
a$ = "This is a string variable of 123456 characters"
b$ = "123.45"
If a$ Like "[A-Z][g-i]*" Then MsgBox "The first comparison is True."
If b$ Like "##3.##" Then MsgBox "The second comparison is True."
If a$ Like "*variable*" Then MsgBox "The third comparison is True."
End Sub
Platform(s)
All.
See Also
Operator Precedence (topic)
Is (operator)
Option Compare (statement)
Syntax
Line Input [#]filenumber,variable
Description
The filenumber parameter is a number that is used by Docbasic to refer to the open
filethe number passed to the Open statement. The file number must reference a
file opened in Input mode.
The file is read up to the next end-of-line, but the end-of-line character(s) is (are)
not returned in the string. The file pointer is positioned after the terminating end-
of-line.
The variable parameter is any string or variant variable reference. This statement
will automatically declare the variable if the specified variable has not yet been
used or dimensioned.
Example
This example reads five lines of the autoexec.bat file and displays them in a dialog
box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Open "c:\autoexec.bat" For Input As #1
For x = 1 To 5
Line Input #1,lin$
msg = msg & lin$ & crlf
Next x
MsgBox "The first 5 lines of your autoexec.bat are:" & crlf & Msg
End Sub
Platform(s)
All.
See Also
Open (statement)
Get (statement)
Input# (statement)
Input, Input$ (functions)
As an alternative to line numbers, you can use meaningful labels as targets for
absolute jumps, as shown below:
Sub Main()
Dim i As Integer
On Error Goto MyErrorTrap
i = 0
LoopTop:
i = i + 1
If i < 10 Then Goto LoopTop
MyErrorTrap:
MsgBox "An error occurred."
End Sub
Line$ (function)
Returns a String containing a single line or a group of lines between first and last.
Syntax
Line$(text$,first[,last])
Description
Lines are delimited by carriage return, line feed, or carriage-return/line-feed pairs.
text$ String containing the text from which the lines will be
extracted.
Example
This example reads five lines of the autoexec.bat file, extracts the third and fourth
lines with the Line$ function, and displays them in a dialog box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Open "c:\autoexec.bat" For Input As #1
For x = 1 To 5
Line Input #1,lin$
txt = txt & lin$ & crlf
Next x
lines$ = Line$(txt,3,4)
MsgBox lines$
End Sub
Platform(s)
All.
See Also
Item$ (function)
ItemCount (function)
LineCount (function)
Word$ (function)
WordCount (function)
LineCount (function)
Syntax
LineCount(text$)
Description
Lines are delimited by carriage return, line feed, or both.
Example
This example reads the first ten lines of your autoexec.bat file, uses the LineCount
function to determine the number of lines, and then displays them in a message
box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
x = 1
Open "c:\autoexec.bat" For Input As #1
While (x < 10) And Not EOF(1)
Line Input #1,lin$
txt = txt & lin$ & crlf
x = x + 1
Wend
lines! = LineCount(txt)
MsgBox "The number of lines in txt is: " & lines! & crlf & crlf & txt
End Sub
Platform(s)
All.
See Also
Item$ (function)
ItemCount (function)
Line$ (function)
Word$ (function)
WordCount (function)
Literals (topic)
Literals are values of a specific type. The following table shows the different types
of literals supported by Docbasic:
Literal Description
5# Double whose value is 5.0. A number's type can be explicitly set using any
of the following type-declaration characters:
% Integer
& Long
# Double
! Single
5.5 Double whose value is 5.5. Any number with decimal point is considered
a double.
#1/1/1994# Date value whose internal representation is 34335.0. Any valid date can
appear with #'s. Date literals are interpreted at execution time using the
locale settings of the host environment. To ensure that date literals are
correctly interpreted for all locales, use the international date format:
#YYYY-MM-DD HH:MM:SS#
Constant Folding
Docbasic supports constant folding where constant expressions are calculated by
the compiler at compile time. For example, the expression
i% = 10 + 12
Loc (function)
Returns a Long representing the position of the file pointer in the given file.
Syntax
Loc(filenumber)
Description
The filenumber parameter is an Integer used by Docbasic to refer to the number
passed by the Open statement to Docbasic.
The Loc function returns different values depending on the mode in which the file
was opened:
Example
This example reads 5 lines of the autoexec.bat file, determines the current location
of the file pointer, and displays it in a dialog box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Open "c:\autoexec.bat" For Input As #1
For x = 1 To 5
If Not EOF(1) Then Line Input #1,lin$
Next x
lc% = Loc(1)
Close
MsgBox "The file location is: " & lc%
End Sub
Platform(s)
All.
See Also
Seek (function)
Seek (statement)
FileLen (function)
Lock (statement)
Locks a section of the specified file, preventing other processes from accessing that
section of the file until the Unlock statement is issued.
Syntax
Lock [#] filenumber [,{record | [start] To end}]
Description
The Lock statement requires the following parameters:
For sequential files, the record, start, and end parameters are ignored. The entire file
is locked.
Syntax Description
record Locks the specified record number (for Random files) or byte (for Binary
files).
to end Locks from the beginning of the file to the specified record (for Random
files) or byte (for Binary files).
start to end Locks the specified range of records (for Random files) or bytes (for Binary
files).
The lock range must be the same as that used to subsequently unlock the file range,
and all locked ranges must be unlocked before the file is closed. Ranges within files
are not unlocked automatically by Docbasic when your procedure terminates,
which can cause file access problems for other processes. It is a good idea to group
the Lock and Unlock statements close together in the code, both for readability and
so subsequent readers can see that the lock and unlock are performed on the same
range. This practice also reduces errors in file locks.
Example
This example creates test.dat and fills it with ten string variable records. These are
displayed in a dialog box. The file is then reopened for read/write, and each record
is locked, modified, rewritten, and unlocked. The new records are then displayed
in a dialog box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
a$ = "This is record number: "
b$ = "0"
rec$ = ""
msg = ""
Open "test.dat" For Random Access Write Shared As #1
For x = 1 To 10
rec$ = a$ & x
Lock #1,x
Put #1,,rec$
Unlock #1,x
msg = msg & rec$ & crlf
Next x
Close
MsgBox "The records are:" & crlf & msg
msg = ""
Open "test.dat" For Random Access Read Write Shared As #1
For x = 1 To 10
rec$ = Mid$(rec$,1,23) & (11 - x)
Lock #1,x
Put #1,x,rec$
Unlock #1,x
msg = msg & rec$ & crlf
Next x
MsgBox "The records are: " & crlf & msg
Close
Kill "test.dat"
End Sub
Platform(s)
All.
See Also
Unlock (statement)
Open (statement)
Lof (function)
Syntax
Lof(filenumber)
Description
The filenumber parameter is an Integer used by Docbasic to refer to the open
filethe number passed to the Open statement.
This example creates a test file, writes ten records into it, then finds the length of
the file and displays it in a message box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
a$ = "This is record number: "
Platform(s)
All.
See Also
Loc (function)
Open (statement)
FileLen (function)
Log (function)
Syntax
Log(number)
Description
The value of number must be a Double greater than 0.
Example
This example calculates the natural log of 100 and displays it in a message box.
Sub Main()
x# = Log(100)
MsgBox "The natural logarithm of 100 is: " & x#
End Sub
Platform(s)
All.
See Also
Exp (function)
Syntax
Long
Description
Long variables are used to hold numbers (with up to ten digits of precision) within
the following range:
Internally, longs are 4-byte values. Thus, when appearing within a structure, longs
require 4 bytes of storage. When used with binary or random files, 4 bytes of
storage are required.
Platform(s)
All.
See Also
Currency (data type)
Date (data type)
Double (data type)
Integer (data type)
Object (data type)
Single (data type)
String (data type)
Variant (data type)
Boolean (data type)
DefType (statement)
CLng (function)
LSet (statement)
Left-aligns the source string in the destination string or copies one user-defined
type to another.
Syntax 1
LSet dest = source
Syntax 2
LSet dest_variable = source_variable
Description
Syntax 1
The LSet statement copies the source string source into the destination string dest.
The dest parameter must be the name of either a String or Variant variable. The
source parameter is any expression convertible to a string.
If source is shorter than dest, then the string is left-aligned within dest, and the
remaining characters are padded with spaces. If source is longer than dest, then
source is truncated, copying only the leftmost number of characters that will fit in
dest.
Syntax 2
The source structure is copied byte for byte into the destination structure. This is
useful for copying structures of different types. Only the number of bytes of the
smaller of the two structures is copied. Neither the source structure nor the
destination structure can contain strings.
Example
This example replaces a 40-character string of asterisks (*) with an RSet and LSet
string and then displays the result.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Platform(s)
All.
See Also
RSet (statement)
Syntax
LTrim[$](text)
Description
LTrim$ returns a String, whereas LTrim returns a String variant.
Example
This example displays a right-justified string and its LTrim result.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
a$ = " <= This is a right-justified string"
b$ = LTrim$(a$)
MsgBox a$ & crlf & b$
End Sub
Platform(s)
All.
See Also
RTrim, RTrim$ (functions)
Trim, Trim$ (functions)
MacID (function)
Syntax
MacID(text$)
Description
Since this platform does not support wildcards (i.e., * or ?), this function is the only
way to specify a group of files. This function can only be used with the following
statements:
Dir$
Kill
Shell
The text$ parameter is a four-character string containing a file type, a resource type,
an application signature, or an Apple event. A runtime error occurs if the MacID
function is used on platforms other than the Macintosh.
Example
This example retrieves the names of all the text files.
Sub Main()
s$ = Dir$(MacID("TEXT"))'Get the first text file.
While s$ <> ""
MsgBox s$ 'Display it.
s$ = Dir$ 'Get the next text file in the list.
Wend
Platform(s)
Macintosh.
See Also
Kill (statement)
Dir, Dir$ (functions)
Shell (function)
MacScript (statement)
Syntax
MacScript script$
Description
When using the MacScript statement, you can separate multiple lines by
embedding carriage returns:
MacScript "Beep" + Chr(13) + "Display Dialog ""Hello"""
If embedding carriage returns proves cumbersome, you can use the Inline
statement. The following Inline statement is equivalent to the above example:
Inline MacScript
Beep
Display Dialog "Hello"
End Inline
Example
Sub Main()
MacScript "display dialog ""AppleScript"""
End Sub
Platform(s)
Macintosh.
See Also
Inline (statement)
Main (statement)
Syntax
Sub Main()
End Sub
Example
Sub Main()
MsgBox "This is the Main() subroutine and entry point."
End Sub
Platform(s)
All.
Mci (function)
Syntax
Mci(command$,result$ [,error$])
Description
The Mci function takes the following parameters:
Example
This first example plays a wave file. The wave file is played to completion before
execution can continue.
Sub Main()
Dim result As String
Dim ErrorMessage As String
Dim Filename As String
Dim rc As Integer
End If
Example
This next example shows how to query an Mci device and play an MIDI file in
the background.
Sub Main()
Dim result As String
Dim ErrMsg As String
Dim Filename As String
Dim rc As Integer
'Can it play?
If result <> "true" Then
MsgBox "MIDI device is not capable of playing."
Exit Sub
End If
Platform(s)
Windows.
See Also
Beep (statement)
Returns a substring of the specified string, beginning with start, for length
characters.
Syntax
Mid[$](text,start [,length])
Description
The returned substring starts at character position start and will be length
characters long.
Example
This example displays a substring from the middle of a string variable using the
Mid$ function and replaces the first four characters with "NEW " using the Mid$
statement.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
a$ = "This is the Main string containing text."
b$ = Mid$(a$,13,Len(a$))
Mid$ (b$,1)= "NEW "
MsgBox a$ & crlf & b$
End Sub
Platform(s)
All.
See Also
InStr (function)
Option Compare (statement)
Mid, Mid$ (statements)
Syntax
Mid[$](variable,start[,length]) = newvalue
Description
The Mid/Mid$ statements take the following parameters:
The resultant string is never longer than the original length of variable.
With Mid, variable must be a Variant variable convertible to a String, and newvalue
is any expression convertible to a string. A runtime error is generated if either
variant is Null.
Example
This example displays a substring from the middle of a string variable using the
Mid$ function, replacing the first four characters with "NEW " using the Mid$
statement.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
a$ = "This is the Main string containing text."
b$ = Mid$(a$,13,Len(a$))
Mid$(b$,1) = "NEW "
MsgBox a$ & crlf & b$
End Sub
Platform(s)
All.
See Also
Mid, Mid$ (functions)
Option Compare (statement)
Minute (function)
Syntax
Minute(time)
Description
The value returned is as an Integer between 0 and 59 inclusive.
Example
This example takes the current time; extracts the hour, minute, and second; and
displays them as the current time.
Sub Main()
xt# = TimeValue(Time$())
xh# = Hour(xt#)
xm# = Minute(xt#)
xs# = Second(xt#)
MsgBox "The current time is: " & xh# & ":" & xm# & ":" & xs#
End Sub
Platform(s)
All.
See Also
Day (function)
Second (function)
Month (function)
Year (function)
Hour (function)
Weekday (function)
DatePart (function)
MIRR (function)
Returns a Double representing the modified internal rate of return for a series of
periodic payments and receipts.
Syntax
MIRR(ValueArray(),FinanceRate,ReinvestRate)
Description
The modified internal rate of return is the equivalent rate of return on an
investment in which payments and receipts are financed at different rates. The
interest cost of investment and the rate of interest received on the returns on
investment are both factors in the calculations.
To return the correct value, be sure to order your payments and receipts in the
correct sequence.
Example
This example illustrates the purchase of a lemonade stand for $800 financed with
money borrowed at 10%. The returns are estimated to accelerate as the stand gains
popularity. The proceeds are placed in a bank at 9 percent interest. The incomes are
estimated (generated) over 12 months. This program first generates the income
stream array in two For...Next loops, and then the modified internal rate of return
is calculated and displayed. Notice that the annual rates are normalized to
monthly rates by dividing them by 12.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Dim valu#(12)
valu(1) = -800 'Initial investment
msg = valu(1) & ", "
For x = 2 To 5
valu(x) = 100 + (x * 2)'Incomes months 2-5
msg = msg & valu(x) & ", "
Next x
For x = 6 To 12
valu(x) = 100 + (x * 10)'Incomes months 6-12
msg = msg & valu(x) & ", "
Next x
retrn# = MIRR(valu,.1/12,.09/12)'Note: normalized annual rates
msg = "The values: " & crlf & msg & crlf & crlf
MsgBox msg & "Modified rate: " & Format(retrn#,"Percent")
End Sub
Platform(s)
All.
See Also
Fv (function)
IRR (function)
Npv (function)
Pv (function)
MkDir (statement)
Syntax
MkDir dir$
Example
This example creates a new directory on the default drive. If this causes an error,
then the error is displayed and the program 'terminates. If no error is generated,
the directory is removed with 'the RmDir statement.
Sub Main()
On Error Resume Next
MkDir "TestDir"
If Err <> 0 Then
MsgBox "The following error occurred: " & Error(Err)
Else
MsgBox "Directory was created and is about to be removed."
RmDir "TestDir"
End If
End Sub
Platform(s)
All.
See Also
ChDir (statement)
ChDrive (statement)
CurDir, CurDir$ (functions)
Dir, Dir$ (functions)
RmDir (statement)
Mod (operator)
Syntax
expression1 Mod expression2
Description
If both expressions are integers, then the result is an integer. Otherwise, each
expression is converted to a Long before performing the operation, returning a
Long.
Example
This example uses the Mod operator to determine the value of a randomly selected
card where card 1 is the ace (1) of clubs and card 52 is the king (13) of spades. Since
the values recur in a sequence of 13 cards within 4 suits, we can use the Mod
function to determine the value of any given card number.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
cval$ =
"ACE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING"
Randomize
card% = Random(1,52)
value = card% Mod 13
If value = 0 Then value = 13
CardNum$ = Item$(cval,value)
If card% < 53 Then suit$ = "spades"
If card% < 40 Then suit$ = "hearts"
If card% < 27 Then suit$ = "diamonds"
If card% < 14 Then suit$ = "clubs"
msg = "Card number " & card% & " is the "
msg = msg & CardNum & " of " & suit$
MsgBox msg
End Sub
Platform(s)
All.
See Also
/ (operator)
\ (operator)
Month (function)
Syntax
Month(date)
Description
The value returned is as an Integer between 1 and 12 inclusive.
Example
This example returns the current month in a dialog box.
Sub Main()
mons$ = "Jan., Feb., Mar., Apr., May, Jun., Jul., Aug., Sep., Oct., Nov.,
Dec."
tdate$ = Date$
tmonth! = Month(DateValue(tdate$))
MsgBox "The current month is: " & Item$(mons$,tmonth!)
End Sub
Platform(s)
All.
See Also
Day (function)
Minute (function)
Second (function)
Year (function)
Hour (function)
Weekday (function)
DatePart (function)
MsgBox (function)
Syntax
MsgBox(msg)
Description
The MsgBox function takes the following parameters:
The width and height of the dialog box are sized to hold
the entire contents of msg.
The msg parameter can contain end-of-line characters, forcing the text that follows
to start on a new line. The following example shows how to display a string on two
lines:
MsgBox "This is on" + Chr(13) + Chr(10) + "two lines."
Example
This example displays a message.
r = MsgBox("Hello, World")
Platform(s)
Windows, Win32, Macintosh.
Platform Notes:
The appearance of the MsgBox dialog box and its icons differs slightly depending
on the platform.
See Also
MsgBox (statement)
MsgBox (statement)
This command is the same as the MsgBox function, except that the statement form
does not return a value. See MsgBox (function).
Syntax
MsgBox msg
Example
Sub Main()
MsgBox "This is text displayed in a message box."'Display text.
MsgBox "The result is: " & (10 * 45)'Display a number.
End Sub
Platform(s)
Windows, Win32, Macintosh.
See Also
MsgBox (function)
Name (statement)
Renames a file.
Syntax
Name oldfile$ As newfile$
Description
Each parameter must specify a single filename. Wildcard characters such as * and
? are not allowed.
Some platforms allow naming of files to different directories on the same physical
disk volume. For example, the following rename will work under Windows:
Name "c:\samples\mydoc.txt" As "c:\backup\doc\mydoc.bak"
You cannot rename files across physical disk volumes. For example, the following
will error under Windows:
Name "c:\samples\mydoc.txt" As "a:\mydoc.bak"'This will error!
To rename a file to a different physical disk, you must first copy the file, then erase
the original:
FileCopy "c:\samples\mydoc.txt","a:\mydoc.bak"'Make a copy
Kill "c:\samples\mydoc.txt"'Delete the original
Example
This example creates a file called test.dat and then renames it to test2.dat.
Sub Main()
On Error Resume Next
If FileExists("test.dat") Then
Name "test.dat" As "test2.dat"
If Err <> 0 Then
msg = "File exists and cannot be renamed! Error: " & Err
Else
msg = "File exists and renamed to test2.dat."
End If
Else
Open "test.dat" For Output As #1
Close
Name "test.dat" As "test2.dat"
If Err <> 0 Then
msg = "File created but not renamed! Error: " & Err
Else
msg = "File created and renamed to test2.dat."
End If
End If
MsgBox msg
End Sub
Platform(s)
All.
See Also
Kill (statement)
FileCopy (statement)
New (keyword)
Creates a new instance of the specified object type, assigning it to the specified
object variable.
Syntax 1
Dim ObjectVariable As New ObjectType
Syntax 2
Set ObjectVariable = New ObjectType
Description
The New keyword is used to declare a new instance of the specified data object.
This keyword can only be used with data object types.
At runtime, the application or extension that defines that object type is notified that
a new object is being defined. The application responds by creating a new physical
object (within the appropriate context) and returning a reference to that object,
which is immediately assigned to the variable being declared.
When that variable goes out of scope (i.e., the Sub or Function procedure in which
the variable is declared ends), the application is notified. The application then
performs some appropriate action, such as destroying the physical object.
Platform(s)
All.
See Also
Dim (statement)
Set (statement)
Not (operator)
Syntax
Not expression
Description
The result is determined as shown in the following table:
True False
False True
Null Null
Example
This example demonstrates the use of the Not operator in comparing logical
expressions and for switching a True/False toggle variable.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
a = False
b = True
If (Not a and b) Then msg = "a = False, b = True" & crlf
toggle% = True
msg = msg & "toggle% is now " & Format(toggle%,"True/False") & crlf
toggle% = Not toggle%
msg = msg & "toggle% is now " & Format(toggle%,"True/False") & crlf
toggle% = Not toggle%
msg = msg & "toggle% is now " & Format(toggle%,"True/False")
MsgBox msg
End Sub
Platform(s)
All.
See Also
Boolean (data type)
Comparison Operators (topic)
Nothing (constant)
Syntax
Nothing
Example
Sub Main()
Dim a As Object
If a Is Nothing Then
MsgBox "The object variable references no object."
Else
MsgBox "The object variable references: " & a.Value
End If
End Sub
Platform(s)
All.
See Also
Set (statement)
Object (data type)
Now (function)
Syntax
Now[()]
Example
This example shows how the Now function can be used as an elapsed-time
counter.
Sub Main()
t1# = Now()
MsgBox "Wait a while and click OK."
t2# = Now()
t3# = Second(t2#) - Second(t1#)
MsgBox "Elapsed time was: " & t3# & " seconds."
End Sub
Platform(s)
All.
See Also
Date, Date$ (functions)
Time, Time$ (functions)
NPer (function)
Returns the number of periods for an annuity based on periodic fixed payments
and a constant rate of interest.
Syntax
NPer(Rate,Pmt,Pv,Fv,Due)
Description
An annuity is a series of fixed payments paid to or received from an investment
over a period of time. Examples of annuities are mortgages, retirement plans,
monthly savings plans, and term loans.
Example
This example calculates the number of $100.00 monthly payments necessary to
accumulate $10,000.00 at an annual rate of 10%. Payments are made at the
beginning of the month.
Sub Main()
ag# = NPer((.10/12),100,0,10000,1)
MsgBox "The number of monthly periods is: " & Format(ag#,"Standard")
End Sub
Platform(s)
All.
See Also
IPmt (function)
Pmt (function)
PPmt (function)
Rate (function)
Npv (function)
Returns the net present value of an annuity based on periodic payments and
receipts, and a discount rate.
Syntax
Npv(Rate,ValueArray())
Description
The Npv function requires the following parameters:
Rate Double that represents the interest rate over the length of
the period. If the values are monthly, annual rates must be
divided by 12 to normalize them to monthly rates.
For accurate results, be sure to enter your payments and receipts in the correct
order because Npv uses the order of the array values to interpret the order of the
payments and receipts.
If your first cash flow occurs at the beginning of the first period, that value must
be added to the return value of the Npv function. It should not be included in the
array of cash flows.
Npv differs from the Pv function in that the payments are due at the end of the
period and the cash flows are variable. Pv's cash flows are constant, and payment
may be made at either the beginning or end of the period.
Example
This example illustrates the purchase of a lemonade stand for $800 financed with
money borrowed at 10%. The returns are estimated to accelerate as the stand gains
popularity. The incomes are estimated (generated) over 12 months. This program
first generates the income stream array in two For...Next loops, and then the net
present value (Npv) is calculated and displayed. Note normalization of the annual
10% rate.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Dim valu#(12)
valu(1) = -800 'Initial investment
msg = valu(1) & ", "
For x = 2 To 5 'Months 2-5
valu(x) = 100 + (x * 2)
msg = msg & valu(x) & ", "
Next x
For x = 6 To 12 'Months 6-12
valu(x) = 100 + (x * 10)'Accelerated income
msg = msg & valu(x) & ", "
Next x
NetVal# = NPV((.10/12),valu)
msg = "The values:" & crlf & msg & crlf & crlf
MsgBox msg & "Net present value: " & Format(NetVal#,"Currency")
End Sub
Platform(s)
All.
See Also
Fv (function)
IRR (function)
MIRR (function)
Pv (function)
Null (constant)
Syntax
Null
Description
The Null value has special meaning indicating that a variable contains no data.
Most numeric operators return Null when either of the arguments is Null. This
"propagation" of Null makes it especially useful for returning error values through
a complex expression. For example, you can write functions that return Null when
an error occurs, then call this function within an expression. You can then use the
IsNull function to test the final result to see whether an error occurred during
calculation.
Since variants are Empty by default, the only way for Null to appear within a
variant is for you to explicitly place it there. Only a few Docbasic functions return
this value.
Example
Sub Main()
Dim a As Variant
a = Null
If IsNull(a) Then MsgBox "The variable is Null."
MsgBox "The VarType of a is: " & VarType(a)'Should display 1.
End Sub
Platform(s)
All.
Syntax
Object
Description
The Object type is used to declare variables that reference objects within an
application using OLE automation.
Each object is a 4-byte (32-bit) value that references the object internally. The value
0 (or Nothing) indicates that the variable does not reference a valid object, as is the
case when the object has not yet been given a value. Accessing properties or
methods of such Object variables generates a runtime error.
Using Objects
Object variables are declared using the Dim, Public, or Private statement:
Dim MyApp As Object
Object variables can be assigned values (thereby referencing a real physical object)
using the Set statement:
Set MyApp = CreateObject("phantom.application")
Set MyApp = Nothing
Methods of an Object are also accessed using the dot (.) separator:
MyApp.Open "sample.txt"
isSuccess = MyApp.Save("new.txt",15)
Automatic Destruction
Docbasic keeps track of the number of variables that reference a given object so that
the object can be destroyed when there are no longer any references to it:
Sub Main() 'Number of references to object
Dim a As Object '0
Dim b As Object '0
Set a = CreateObject("phantom.application)'1
Set b = a '2
Platform(s)
Windows, Win32, Macintosh.
See Also
Boolean (data type)
Currency (data type)
Date (data type)
Double (data type)
Integer (data type)
Long (data type)
Single (data type)
String (data type)
Variant (data type)
DefType (statement)
Objects (topic)
Docbasic defines two types of objects: data objects and OLE automation objects.
What Is an Object
An object in Docbasic is an encapsulation of data and routines into a single unit.
The use of objects in Docbasic has the effect of grouping together a set of functions
and data items that apply only to a specific object type.
Objects expose data items for programmability called properties. For example, a
sheet object may expose an integer called NumColumns. Usually, properties can be
both retrieved (get) and modified (set).
Initially, objects are given the value 0 (or Nothing). Before an object can be
accessed, it must be associated with a physical object.
i% = MyApp.DocumentCount
Object methods that return a value behave like function calls in Docbasic. Any
arguments must be enclosed in parentheses:
If MyApp.DocumentCount = 0 Then MsgBox "No open documents."
NumDocs = app.count(4,5)
Objects can be compared to each other to determine whether they refer to the same
object.
Objects can be compared with Nothing to determine whether the object variable
refers to a valid object.
Collections
A collection is a set of related object variables. Each element in the set is called a
member and is accessed via an index, either numeric or text, as shown below:
MyApp.Toolbar.Buttons(0)
MyApp.Toolbar.Buttons("Tuesday")
The collection itself contains properties that provide you with information about
the collection and methods that allow navigation within that collection:
Dim MyToolbarButton As Object
NumButtons% = MyApp.Toolbar.Buttons.Count
MyApp.Toolbar.Buttons.MoveNext
MyApp.Toolbar.Buttons.FindNext "Save"
For i = 1 To MyApp.Toolbar.Buttons.Count
Set MyToolbarButton = MyApp.Toolbar.Buttons(i)
MyToolbarButton.Caption = "Copy"
Next i
Predefined Objects
Docbasic predefines a few objects for use in all procedures. These are:
Clipboard
Basic
Syntax
Oct[$](number)
Description
Oct$ returns a String, whereas Oct returns a String variant.
The returned string contains only the number of octal digits necessary to represent
the number.
The number parameter is any numeric expression. If this parameter is Null, then
Null is returned. Empty is treated as 0. The number parameter is rounded to the
nearest whole number before converting to the octal equivalent.
Example
This example displays the octal equivalent of several numbers.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
st$ = "The octal values are: " & crlf
For x = 1 To 5
y% = x * 10
st$ = st$ & y% & " : " & Oct$(y%) & crlf
Next x
MsgBox st$
End Sub
Platform(s)
All.
See Also
Hex, Hex$ (functions)
On Error (statement)
Syntax
On Error {Goto label | Resume Next | Goto 0}
Description
The form On Error Goto label causes execution to transfer to the specified label
when a runtime error occurs.
The form On Error Resume Next causes execution to continue on the line following
the line that caused the error.
The form On Error Goto 0 causes any existing error trap to be removed.
If an error trap is in effect when the procedure ends, then an error will be
generated.
An error trap is only active within the subroutine or function in which it appears.
Once an error trap has gained control, appropriate action should be taken, and
then control should be resumed using the Resume statement. The Resume
statement resets the error handler and continues execution. If a procedure ends
while an error is pending, then an error will be generated. (The Exit Sub or Exit
Function statement also resets the error handler, allowing a procedure to end
without displaying an error message.)
If an error occurs within the error handler, then the error handler of the caller (or
any procedure in the call stack) will be invoked. If there is no such error handler,
then the error is fatal, causing the procedure to stop executing. The following
statements reset the error state (i.e., these statements turn off the fact that an error
occurred):
Resume
Err=-1
The Resume statement forces execution to continue either on the same line or on
the line following the line that generated the error. The Err=-1 statement allows
explicit resetting of the error state so that the procedure can continue normal
execution without resuming at the statement that caused the error condition.
The On Error statement will not reset the error. Thus, if an On Error statement
occurs within an error handler, it has the effect of changing the location of a new
error handler for any new errors that may occur once the error has been reset.
Example
This example will demonstrate three types of error handling. The first case simply
by-passes an expected error and continues with program operation. The second
case creates an error branch that jumps to a common error handling routine that
processes incoming errors, clears the error (with the Resume statement) and
'resumes program execution. The third case clears all internal error 'handling so
that execution will stop when the next error is 'encountered.
Sub Main()
Dim x%
a = 10000
b = 10000
Pass:
Err = -1 'Clear error status.
MsgBox "Cleared error status and continued."
Resume Next
End Sub
Platform(s)
All.
See Also
Error Handling (topic)
Error (statement)
Resume (statement)
Open (statement)
Opens a file.
Syntax
Open filename$ [For mode] [Access accessmode] [lock] As [#] filenumber _
[Len = reclen]
Description
The filename$ parameter is a string expression that contains a valid filename.
The filenumber parameter is a number between 1 and 255. The FreeFile function can
be used to determine an available file number.
The mode parameter determines the type of operations that can be performed on
that file:
Mode Operations
Input Opens an existing file for sequential input (filename$ must exist). The value
of accessmode, if specified, must be Read.
Output Opens an existing file for sequential output, truncating its length to zero,
or creates a new file. The value of accessmode, if specified, must be Write.
Append Opens an existing file for sequential output, positioning the file pointer at
the end of the file, or creates a new file. The value of accessmode, if
specified, must be Read Write.
Binary Opens an existing file for binary I/O or creates a new file. Existing binary
files are never truncated in length. The value of accessmode, if specified,
determines how the file can subsequently be accessed.
Read Opens the file for reading only. This value is valid only for files opened in
Binary, Random, or Input mode.
Write Opens the file for writing only. This value is valid only for files opened in
Binary, Random, or Output mode.
Read Write Opens the file for both reading and writing. This value is valid only for
files opened in Binary, Random, or Append mode.
If the accessmode parameter is not specified, the following defaults are used:
Input Read
Output Write
Binary When the file is initially opened, access is attempted three times in the
following order:
1.Read Write
2.Write
3.Read
The lock parameter determines what access rights are granted to other processes
that attempt to open the same file. The following table describes the values for lock:
Shared Another process can both read this file and write to it. (Deny none.)
Lock Read Another process can write to this file but not read it. (Deny read.)
Lock Write Another process can read this file but not write to it. (Deny write.)
Lock Read Write Another process is prevented both from reading this file and from writing
to it. (Exclusive.)
If the file does not exist and the lock parameter is specified, the file is opened
twiceonce to create the file and again to establish the correct sharing mode.
Files opened in Random mode are divided up into a sequence of records, each of
the length specified by the reclen parameter. If this parameter is missing, then 128
is used. For files opened for sequential I/O, the reclen parameter specifies the size
of the internal buffer used by Docbasic when performing I/O. Larger buffers mean
faster file access. For Binary files, the reclen parameter is ignored.
Example
This example opens several files in various configurations.
Sub Main()
Open "test.dat" For Output Access Write Lock Write As #2
Close
Open "test.dat" For Input Access Read Shared As #1
Close
Open "test.dat" For Append Access Write Lock Read Write as #3
Close
Open "test.dat" For Binary Access Read Write Shared As #4
Close
Open "test.dat" For Random Access Read Write Lock Read As #5
Close
Open "test.dat" For Input Access Read Shared As #6
Close
Kill "test.dat"
End Sub
Platform(s)
All.
See Also
Close (statement)
Reset (statement)
FreeFile (function)
OpenFilename$ (function)
Displays a dialog box that prompts the user to select from a list of files, returning
the full pathname of the file the user selects or a zero-length string if the user selects
Cancel.
Syntax
OpenFilename$[([title$ [,extensions$]])]
Description
This function displays the standard file open dialog box, which allows the user to
select a file. It takes the following parameters:
title$ String specifying the title that appears in the dialog box's
title bar. If this parameter is omitted, then "Open" is used.
extension$ String specifying the available file types. The format for
this string depends on the platform on which Docbasic is
running. If this parameter is omitted, then all files are
displayed.
e$ = "All Files:*.BMP,*.WMF;Bitmaps:*.BMP;Metafiles:*.WMF"
f$ = OpenFilename$("Open Picture",e$)
Example
This example asks the user for the name of a file, then proceeds to read the first line
from that file.
Sub Main
Dim f As String,s As String
f$ = OpenFilename$("Open Picture","Text Files:*.TXT")
If f$ <> "" Then
Open f$ For Input As #1
Line Input #1,s$
Close #1
MsgBox "First line from " & f$ & " is " & s$
End If
End Sub
Platform(s)
Windows, Win32, Macintosh.
type Specifies the name of the grouping of files, such as All Files.
See Also
MsgBox (statement)
The following table shows the precedence of the operators supported by Docbasic.
Operations involving operators of higher precedence occur before operations
involving operators of lower precedence. When operators of equal precedence
occur together, they are evaluated from left to right.
() Parentheses Highest
^ Exponentiation
- Unary minus
\ Integer division
Mod Modulo
=,<>,>,<,<=,>= Relational
a = (4 + 3) * 2a becomes 14.
When numeric, binary, logical or comparison operators are used, the data type of
the result is generally the same as the data type of the more precise operand. For
example, adding an Integer and a Long first converts the Integer operand to a
Long, then preforms a long addition, overflowing only if the result cannot be
contained with a Long. The order of precision is shown in the following table:
Boolean
Integer
Long
Single
Date
Double
The rules for operand conversion are further complicated when an operator is used
with variant data. In many cases, an overflow causes automatic promotion of the
result to the next highest precise data type. For example, adding two Integer
variants results in an Integer variant unless it overflows, in which case the result is
automatically promoted to a Long variant.
Syntax
Option Base {0 | 1}
Description
By default, the lower bound used for all array declarations is 0.
Example
Option Base 1
Sub Main()
Dim a(10) 'Contains 10 elements (not 11).
End Sub
Platform(s)
All.
See Also
Dim (statement)
Public (statement)
Private (statement)
Syntax
Option Compare [Binary | Text]
Description
When Option Compare is set to Binary, then string comparisons are case-sensitive
(e.g., "A" does not equal "a"). When it is set to Text, string comparisons are case-
insensitive (e.g., "A" is equal to "a").
The Option Compare statement affects all string comparisons in any statements
that follow the Option Compare statement. Additionally, the setting affects the
default behavior of Instr, StrComp, and the Like operator. The following types of
string comparisons are affected by this setting:
StrComp Like
The Option Compare statement must appear outside the scope of all subroutines
and functions. In other words, it cannot appear within a Sub or Function block.
Example
This example shows the use of Option Compare.
Option Compare Binary
Sub CompareBinary
a$ = "This String Contains UPPERCASE."
b$ = "this string contains uppercase."
If a$ = b$ Then
MsgBox "The two strings were compared case-insensitive."
Else
MsgBox "The two strings were compared case-sensitive."
End If
End Sub
If a$ = b$ Then
MsgBox "The two strings were compared case-insensitive."
Else
MsgBox "The two strings were compared case-sensitive."
End If
End Sub
Sub Main()
CompareBinary 'Calls subroutine above.
CompareText 'Calls subroutine above.
End Sub
Platform(s)
All.
See Also
Like (operator)
InStr (function)
StrComp (function)
Comparison Operators (topic)
Turns on or off the ability to use C-style escape sequences within strings.
Syntax
Option CStrings {On | Off}
Description
When Option CStrings On is in effect, the compiler treats the backslash character
as an escape character when it appears within strings. An escape character is
simply a special character that cannot otherwise be ordinarily typed by the
computer keyboard.
\a Bell Char$(7)
\b Backspace Char$(8)
\t Tab Char$(9)
\0 Null Char$(0_
\\ Backslash Char$(92)
\? Question mark ?
\’ Single quote ’
With hexadecimal values, Docbasic stops scanning for digits when it encounters a
nonhexadecimal digit or two digits, whichever comes first. Similarly, with octal
values, Docbasic stops scanning when it encounters a nonoctal digit or three digits,
whichever comes first.
When Option CStrings Off is in effect, then the backslash character has no special
meaning. This is the default.
Example
Option CStrings On
Sub Main()
MsgBox "They said, \"Watch out for that clump of grass!\""
MsgBox "First line.\r\nSecond line."
MsgBox "Char A: \x41 \r\n Char B: \x42"
End Sub
Platform(s)
All.
Or (operator)
Syntax
expression1 Or expression2
Description
If both expressions are either Boolean, Boolean variants, or Null variants, then a
logical disjunction is performed as follows:
Table 3-66 Effect of Boolean, Boolean Variant, and Null Expressions on the Or Operator
If the first expression is and the second expression is Then the result is
Binary Disjunction
If the two expressions are Integer, then a binary disjunction is performed, returning
an Integer result. All other numeric types (including Empty variants) are
converted to Long and a binary disjunction is then performed, returning a Long
result.
1 Imp 1 = 1
0 Imp 1 = 1
1 Imp 0 = 1
0 Imp 0 = 0
Examples
This first example shows the use of logical Or.
Dim s$ As String
s$ = InputBox$("Enter a string.")
If s$ = "" Or Mid$(s$,1,1) = "A" Then
s$ = LCase$(s$)
End If
TryAgain:
s$ = InputBox$("Enter a hex number (four digits max).")
If Mid$(s$,1,1) <> "&" Then
s$ = "&H" & s$
End If
If Not IsNumeric(s$) Then Goto TryAgain
w = CInt(s$)
MsgBox "Your number is &H" & Hex$(w)
w = w Or &H8000
MsgBox "Your number with the high bit set is &H" & Hex$(w)
Platform(s)
All.
See Also
Operator Precedence (topic)
And (operator)
Eqv (operator)
Imp (operator)
Xor (operator)
Pi (constant)
Syntax
Pi
Description
Pi can also be determined using the following formula:
4 * Atn(1)
Example
This example illustrates the use of the Pi constant.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
dia# = 5
circ# = Pi * dia#
area# = Pi * ((dia# / 2) ^ 2)
msg = "Diameter: 5" & crlf
msg = msg & "Circumference: " & Format(circ#,"Standard") & crlf
msg = msg & "Area: " & Format(area#,"Standard")
MsgBox msg
End Sub
Platform(s)
All.
See Also
Tan (function)
Atn (function)
Cos (function)
Sin (function)
Pmt (function)
Returns the payment for an annuity based on periodic fixed payments and a
constant rate of interest.
Syntax
Pmt(Rate,NPer,Pv,Fv,Due)
Description
An annuity is a series of fixed payments made to an insurance company or other
investment company over a period of time. Examples of annuities are mortgages
and monthly savings plans.
Rate and NPer must be expressed in the same units. If Rate is expressed in months,
then NPer must also be expressed in months.
Example
This example calculates the payment necessary to repay a $1,000.00 loan over 36
months at an annual rate of 10%. Payments are due at the beginning of the period.
Sub Main()
x = Pmt((.1/12),36,1000.00,0,1)
msg = "The payment to amortize $1,000 over 36 months @ 10% is: "
MsgBox msg & Format(x,"Currency")
End Sub
Platform(s)
All.
See Also
IPmt (function)
NPer (function)
PPmt (function)
Rate (function)
PPmt (function)
Syntax
PPmt(Rate,Per,NPer,Pv,Fv,Due)
Description
An annuity is a series of fixed payments made to an insurance company or other
investment company over a period of time. Examples of annuities are mortgages
and monthly savings plans.
Rate and NPer must be in the same units to calculate correctly. If Rate is expressed
in months, then NPer must also be expressed in months.
Negative values represent payments paid out, whereas positive values represent
payments received.
Example
This example calculates the principal paid during each year on a loan of $1,000.00
with an annual rate of 10% for a period of 10 years. The result is displayed as a table
containing the following information: payment, principal payment, principal
balance.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
pay = Pmt(.1,10,1000.00,0,1)
msg = "Amortization table for 1,000" & crlf & "at 10% annually for"
msg = msg & " 10 years: " & crlf & crlf
bal = 1000.00
For per = 1 to 10
prn = PPmt(.1,per,10,1000,0,0)
bal = bal + prn
msg = msg & Format(pay,"Currency") & " " & Format$(Prn,"Currency")
msg = msg & " " & Format(bal,"Currency") & crlf
Next per
MsgBox msg
End Sub
Platform(s)
All.
See Also
IPmt (function)
NPer (function)
Pmt (function)
Rate (function)
Print (statement)
Syntax
Print [[{Spc(n) | Tab(n)}][expressionlist][{; | ,}]]
Description
The actual output device depends on the platform on which Docbasic is running.
Any numeric type Printed with an initial space reserved for the sign (space =
positive). Additionally, there is a space following each number.
Date Printed using the short date format. If either the date or time
component is missing, only the provided portion is printed (this
is consistent with the "general date" format understood by the
Format/Format$ functions).
User-defined errors User-defined errors are printed to files as "Error code", where
code is the value of the user-defined error. The word "Error" is
not translated.
If the last expression in the list is not followed by a comma or a semicolon, then a
carriage return is printed to the file. If the last expression ends with a semicolon,
no carriage return is printedthe next Print statement will output information
immediately following the expression. If the last expression in the list ends with a
comma, the file pointer is positioned at the start of the next print zone on the
current line.
The Tab and Spc functions provide additional control over the column position.
The Tab function moves the file position to the specified column, whereas the Spc
function outputs the specified number of spaces.
Examples
Sub Main()
i% = 10
s$ = "This is a test."
Print "The value of i=";i%,"the value of s=";s$
Platform(s)
All.
Print# (statement)
Syntax
Print [#]filenumber, [[{Spc(n) | Tab(n)}][expressionlist][{;|,}]]
Description
The filenumber parameter is a number that is used by Docbasic to refer to the open
file—the number passed to the Open statement.
Any numeric type Printed with an initial space reserved for the sign (space =
positive). Additionally, there is a space following each number.
Date Printed using the short date format. If either the date or time
component is missing, only the provided portion is printed (this
is consistent with the "general date" format understood by the
Format/Format$ functions).
User-defined errors User-defined errors are printed to files as "Error code", where
code is the value of the user-defined error. The word "Error" is
not translated.
If the last expression in the list is not followed by a comma or a semicolon, then an
end-of-line is printed to the file. If the last expression ends with a semicolon, no
end-of-line is printedthe next Print statement will output information
immediately following the expression. If the last expression in the list ends with a
comma, the file pointer is positioned at the start of the next print zone on the
current line.
The Write statement always outputs information ending with an end-of-line. Thus,
if a Print statement is followed by a Write statement, the file pointer is positioned
on a new line.
The Print statement can only be used with files that are opened in Output or
Append mode.
The Tab and Spc functions provide additional control over the file position. The
Tab function moves the file position to the specified column, whereas the Spc
function outputs the specified number of spaces.
In order to correctly read the data using the Input# statement, you should write the
data using the Write statement.
Examples
Sub Main()
'This example opens a file and prints some data.
Open "test.dat" For Output As #1
i% = 10
s$ = "This is a test."
Print #1,"The value of i=";i%,"the value of s=";s$
Close #1
Kill "test.dat"
End Sub
Platform(s)
All.
Platform Notes
The end-of-line character is different on many platforms. On some platforms, it is
defined as a carriage-return/line-feed pair, and on other platforms, it is defined as
only a line feed. The Docbasic statements that read sequential files don't care about
the end-of-line character—either will work.
See Also
Open (statement)
Put (statement)
Write# (statement)
Private (statement)
Declares a list of private variables and their corresponding types and sizes.
Syntax
Private name [(subscripts)] [As type] [,name [(subscripts)] [As type]]...
Description
Private variables are global to every Sub and Function within the currently
executing procedure.
The subscripts parameter allows the declaration of arrays. This parameter uses the
following syntax:
[lower To] upper [,[lower To] upper]...
The lower and upper parameters are integers specifying the lower and upper
bounds of the array. If lower is not specified, then the lower bound as specified by
Option Base is used (or 1 if no Option Base statement has been encountered). Up
to 60 array dimensions are allowed.
The total size of an array (not counting space for strings) is limited to 64K.
The type parameter specifies the type of the data item being declared. It can be any
of the following data types: String, Integer, Long, Single, Double, Currency, Object,
data object, built-in data type, or any user-defined data type.
If a variable is seen that has not been explicitly declared with either Dim, Public, or
Private, then it will be implicitly declared local to the routine in which it is used.
Fixed-Length Strings
Initial Values
All declared variables are given initial values, as described in the following table:
Integer 0
Long 0
Double 0.0
Single 0.0
Currency 0.0
Object Nothing
Boolean False
Variant Empty
User-defined type Each element of the structure is given a default value, as described above.
Arrays Each element of the array is given a default value, as described above.
Example
See Public (statement).
Platform(s)
All.
See Also
Dim (statement)
Redim (statement)
Public (statement)
Option Base (statement)
Public (statement)
Declares a list of public variables and their corresponding types and sizes.
Syntax
Public name [(subscripts)] [As type] [,name [(subscripts)] [As type]]...
Description
Public variables are global to all Subs and Functions in all procedures.
The subscripts parameter allows the declaration of arrays. This parameter uses the
following syntax:
[lower To] upper [,[lower To] upper]...
The lower and upper parameters are integers specifying the lower and upper
bounds of the array. If lower is not specified, then the lower bound as specified by
Option Base is used (or 1 if no Option Base statement has been encountered). Up
to 60 array dimensions are allowed.
The total size of an array (not counting space for strings) is limited to 64K.
The type parameter specifies the type of the data item being declared. It can be any
of the following data types: String, Integer, Long, Single, Double, Currency, Object,
data object, built-in data type, or any user-defined data type.
If a variable is seen that has not been explicitly declared with either Dim, Public, or
Private, then it will be implicitly declared local to the routine in which it is used.
For compatibility, the keyword Global is also supported. It has the same meaning
as Public.
Fixed-Length Strings
All declared variables are given initial values, as described in the following table:
Integer 0
Long 0
Double 0.0
Single 0.0
Currency 0.0
Object Nothing
Boolean False
Variant Empty
User-defined type Each element of the structure is given a default value, as described above.
Arrays Each element of the array is given a default value, as described above.
Sharing Variables
When sharing variables, you must ensure that the declarations of the shared
variables are the same in each procedure that uses those variables. If the public
variable being shared is a user-defined structure, then the structure definitions
must be exactly the same.
Example
This example uses a subroutine to calculate the area of ten circles and displays the
result in a dialog box. The variables R and Ar are declared as Public variables so
that they can be used in both Main and Area.
Const crlf = Chr$(13) + Chr$(10)
Sub Area()
ar# = (x# ^ 2) * Pi
End Sub
Sub Main()
msg = "The area of the ten circles are:" & crlf
For x# = 1 To 10
Area
msg = msg & x# & ": " & ar# & Basic.Eoln$
Next x#
MsgBox msg
End Sub
Platform(s)
All.
See Also
Dim (statement)
Redim (statement)
Private (statement)
Option Base (statement)
Put (statement)
Syntax
Put [#]filenumber, [recordnumber], variable
Description
The Put statement accepts the following parameters:
The variable parameter is the name of any variable of any of the following types:
Boolean 2 bytes are written to the file (either D1 for True or 0 for
False).
With Random files, a runtime error will occur if the length of the data being written
exceeds the record length (specified as the reclen parameter with the Open
statement). If the length of the data being written is less than the record length, the
entire record is written along with padding (whatever data happens to be in the I/
O buffer at that time). With Binary files, the data elements are written
contiguously: they are never separated with padding.
Example
This example opens a file for random write, then writes ten records into the file
with the values 10-50. Then the file is closed and reopened in random mode for
read, and the records are read with the Get statement. The result is displayed in a
dialog box.
Sub Main()
Open "test.dat" For Random Access Write As #1
For x = 1 To 10
r% = x * 10
Put #1,x,r%
Next x
Close
MsgBox msg
Close
Kill "test.dat"
End Sub
Platform(s)
All.
See Also
Open (statement)
Put (statement)
Write# (statement)
Print# (statement)
Pv (function)
Calculates the present value of an annuity based on future periodic fixed payments
and a constant rate of interest.
Syntax
Pv(Rate,NPer,Pmt,Fv,Due)
Description
The Pv function requires the following parameters:
Due Integer indicating when the payments are due for each
payment period. A 0 specifies payment at the end of each
period, whereas a 1 specifies payment at the start of each
period.
Rate and NPer must be expressed in the same units. If Rate is expressed in months,
then NPer must also be expressed in months.
Example
This example demonstrates the present value (the amount you'd have to pay (now)
for a $100,000 annuity that pays an annual income of $5,000 over 20 years at an
annual interest rate of 10%.
Sub Main()
pval = Pv(.1,20,-5000,100000,1)
Platform(s)
All.
See Also
Fv (function)
IRR (function)
MIRR (function)
Npv (function)
Random (function)
Returns a Long value greater than or equal to min and less than or equal to max.
Syntax
Random(min,max)
Description
Both the min and max parameters are rounded to Long. A runtime error is
generated if min is greater than max.
Example
This example uses the random number generator to generate ten lottery numbers.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Randomize 'Start with new random seed.
For x = 1 To 10
y = Random(0,100)'Generate numbers.
msg = msg & y & crlf
Next x
MsgBox "Ten numbers for the lottery: " & crlf & msg
End Sub
Platform(s)
All.
See Also
Randomize (statement)
Random (function)
Randomize (statement)
Syntax
Randomize [seed]
Description
If seed is not specified, then the current value of the system clock is used.
Example
This example sets the randomize seed to a random number between 100 and 1000,
then generates ten random numbers for the lottery.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Randomize 'Start with new random seed.
For x = 1 To 10
y = Random(0,100)'Generate numbers.
msg = msg + Str(y) + crlf
Next x
MsgBox "Ten numbers for the lottery: " & crlf & msg
End Sub
Platform(s)
All.
See Also
Random (function)
Rnd (function)
Rate (function)
Syntax
Rate(NPer,Pmt,Pv,Fv,Due,Guess)
Description
An annuity is a series of fixed payments made to an insurance company or other
investment company over a period of time. Examples of annuities are mortgages
and monthly savings plans.
Due Integer specifying when the payments are due for each
payment period. A 0 indicates payment at the end of each
period, whereas a 1 indicates payment at the start of each
period.
Positive numbers represent cash received, whereas negative values represent cash
paid out.
The value of Rate is found by iteration. It starts with the value of Guess and cycles
through the calculation adjusting Guess until the result is accurate within 0.00001
percent. After 20 tries, if a result cannot be found, Rate fails, and the user must pick
a better guess.
Example
This example calculates the rate of interest necessary to save $8,000 by paying $200
each year for 48 years. The guess rate is 10%.
Sub Main()
r# = Rate(48,-200,8000,0,1,.1)
MsgBox "The rate required is: " & Format(r#,"Percent")
End Sub
Platform(s)
All.
See Also
IPmt (function)
NPer (function)
Pmt (function)
PPmt (function)
ReadIni$ (function)
Syntax
ReadIni$(section$,item$[,filename$])
Description
The ReadIni$ function takes the following parameters:
Platform(s)
Windows, Win32.
If the filename$ parameter does not include a path, then this statement looks for ini
files in the Windows directory.
See Also
WriteIni (statement)
ReadIniSection (statement)
ReadIniSection (statement)
Fills an array with the item names from a given section of the specified ini file.
Syntax
ReadIniSection section$,ArrayOfItems()[,filename$]
Description
The ReadIniSection statement takes the following parameters:
On return, the ArrayOfItems() parameter will contain one array element for each
variable in the specified ini section.
Example
Sub Main()
Dim items() As String
ReadIniSection "windows",items$
MsgBox "INI Items " + items$
End Sub
Platform(s)
Windows, Win32.
If the filename$ parameter does not include a path, then this statement looks for ini
files in the Windows directory.
See Also
ReadIni$ (function)
WriteIni (statement)
Redim (statement)
Redimensions an array, specifying a new upper and lower bound for each
dimension of the array.
Syntax
Redim [Preserve] variablename (subscriptRange) [As type],...
Description
The variablename parameter specifies the name of an existing array (previously
declared using the Dim statement) or the name of a new array variable. If the array
variable already exists, then it must previously have been declared with the Dim
statement with no dimensions, as shown in the following example:
Dim a$()'Dynamic array of strings (no dimensions yet)
The subscriptRange parameter specifies the new upper and lower bounds for each
dimension of the array using the following syntax:
[lower To] upper [,[lower To] upper]...
If lower is not specified, then 0 is used (or the value set using the Option Base
statement). A runtime error is generated if lower is less than upper. Array
dimensions must be within the following range:
-32768 <= lower <= upper <= 32767
The type parameter can be used to specify the array element type. Arrays can be
declared using any fundamental data type, user-defined data types, and objects.
Redimensioning an array erases all elements of that array unless the Preserve
keyword is specified. When this keyword is specified, existing data in the array is
preserved where possible. If the number of elements in an array dimension is
increased, the new elements are initialized to 0 (or empty string). If the number of
elements in an array dimension is decreased, then the extra elements will be
deleted. If the Preserve keyword is specified, then the number of dimensions of the
array being redimensioned must either be zero or the same as the new number of
dimensions.
Example
This example uses the FileList statement to redim an array and fill it with filename
strings. A new array is then redimmed to hold the number of elements found by
FileList, and the FileList array is copied into it and partially displayed.
Sub Main()
Dim fl$()
FileList fl$,"*.*"
count = Ubound(fl$)
Redim nl$(Lbound(fl$) To Ubound(fl$))
For x = 1 to count
nl$(x) = fl(x)
Next x
MsgBox "The last element of the new array is: " & nl$(count)
End Sub
Platform(s)
All.
See Also
Dim (statement)
Public (statement)
Private (statement)
ArrayDims (function)
LBound (function)
UBound (function)
Rem (statement)
Syntax
Rem text
Example
Sub Main()
Rem This is a line of comments that serves to illustrate the
Rem workings of the code. You can insert comments to make it more
Rem readable and maintainable in the future.
End Sub
Platform(s)
All.
See Also
' (keyword)
Comments (topic)
Reset (statement)
Syntax
Reset
Example
This example opens a file for output, closes it with the Reset statement, then deletes
it with the Kill statement.
Sub Main()
Open "test.dat" for Output Access Write as # 1
Reset
Kill "test.dat"
If FileExists("test.dat") Then
MsgBox "The file was not deleted."
Else
MsgBox "The file was deleted."
End If
End Sub
Platform(s)
All.
See Also
Close (statement)
Open (statement)
Resume (statement)
Syntax
Resume {[0] | Next | label}
Description
The form Resume 0 (or simply Resume by itself) causes execution to continue with
the statement that caused the error.
The form Resume Next causes execution to continue with the statement following
the statement that caused the error.
The form Resume label causes execution to continue at the specified label.
The Resume statement resets the error state. This means that, after executing this
statement, new errors can be generated and trapped as normal.
Example
This example accepts two integers from the user and attempts to 'multiply the
numbers together. If either number is larger than an 'integer, the program
processes an error routine and then continues 'program execution at a specific
section using 'Resume <label>'. 'Another error trap is then set using 'Resume Next'.
The new error 'trap will clear any previous error branching and also 'tell' the
'program to continue execution of the program even if an error is encountered.
Sub Main()
Dim a%, b%, x%
Again:
On Error Goto Overflow
a% = InputBox("Enter 1st integer to multiply","Enter Number")
b% = InputBox("Enter 2nd integer to multiply","Enter Number")
if err = 0 then
MsgBox x%
else
Msgbox a% & " * " & b% & " cause an overflow!"
end if
Exit Sub
Platform(s)
All.
See Also
Error Handling (topic)
On Error (statement)
Return (statement)
Transfers execution control to the statement following the most recent GoSub.
Syntax
Return
Description
A runtime error results if a Return statement is encountered without a
corresponding GoSub statement.
Example
This example calls a subroutine and then returns execution to the Main routine by
the Return statement.
Sub Main()
GoSub SubTrue
MsgBox "The Main routine continues here."
Exit Sub
SubTrue:
MsgBox "This message is generated in the subroutine."
Return
Exit Sub
End Sub
Platform(s)
All.
See Also
GoSub (statement)
Syntax
Right[$](text,NumChars)
Description
Right$ returns a String, whereas Right returns a String variant.
Example
This example shows the Right$ function used in a routine to change uppercase
names to lowercase with an uppercase first letter.
Sub Main()
lname$ = "WILLIAMS"
x = Len(lname$)
rest$ = Right$(lname$,x - 1)
fl$ = Left$(lname$,1)
lname$ = fl$ & LCase$(rest$)
MsgBox "The converted name is: " & lname$
End Sub
Platform(s)
All.
See Also
Left, Left$ (functions)
RmDir (statement)
Syntax
RmDir dir$
Example
This routine creates a directory and then deletes it with RmDir.
Sub Main()
On Error Goto ErrMake
MkDir("test01")
On Error Goto ErrRemove
RmDir("test01")
ErrMake:
MsgBox "The directory could not be created."
Exit Sub
ErrRemove:
MsgBox "The directory could not be removed."
Exit Sub
End Sub
Platform(s)
All.
See Also
ChDir (statement)
ChDrive (statement)
CurDir, CurDir$ (functions)
Dir, Dir$ (functions)
MkDir (statement)
Rnd (function)
Syntax
Rnd[(number)]
Description
If number is omitted, the next random number is returned. Otherwise, the number
parameter has the following meaning:
If Then
Example
This routine generates a list of random numbers and displays them.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
For x = -1 To 8
y! = Rnd(1) * 100
msg = msg & x & " : " & y! & crlf
Next x
MsgBox msg & "Last form: " & Rnd
End Sub
Platform(s)
All.
See Also
Randomize (statement)
Random (function)
RSet (statement)
Copies the source string source into the destination string destvariable.
Syntax
RSet destvariable = source
Description
If source is shorter in length than destvariable, then the string is right-aligned within
destvariable and the remaining characters are padded with spaces. If source is
longer than destvariable, then source is truncated, copying only the leftmost number
of characters that will fit in destvariable. A runtime error is generated if source is
Null.
Example
This example replaces a 40-character string of asterisks (*) with an RSet and LSet
string and then displays the result.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
Dim msg,tmpstr$
tmpstr$ = String$(40, "*")
msg = "Here are two strings that have been right-" & crlf
msg = msg & "and left-justified in a 40-character string."
msg = msg & crlf & crlf
RSet tmpstr$ = "Right->"
msg = msg & tmpstr$ & crlf
LSet tmpstr$ = "<-Left"
msg = msg & tmpstr$ & crlf
MsgBox msg
End Sub
Platform(s)
All.
See Also
LSet (statement)
Syntax
RTrim[$](text)
Description
RTrim$ returns a String, whereas RTrim returns a String variant.
Example
This example displays a left-justified string and its RTrim result.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
a$ = "This is a left-justified string. "
b$ = RTrim$(a$)
MsgBox a$ & "<=" & crlf & b$ & "<="
End Sub
Platform(s)
All.
See Also
LTrim, LTrim$ (functions)
Trim, Trim$ (functions)
SaveFilename$ (function)
Displays a dialog box that prompts the user to select from a list of files and returns
a String containing the full path of the selected file.
Syntax
SaveFilename$[([title$ [,extensions$]])]
Description
The SaveFilename$ function accepts the following parameters:
title$ String containing the title that appears on the dialog box's
caption. If this string is omitted, then "Save As" is used.
The SaveFilename$ function returns a full pathname of the file that the user selects.
A zero-length string is returned if the user selects Cancel. If the file already exists,
then the user is prompted to overwrite it.
e$ = "All Files:*.BMP,*.WMF;Bitmaps:*.BMP;Metafiles:*.WMF"
f$ = SaveFilename$("Save Picture",e$)
Example
This example creates a save dialog box, giving the user the ability to save to several
different file types.
Sub Main()
e$ = "All Files:*.BMP,*.WMF;Bitmaps:*.BMP;Metafiles:*.WMF"
f$ = SaveFilename$("Save Picture",e$)
If Not f$ = "" Then
Msgbox "User choose to save file as: " + f$
Else
Msgbox "User canceled."
End IF
End Sub
Platform(s)
Windows, Win32, Macintosh.
description Specifies the grouping of files for the user, such as All Files.
See Also
MsgBox (statement)
OpenFilename$ (function)
Second (function)
Syntax
Second(time)
Description
The value returned is an Integer between 0 and 59 inclusive.
Example
This example takes the current time; extracts the hour, minute, and second; and
displays them as the current time.
Sub Main()
xt# = TimeValue(Time$())
xh# = Hour(xt#)
xm# = Minute(xt#)
xs# = Second(xt#)
Msgbox "The current time is: " & CStr(xh#) & ":" & CStr(xm#) & ":" &
CStr(xs#)
End Sub
Platform(s)
All.
See Also
Day (function)
Minute (function)
Month (function)
Year (function)
Hour (function)
Weekday (function)
DatePart (function)
Seek (function)
Returns the position of the file pointer in a file relative to the beginning of the file.
Syntax
Seek(filenumber)
Description
The filenumber parameter is a number that Docbasic uses to refer to the open file—
the number passed to the Open statement.
The value returned depends on the mode in which the file was opened:
The value returned is a Long between 1 and 2147483647, where the first byte (or
first record) in the file is 1.
Example
This example opens a file for random write, then writes ten records into the file
using the PUT statement. The file position is displayed using the Seek Function,
and the file is closed.
Sub Main()
Open "test.dat" For Random Access Write As #1
For x = 1 To 10
r% = x * 10
Put #1,x,r%
Next x
y = Seek(1)
MsgBox "The current file position is: " & y
Close
End Sub
Platform(s)
All.
See Also
Seek (statement)
Loc (function)
Seek (statement)
Sets the position of the file pointer within a given file such that the next read or
write operation will occur at the specified position.
Syntax
Seek [#] filenumber,position
Description
The Seek statement accepts the following parameters:
position Long that specifies the location within the file at which to
position the file pointer. The value must be between 1 and
2147483647, where the first byte (or record number) in the
file is 1. For files opened in either Binary, Output, Input, or
Append mode, position is the byte position within the file.
For Random files, position is the record number.
A file can be extended by seeking beyond the end of the file and writing data there.
Example
This example opens a file for random write, then writes ten records into the file
using the PUT statement. The file is then reopened for read, and the ninth record
is read using he Seek and Get functions.
Sub Main()
Open "test.dat" For Random Access Write As #1
For x = 1 To 10
rec$ = "Record#: " & x
Put #1,x,rec$
Next x
Close
Platform(s)
All.
See Also
Seek (function)
Loc (function)
Select...Case (statement)
Syntax
Select Case testexpression
[Case expressionlist
[statement_block]]
[Case expressionlist
[statement_block]]
.
.
[Case Else
[statement_block]]
End Select
Description
The Select Case statement has the following parameters:
expression [,expression]...
expression to expression
is relational_operator expression
Multiple expression ranges can be used within a single Case clause. For example:
Case 1 to 10,12,15, Is > 40
Only the statement_block associated with the first matching expression will be
executed. If no matching expression is found, then the statements following the
Case Else will be executed.
Example
This example uses the Select...Case statement to output the current operating
system.
Sub Main()
OpSystem% = Basic.OS
Select Case OpSystem%
Case 0,2
s = "Microsoft Windows"
Case 3 to 8, 12
s = "UNIX"
Case Else
s = "Other"
End Select
MsgBox "This version of Docbasic is running on: " & s
End Sub
Platform(s)
All.
See Also
Choose (function)
Switch (function)
IIf (function)
If...Then...Else (statement)
Set (statement)
Syntax 1
Set object_var = object_expression
Syntax 2
Set object_var = New object_type
Syntax 3
Set object_var = Nothing
Description
Syntax 1
The first syntax assigns the result of an expression to an object variable. This
statement does not duplicate the object being assigned but rather copies a reference
of an existing object to an object variable.
The object_expression is any expression that evaluates to an object of the same type
as the object_var.
With data objects, Set performs additional processing. When the Set is performed,
the object is notified that a reference to it is being made and destroyed. For
example, the following statement deletes a reference to object A, then adds a new
reference to B.
Set a = b
Syntax 2
In the second syntax, the object variable is being assigned to a new instance of an
existing object type. This syntax is valid only for data objects.
When an object created using the New keyword goes out of scope (i.e., the Sub or
Function in which the variable is declared ends), the object is destroyed.
Syntax 3
Set a = Nothing
:
If a Is Nothing Then Beep
Example
This example creates two objects and sets their values.
Sub Main()
Dim document As Object
Dim page As Object
Set document = GetObject("c:\resume.doc")
Set page = Document.ActivePage
MsgBox page.name
End Sub
Platform(s)
All.
See Also
= (statement)
Let (statement)
CreateObject (function)
GetObject (function)
Nothing (constant)
SetAppInfo (function)
Writes a string to a specified section of a specified file on the user’s local disk.
Syntax
SetAppInfo(section$,entry$,string$,filename$)
Description
The SetAppInfo function accepts the following parameters:
section$ The name of a section in the file where the setting will be
written. The name can contain only alphabetic characters
and is case-sensitive. Do not include brackets ([ ]) around
the name.
If section$ does exist, Docbasic adds the entry to that
section. If section$ does not exit, Docbasic creates it.
entry$ The name of the entry to set. If entry$ is NULL, the entire
section, including all entries in the section, is deleted.
filename$ The name of the file where the settings are stored. Do not
include a file name extension. Docbasic automatically adds
".ini" as the file name extension. If filename$ does not exist,
Docbasic creates it.
Example
This example saves the position of a window to a file called MyFile.ini.
Sub Main()
Platform(s)
All.
See Also
GetAppInfo (function)
SetAttr (statement)
Changes the attribute filename$ to the given attribute. A runtime error results if the
file cannot be found.
Syntax
SetAttr filename$,attribute
Description
The SetAttr statement accepts the following parameters:
The attribute parameter can contain any combination of the following values:
The attributes can be combined using the + operator or the binary Or operator.
Example
This example creates a file and sets its attributes to Read-Only and System.
Sub Main()
Open "test.dat" For Output Access Write As #1
Close
MsgBox "The current file attribute is: " & GetAttr("test.dat")
SetAttr "test.dat",ebReadOnly Or ebSystem
MsgBox "The file attribute was set to: " & GetAttr("test.dat")
End Sub
Platform(s)
All.
See Also
GetAttr (function)
FileAttr (function)
Sgn (function)
Returns an Integer indicating whether a number is less than, greater than, or equal
to 0.
Syntax
Sgn(number)
Description
Returns 1 if number is greater than 0.
The number parameter is a numeric expression of any type. If number is Null, then
a runtime error is generated. Empty is treated as 0.
Example
This example tests the product of two numbers and displays a message based on
the sign of the result.
Sub Main()
a% = -100
b% = 100
c% = a% * b%
Select Case Sgn(c%)
Case -1
MsgBox "The product is negative " & Sgn(c%)
Case 0
MsgBox "The product is 0 " & Sgn(c%)
Case 1
MsgBox "The product is positive " & Sgn(c%)
End Select
End Sub
Platform(s)
All.
See Also
Abs (function)
Shell (function)
Syntax
Shell(command$ [,WindowStyle])
Description
The Shell statement accepts the following parameters:
The Shell command runs programs asynchronously: the statement following the
Shell statement will execute before the child application has exited. On some
platforms, the next statement will run before the child application has finished
loading.
Platform(s)
All.
Under UNIX, Docbasic attempts to execute the command line using the Bourne
shell (sh), which it finds by searching the path. If the shell isn't found in the path,
then a default path of /usr/bin is assumed.
Sin (function)
Syntax
Sin(angle)
Description
The angle parameter is a Double specifying an angle in radians.
Example
This example displays the sine of pi/4 radians (45 degrees).
Sub Main()
c# = Sin(Pi / 4)
MsgBox "The sine of 45 degrees is: " & c#
End Sub
Platform(s)
All.
See Also
Tan (function)
Cos (function)
Atn (function)
A data type used to declare variables capable of holding real numbers with up to
seven digits of precision.
Syntax
Single
Description
Single variables are used to hold numbers within the following ranges:
Sign Range
Storage
Internally, singles are stored as 4-byte (32-bit) IEEE values. Thus, when appearing
within a structure, singles require 4 bytes of storage. When used with binary or
random files, 4 bytes of storage is required.
Platform(s)
All.
See Also
Boolean (data type)
Currency (data type)
Date (data type)
Double (data type)
Sleep (statement)
Syntax
Sleep milliseconds
Description
The milliseconds parameter is a Long in the following range:
Example
This example displays a message for 2 seconds.
Sub Main()
... ' Your code
Sleep(2000)
... ' Your code
End Sub
Platform(s)
All.
Sln (function)
Syntax
Sln(Cost,Salvage,Life)
Description
The Sln of an asset is found by taking an estimate of its useful life in years,
assigning values to each year, and adding up all the numbers.
The unit of time used to express the useful life of the asset is the same as the unit
of time used to express the period for which the depreciation is returned.
Example
This example calculates the straight-line depreciation of an asset that cost
$10,000.00 and has a salvage value of $500.00 as scrap after 10 years of service life.
Sub Main()
dep# = Sln(10000.00,500.00,10)
MsgBox "The annual depreciation is: " & Format(dep#,"Currency")
End Sub
Platform(s)
All.
See Also
SYD (function)
DDB (function)
Syntax
Space[$](NumSpaces)
Description
Space$ returns a String, whereas Space returns a String variant.
Example
This example returns a string of ten spaces and displays it.
Sub Main()
ln$ = Space$(10)
MsgBox "Hello" & ln$ & "over there."
End Sub
Platform(s)
All.
See Also
String, String$ (functions)
Spc (function)
Spc (function)
Prints out the specified number of spaces. This function can only be used with the
Print and Print# statements.
Syntax
Spc(numspaces)
Description
The numspaces parameter is an Integer specifying the number of spaces to be
printed. It can be any value between 0 and 32767.
If a line width has been specified (using the Width statement), then the number of
spaces is adjusted as follows:
numspaces = numspaces Mod width
If the resultant number of spaces is greater than width - print_position, then the
number of spaces is recalculated as follows:
numspaces = numspaces - (width - print_position)
These calculations have the effect of never allowing the spaces to overflow the line
length. Furthermore, with a large value for column and a small line width, the file
pointer will never advance more than one line.
Example
This example displays 20 spaces between the arrows.
Sub Main()
Print "I am"; Spc(20); "20 spaces apart!"
Sleep (10000)'Wait 10 seconds.
End Sub
Platform(s)
All.
See Also
Tab (function)
Print (statement)
Print# (statement)
Sqr (function)
Syntax
Sqr(number)
Description
The number parameter is a Double greater than or equal to 0.
Example
This example calculates the square root of the numbers from 1 to 10 and displays
them.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
For x = 1 To 10
sx# = Sqr(x)
msg = msg & Format(x,"Fixed") & " - " & Format(sx#,"Fixed") & crlf
Next x
MsgBox msg
End Sub
Platform(s)
All.
Stop (statement)
Syntax
Stop
Example
The Stop statement can be used for debugging. In this example, it is used to stop
execution when Z is randomly set to 0.
Sub Main()
For x = 1 To 10
z = Random(0,10)
If z = 0 Then Stop
y = x / z
Next x
End Sub
Platform(s)
All.
See Also
Exit For (statement)
Exit Do (statement)
Exit Function (statement)
Exit Sub (statement)
End (statement)
Syntax
Str[$](number)
Description
The number parameter is any numeric expression or expression convertible to a
number. If number is negative, then the returned string will contain a leading minus
sign. If number is positive, then the returned string will contain a leading space.
Singles are printed using only 7 significant digits. Doubles are printed using 15-16
significant digits.
These functions only output the period as the decimal separator and do not output
thousands separators. Use the CStr, Format, or Format$ function for this purpose.
Example
In this example, the Str$ function is used to display the value of a numeric variable.
Sub Main()
x# = 100.22
MsgBox "The string value is: " + Str(x#)
End Sub
Platform(s)
All.
See Also
Format, Format$ (functions)
CStr (function)
StrComp (function)
Returns an Integer indicating the result of comparing the two string arguments.
Syntax
StrComp(string1,string2 [,compare])
Description
The StrComp function accepts the following parameters:
If compare is not specified, then the current Option Compare setting is used. If no
Option Compare statement has been encountered, then Binary is used (i.e., string
comparison is case-sensitive).
Value Description
0 string1 = string2
Example
This example compares two strings and displays the results. It illustrates that the
function compares two strings to the length of the shorter string in determining
equivalency.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
a$ = "This string is UPPERCASE and lowercase"
b$ = "This string is uppercase and lowercase"
c$ = "This string"
d$ = "This string is uppercase and lowercase characters"
abc = StrComp(a$,b$,0)
msg = msg & "a and c (sensitive) : " & Format(abc,"True/False") & crlf
abi = StrComp(a$,b$,1)
msg = msg & "a and b (insensitive): " & Format(abi,"True/False") & crlf
aci = StrComp(a$,c$,1)
msg = msg & "a and c (insensitive): " & Format(aci,"True/False") & crlf
bdi = StrComp(b$,d$,1)
msg = msg & "b and d (sensitive) : " & Format(bdi,"True/False") & crlf
MsgBox msg
End Sub
Platform(s)
All.
See Also
Comparison Operators (topic)
Like (operator)
Option Compare (statement)
Syntax
String
Description
Strings are used to hold sequences of characters, each character having a value
between 0 and 255. Strings can be any length up to a maximum length of 32767
characters.
The length of a string can be determined using the Len function. This function
returns the number of characters that have been stored in the string, including
unprintable characters.
String variables that have not yet been assigned are set to zero-length by default.
Fixed-length strings are useful within structures when a fixed size is required, such
as when passing structures to external routines.
The storage for a fixed-length string depends on where the string is declared, as
described in the following :
Declared Stored
In structures In the same data area as that of the structure. Local structures are on the
stack; public structures are stored in the public data space; and private
structures are stored in the private data space. Local structures should be
used sparingly as stack space is limited.
In arrays In the global string space along with all the other array elements.
Local routines On the stack. The stack is limited in size, so local fixed-length strings
should be used sparingly.
Platform(s)
All.
See Also
Boolean (data type)
Currency (data type)
Date (data type)
Double (data type)
Integer (data type)
Long (data type)
Object (data type)
Single (data type)
Variant (data type)
DefType (statement)
CStr (function)
Syntax
String[$](number,[CharCode | text$])
Description
String$ returns a String, whereas String returns a String variant.
Example
This example uses the String function to create a line of "=" signs the length of
another string and then displays the character string underlined with the
generated string.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
a$ = "This string will appear underlined."
b$ = String$(Len(a$),"=")
MsgBox a$ & crlf & b$
End Sub
Platform(s)
All.
See Also
Space, Space$ (functions)
Declares a subroutine.
Syntax
[Private | Public] [Static] Sub name[(arglist)]
[statements]
End Sub
Description
The Sub statement has the following parameters:
parameter Name of the parameter, which must follow the same naming conventions
as those used by variables. This name can include a type-declaration
character, appearing in place of As type.
type Type of the parameter (i.e., Integer, String, and so on). Arrays are
indicated with parentheses. For example, an array of integers would be
declared as follows:
Optional Parameters
Docbasic allows you to skip parameters when calling subroutines, as shown in the
following example:
Sub Test(a%,b%,c%)
End Sub
Sub Main
Test 1,,4'Parameter 2 was skipped.
End Sub
The call cannot end with a comma. For instance, using the above example,
the following is not valid:
Test 1,,
When you skip a parameter in this manner, Docbasic creates a temporary variable
and passes this variable instead. The value of this temporary variable depends on
the data type of the corresponding parameter in the argument list of the called
subroutine, as described in the following table:
Error Variant
False Boolean
Within the called subroutine, you will be unable to determine if a parameter was
skipped unless the parameter was declared as a variant in the argument list of the
subroutine. In this case, you can use the IsMissing function to determine if the
parameter was skipped:
Sub Test(a,b,c)
If IsMissing(a) Or IsMissing(b) Then Exit Sub
End Sub
Example
This example uses a subroutine to calculate the area of a circle.
Sub Main()
r! = 10
PrintArea r!
End Sub
Platform(s)
All.
See Also
Main (keyword)
Function...End Function (statement)
Switch (function)
Syntax
Switch(condition1,expression1 [,condition2,expression2 ...
[,condition7,expression7]])
Description
The Switch function evaluates each condition and expression, returning the
expression that corresponds to the first condition (starting from the left) that
evaluates to True. Up to seven condition/expression pairs can be specified.
Example
The following code fragment displays the current operating platform. If the
platform is unknown, then the word "Unknown" is displayed.
Sub Main()
Dim a As Variant
a = Switch(Basic.OS = 0,"Windows 3.1",Basic.OS = 2,"Win32")
MsgBox "The current platforms is: " & IIf(IsNull(a),"Unknown",a)
End Sub
Platform(s)
All.
See Also
Choose (function)
IIf (function)
If...Then...Else (statement)
Select...Case (statement)
SYD (function)
Returns the sum of years' digits depreciation of an asset over a specific period of
time.
Syntax
SYD(Cost,Salvage,Life,Period)
Description
The SYD of an asset is found by taking an estimate of its useful life in years,
assigning values to each year, and adding up all the numbers.
To receive accurate results, the parameters Life and Period must be expressed in the
same units. If Life is expressed in terms of months, for example, then Period must
also be expressed in terms of months.
Example
In this example, an asset that cost $1,000.00 is depreciated over ten years. The
salvage value is $100.00, and the sum of the years' digits depreciation is shown for
each year.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
For x = 1 To 10
dep# = SYD(1000,100,10,x)
msg = msg & "Year: " & x & " Dep: " & Format(dep#,"Currency") &
crlf
Next x
MsgBox msg
End Sub
Platform(s)
All.
See Also
Sln (function)
DDB (function)
Tab (function)
Syntax
Tab (column)
Description
This function can only be used with the Print and Print# statements.
Rule 1: If the current print position is less than or equal to column, then the number
of spaces is calculated as:
column - print_position
Rule 2: If the current print position is greater than column, then column - 1 spaces
are printed on the next line.
If a line width is specified (using the Width statement), then the column position is
adjusted as follows before applying the above two rules:
column = column Mod width
The Tab function is useful for making sure that output begins at a given column
position, regardless of the length of the data already printed on that line.
Example
This example prints three column headers and three numbers aligned below the
column headers.
Sub Main()
Print "Column1";Tab(10);"Column2";Tab(20);"Column3"
Print Tab(3);"1";Tab(14);"2";Tab(24);"3"
Sleep(10000)'Wait 10 seconds.
End Sub
Platform(s)
All.
See Also
Spc (function)
Print (statement)
Print# (statement)
Tan (function)
Syntax
Tan(angle)
Description
The angle parameter is a Double value given in radians.
Example
This example computes the tangent of pi/4 radians (45 degrees).
Sub Main()
c# = Tan(Pi / 4)
MsgBox "The tangent of 45 degrees is: " & c#
End Sub
Platform(s)
All.
See Also
Sin (function)
Cos (function)
Atn (function)
Syntax
Time[$][()]
Description
The Time$ function returns a string that contains the time in a 24-hour time format,
whereas Time returns a Date variant.
Example
This example returns the system time and displays it in a dialog box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
oldtime$ = Time$
msg = "Time was: " & oldtime$ & crlf
Time$ = "10:30:54"
msg = msg & "Time set to: " & Time$ & crlf
Time$ = oldtime$
msg = msg & "Time restored to: " & Time$
MsgBox msg
End Sub
Platform(s)
All.
See Also
Time, Time$ (statements)
Date, Date$ (functions)
Date, Date$ (statements)
Now (function)
Sets the system time to the time contained in the specified string.
Syntax
Time[$] = newtime
Description
The Time$ statement requires a string variable in one of the following formats:
HH
HH:MM
HH:MM:SS
where HH is between 0 and 23, MM is between 0 and 59, and SS is between 0 and
59.
The Time statement converts any valid expression to a time, including string and
numeric values. Unlike the Time$ statement, Time recognizes many different time
formats, including 12-hour times.
Example
This example returns the system time and displays it in a dialog box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
oldtime$ = Time$
msg = "Time was: " & oldtime$ & crlf
Time$ = "10:30:54"
msg = msg & "Time set to: " & Time$ & crlf
Time$ = oldtime$
msg = msg & "Time restored to: " & Time$
MsgBox msg
End Sub
Platform(s)
All.
See Also
Time, Time$ (functions)
Date, Date$ (functions)
Date, Date$ (statements)
Timer (function)
Returns a Single representing the number of seconds that have elapsed since
midnight.
Syntax
Timer
Example
This example displays the elapsed time between execution start and the time you
clicked the OK button on the first message.
Sub Main()
start& = Timer
MsgBox "Click the OK button, please."
total& = Timer - start&
MsgBox "The elapsed time was: " & total& & " seconds."
End Sub
Platform(s)
All.
See Also
Time, Time$ (functions)
Now (function)
TimeSerial (function)
Returns a Date variant representing the given time with a date of zero.
Syntax
TimeSerial(hour,minute,second)
Description
The TimeSerial function requires the following parameters:
Example
Sub Main()
start# = TimeSerial(10,22,30)
finish# = TimeSerial(10,35,27)
dif# = Abs(start# - finish#)
MsgBox "The time difference is: " & Format(dif#, "hh:mm:ss")
End Sub
Platform(s)
All.
See Also
DateValue (function)
TimeValue (function)
DateSerial (function)
TimeValue (function)
Returns a Date variant representing the time contained in the specified string
argument.
Syntax
TimeValue(time_string$)
Description
This function interprets the time_string$ parameter looking for a valid time
specification.
The time_string$ parameter can contain valid time items separated by time
separators such as colon (:) or period (.).
Time strings can contain an optional date specification, but this is not used in the
formation of the returned value.
If a particular time item is missing, then it is set to 0. For example, the string "10
pm" would be interpreted as "22:00:00."
Example
This example calculates the TimeValue of the current time and displays it in a
dialog box.
Sub Main()
t1$ = "10:15"
t2# = TimeValue(t1$)
MsgBox "The TimeValue of " & t1$ & " is: " & t2#
End Sub
Platform(s)
All.
See Also
DateValue (function)
TimeSerial (function)
DateSerial (function)
Returns a copy of the passed string expression (text) with leading and trailing
spaces removed.
Syntax
Trim[$](text)
Description
Trim$ returns a String, whereas Trim returns a String variant.
Example
This example uses the Trim$ function to extract the nonblank part of a string and
display it.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
text$ = " This is text "
tr$ = Trim$(text$)
MsgBox "Original =>" & text$ & "<=" & crlf & "Trimmed =>" & tr$ & "<="
End Sub
Platform(s)
All.
See Also
LTrim, LTrim$ (functions)
RTrim, RTrim$ (functions)
True (constant)
Example
This example sets variable a to True and then tests to see whether (1) A is True; (2)
the True constant = -1; and (3) A is equal to -1 (True).
Sub Main()
a = True
If ((a = True) and (True = -1) and (a = -1)) then
MsgBox "a is True."
Else
MsgBox "a is False."
End If
End Sub
Platform(s)
All.
See Also
False (constant)
Constants (topic)
Boolean (data type)
Type (statement)
The Type statement creates a structure definition that can then be used with the
Dim statement to declare variables of that type. The username field specifies the
name of the structure that is used later with the Dim statement.
Syntax
Type username
variable As type
variable As type
variable As type
End Type
Description
Within a structure definition appear field descriptions in the format:
variable As type
where variable is the name of a field of the structure, and type is the data type for
that variable. Any fundamental data type or previously declared user-defined data
type can be used within the structure definition (structures within structures are
allowed). Only fixed arrays can appear within structure definitions.
The Type statement can only appear outside of subroutine and function
declarations.
When declaring strings within fixed-size types, it is useful to declare the strings as
fixed-length. Fixed-length strings are stored within the structure itself rather than
in the string space. For example, the following structure will always require 62
bytes of storage:
Type Person
FirstName As String * 20
LastName As String * 40
Age As Integer
End Type
Example
This example displays the use of the Type statement to create a structure
representing the parts of a circle and assign values to them.
Type Circ
msg As String
rad As Integer
dia As Integer
are As Double
cir As Double
End Type
Sub Main()
Dim circle As Circ
circle.rad = 5
circle.dia = circle.rad * 2
circle.are = (circle.rad ^ 2) * Pi
circle.cir = circle.dia * Pi
circle.msg = "The area of the circle is: " & circle.are
MsgBox circle.msg
End Sub
Platform(s)
All.
See Also
Dim (statement)
Public (statement)
Private (statement)
UBound (function)
Returns an Integer containing the upper bound of the specified dimension of the
specified array variable.
Syntax
UBound(ArrayVariable() [,dimension])
Description
The dimension parameter is an integer that specifies the desired dimension. If not
specified, then the upper bound of the first dimension is returned.
The UBound function can be used to find the upper bound of a dimension of an
array returned by an OLE automation method or property:
UBound(object.property [,dimension])
UBound(object.method [,dimension])
Example
This example dimensions two arrays and displays their upper bounds.
Sub Main()
Dim a(5 To 12)
Dim b(2 To 100, 9 To 20)
uba = UBound(a)
ubb = UBound(b,2)
MsgBox "The upper bound of a is: " & uba & " The upper bound of b is: "
& ubb
This example uses Lbound and Ubound to dimension a dynamic array to hold a
copy of an array redimmed by the FileList statement.
Dim fl$()
FileList fl$,"*"
count = Ubound(fl$)
If ArrayDims(a) Then
Redim nl$(Lbound(fl$) To Ubound(fl$))
For x = 1 To count
nl$(x) = fl$(x)
Next x
MsgBox "The last element of the new array is: " & nl$(count)
End If
End Sub
Platform(s)
All.
See Also
LBound (function)
ArrayDims (function)
Arrays (topic)
Syntax
UCase[$](text)
Description
UCase$ returns a String, whereas UCase returns a String variant.
Example
This example uses the UCase$ function to change a string from lowercase to
uppercase.
Sub Main()
a1$ = "this string was lowercase, but was converted."
a2$ = UCase$(a1$)
MsgBox a2$
End Sub
Platform(s)
All.
See Also
LCase, LCase$ (functions)
Unlock (statement)
Unlocks a section of the specified file, allowing other processes access to that
section of the file.
Syntax
Unlock [#] filenumber [,{record | [start] To end}]
Description
The Unlock statement requires the following parameters:
For sequential files, the record, start, and end parameters are ignored: the entire file
is unlocked.
start to end Unlock the specified range of records (for Random files) or
bytes (for Binary files).
The unlock range must be the same as that used by the Lock statement.
Example
This example creates a file named test.dat and fills it with ten string variable
records. These are displayed in a dialog box. The file is then reopened for read/
write, and each record is locked, modified, rewritten, and unlocked. The new
records are then displayed in a dialog box.
Const crlf = Chr$(13) + Chr$(10)
Sub Main()
a$ = "This is record number: "
b$ = "0"
rec$ = ""
msg = ""
Open "test.dat" For Random Access Write Shared As #1
For x = 1 To 10
rec$ = a$ & x
Lock #1,x
Put #1,,rec$
Unlock #1,x
msg = msg & rec$ & crlf
Next x
Close
MsgBox "The records are: " & crlf & msg
msg = ""
Open "test.dat" For Random Access Read Write Shared As #1
For x = 1 to 10
rec$ = Mid$(rec$,1,23) & (11 - x)
Lock #1,x 'Lock it for our use.
Put #1,x,rec$'Nobody's changed it.
UnLock #1,x
msg = msg & rec$ & crlf
Next x
MsgBox "The records are: " & crlf & msg
Close
Kill "test.dat"
End Sub
Platform(s)
All.
See Also
Lock (statement)
Open (statement)
User-defined types (UDTs) are structure definitions created using the Type
statement. UDTs are equivalent to C language structures.
Declaring Structures
The Type statement is used to create a structure definition. Type declarations must
appear outside the body of all subroutines and functions within a procedure and
are therefore global to an entire procedure.
Once defined, a UDT can be used to declare variables of that type using the Dim,
Public, or Private statement. The following example defines a rectangle structure:
Type Rect
left As Integer
top As Integer
right As Integer
bottom As Integer
End Type
:
Sub Main()
Dim r As Rect
:
r.left = 10
End Sub
Any fundamental data type can be used as a structure member, including other
user-defined types. Only fixed arrays can be used within structures.
Copying Structures
UDTs of the same type can be assigned to each other, copying the contents. No
other standard operators can be applied to UDTs.
Dim r1 As Rect
Dim r2 As Rect
:
r1 = r2
When copying structures of the same type, all strings in the source UDT are
duplicated and references are placed into the target UDT.
The LSet statement can be used to copy a UDT variable of one type to another:
LSet variable1 = variable2
LSet cannot be used with UDTs containing variable-length strings. The smaller of
the two structures determines how many bytes get copied.
Passing Structures
UDTs can be passed both to user-defined routines and to external routines, and
they can be assigned. UDTs are always passed by reference.
Since structures are always passed by reference, the ByVal keyword cannot be used
when defining structure arguments passed to external routines (using Declare).
The ByVal keyword can only be used with fundamental data types such as Integer
and String.
Passing structures to external routines actually passes a far pointer to the data
structure.
Size of Structures
The Len function can be used to determine the number of bytes occupied by a UDT:
Len(udt_variable_name)
Since strings are stored in Docbasic's data space, only a reference (currently, 2
bytes) is stored within a structure. Thus, the Len function may seem to return
incorrect information for structures containing strings.
Val (function)
Syntax
Val(number)
Description
The number parameter can contain any of the following:
Leading minus sign (for nonhex or octal numbers only)
Hexadecimal number in the format &Hhexdigits
Octal number in the format &Ooctaldigits
Floating-point number, which can contain a decimal point and an optional
exponent
The Val function continues to read characters from the string up to the first
nonnumeric character.
Example
This example inputs a number string from an InputBox and converts it to a number
variable.
Sub Main()
a$ = InputBox$("Enter anything containing a number","Enter Number")
b# = Val(a$)
MsgBox "The value is: " & b#
End Sub
The following table shows valid strings and their numeric equivalents:
' "1 2 3"123
' "12.3"12.3
' "&HFFFF"-1
' "&O77"63
' "12.345E-02".12345
Platform(s)
All.
See Also
CDbl (function)
Str, Str$ (functions)
A data type used to declare variables that can hold one of many different types of
data.
Syntax
Variant
Description
During a variant's existence, the type of data contained within it can change.
Variants can contain any of the following types of data:
Logical Boolean.
String String.
Object Object.
Variant is the default data type for Docbasic. If a variable is not explicitly declared
with Dim, Public, or Private, and there is no type-declaration character (i.e., #, @, !,
%, or &), then the variable is assumed to be Variant.
The following functions are used to query the type of data contained within a
variant:
Function Description
VarType Returns a number representing the type of data contained within the
variant.
IsNumeric Returns True if a variant contains numeric data. The following are
considered numeric:
If a variant contains a string, this function returns True if the string can be
converted to a number.
IsDate Returns True if a variant contains a date. If the variant contains a string,
then this function returns True if the string can be converted to a date. If
the variant contains an Object, then this function returns True if the
default property of that object can be converted to a date.
Assigning to Variants
Before a Variant has been assigned a value, it is considered empty. Thus,
immediately after declaration, the VarType function will return ebEmpty. An
uninitialized variant is 0 when used in numeric expressions and is a zero-length
string when used within string expressions.
A Variant is Empty only after declaration and before assigning it a value. The only
way for a Variant to become Empty after having received a value is for that variant
to be assigned to another Variant containing Empty, for it to be assigned explicitly
to the constant Empty, or for it to be erased using the Erase statement.
When a variant is assigned a value, it is also assigned that value's type. Thus, in all
subsequent operations involving that variant, the variant will behave like the type
of data it contains.
Operations on Variants
Normally, a Variant behaves just like the data it contains. One exception to this rule
is that, in arithmetic operations, variants are automatically promoted when an
overflow occurs. Consider the following statements:
Dim a As Integer,b As Integer,c As Integer
Dim x As Variant,y As Variant,z As Variant
a% = 32767
b% = 1
c% = a% + b%'This will overflow.
x = 32767
y = 1
z = x + y 'z becomes a Long because of Integer overflow.
In the above example, the addition involving Integer variables overflows because
the result (32768) overflows the legal range for integers. With Variant variables, on
the other hand, the addition operator recognizes the overflow and automatically
promotes the result to a Long.
Adding Variants
The + operator is defined as performing two functions: when passed strings, it
concatenates them; when passed numbers, it adds the numbers.
With variants, the rules are complicated because the types of the variants are not
known until execution time. If you use +, you may unintentionally perform the
wrong operation.
It is recommended that you use the & operator if you intend to concatenate two
String variants. This guarantees that string concatenation will be performed and
not addition.
The only way that a Variant becomes Null is if you assign it as shown above.
The Null value can be useful for catching errors since its value propagates through
an expression.
Variant Storage
Variants require 16 bytes of storage internally:
A 2-byte type
A 2-byte extended type for data objects
4 bytes of padding for alignment
An 8-byte value
Unlike other data types, writing variants to Binary or Random files does not write
16 bytes. With variants, a 2-byte type is written, followed by the data (2 bytes for
Integer and so on).
Disadvantages of Variants
The following are some disadvantages of variants:
Using variants is slower than using the other fundamental data types (i.e.,
Integer, Long, Single, Double, Date, Object, String, Currency, and Boolean).
Each operation involving a Variant requires examination of the variant's
type.
Variants require more storage than other data types (16 bytes as opposed to
8 bytes for a Double, 2 bytes for an Integer, and so on).
Unpredictable behavior. You may write code to expect an Integer variant. At
runtime, the variant may be automatically promoted to a Long variant,
causing your code to break.
Sub Main()
Dim i As Integer
Foo i 'Pass an integer by reference.
End Sub
In the above example, since an Integer is passed by reference (meaning that the
caller can change the original value of the Integer), the caller must ensure that no
attempt is made to change the variant's type.
Sub Main()
Dim a As Variant
Foo a 'Compiler gives type-mismatch error here.
End Sub
Platform(s)
All.
See Also
Boolean (data type)
Currency (data type)
Date (data type)
Double (data type)
Integer (data type)
Long (data type)
Object (data type)
Single (data type)
String (data type)
DefType (statement)
CVar (function)
Empty (constant)
Null (constant)
VarType (function)
VarType (function)
Syntax
VarType(variable)
Description
The variable parameter is the name of any Variant.
The following table shows the different values that can be returned by VarType:
0 ebEmpty Uninitialized
2 ebInteger Integer
3 ebLong Long
4 ebSingle Single
5 ebDouble Double
6 ebCurrency Currency
7 ebDate Date
8 ebString String
11 ebBoolean Boolean
Comments
When passed an object, the VarType function returns the type of the default
property of that object. If the object has no default property, then either ebObject or
ebDataObject is returned, depending on the type of variable.
Example
Sub Main()
Dim v As Variant
v = 5& 'Set v to a Long.
Platform(s)
All.
See Also
Empty (constant)
Null (constant)
Variant (data type)
Weekday (function)
Returns an Integer value representing the day of the week given by date. Sunday is
1, Monday is 2, and so on.
Syntax
Weekday(date)
Description
The date parameter is any expression representing a valid date.
Example
This example gets a date in an input box and displays the day of the week and its
name for the date entered.
Sub Main()
Dim a$(7)
a$(1) = "Sunday"
a$(2) = "Monday"
a$(3) = "Tuesday"
a$(4) = "Wednesday"
a$(5) = "Thursday"
a$(6) = "Friday"
a$(7) = "Saturday"
Reprompt:
bd = InputBox$("Please enter your birthday.","Enter Birthday")
If Not(IsDate(bd)) Then Goto Reprompt
dt = DateValue(bd)
dw = WeekDay(dt)
Msgbox "You were born on day " & dw & ", which was a " & a$(dw)
End Sub
Platform(s)
All.
See Also
Day (function)
Minute (function)
Second (function)
Month (function)
Year (function)
Hour (function)
DatePart (function)
While...Wend (statement)
Syntax
While condition
[statements]
Wend
Description
The condition is initially and then checked at the top of each iteration through the
loop.
Example
This example executes a While loop until the random number generator returns a
value of 1.
Sub Main()
x% = 0
count% = 0
While x% <> 1 And count% < 500
x% = Rnd(1)
If count% > 1000 Then
Exit Sub
Else
count% = count% + 1
End If
Wend
MsgBox "The loop executed " & count% & " times."
End Sub
Platform(s)
All.
See Also
Do...Loop (statement)
For...Next (statement)
Width# (statement)
Specifies the line width for sequential files opened in either Output or Append
mode.
Syntax
Width# filenumber,newwidth
Description
The Width# statement requires the following parameters:
When a file is initially opened, there is no limit to line length. This command forces
all subsequent output to the specified file to use the specified value as the
maximum line length.
The Width statement affects output in the following manner: if the column position
is greater than 1 and the length of the text to be written to the file causes the column
position to exceed the current line width, then the data is written on the next line.
The Width statement also affects output of the Print command when used with the
Tab and Spc functions.
Example
This statement sets the maximum line width for file number 1 to 80 columns.
Sub Main()
Width #1,80
End Sub
Platform(s)
All.
See Also
Print (statement)
Print# (statement)
Tab (function)
Spc (function)
Word$ (function)
Returns a String containing a single word or sequence of words between first and
last.
Syntax
Word$(text$,first[,last])
Description
The Word$ function requires the following parameters:
first Integer specifing the index of the first word in the sequence
to return. If last is not specified, then only that word is
returned.
Words are separated by any nonalphanumeric characters such as spaces, tabs, end-
of-lines, and punctuation.
If first is greater than the number of words in text$, then a zero-length string is
returned.
If last is greater than the number of words in text$, then all words from first to the
end of the text are returned.
Example
This example finds the name "Stuart" in a string and then extracts two words from
the string.
Sub Main()
s$ = "My last name is Williams; Stuart is my surname."
c$ = Word$(s$,5,6)
MsgBox "The extracted name is: " & c$
End Sub
Platform(s)
All.
See Also
Item$ (function)
ItemCount (function)
Line$ (function)
LineCount (function)
WordCount (function)
WordCount (function)
Syntax
WordCount(text$)
Description
Words are separated by spaces, tabs, and end-of-lines.
Example
This example counts the number of words in a particular string.
Sub Main()
s$ = "My last name is Williams; Stuart is my surname."
i% = WordCount(s$)
MsgBox "'" & s$ & "' has " & i% & " words."
End Sub
Platform(s)
All.
See Also
Item$ (function)
ItemCount (function)
Line$ (function)
LineCount (function)
Word$ (function)
Write# (statement)
Syntax
Write [#]filenumber [,expressionlist]
Description
The file referenced by filenumber must be opened in either Output or Append
mode.
The filenumber parameter is an Integer used by Docbasic to refer to the open file—
the number passed to the Open statement.
Any numeric type Written as text. There is no leading space, and the period is always used as
the decimal separator.
The Write statement outputs variables separated with commas. After writing each
expression in the list, Write outputs an end-of-line.
The Write statement can only be used with files opened in Output or Append
mode.
Example
This example opens a file for sequential write, then writes ten records into the file
with the values 10...50. Then the file is closed and reopened for read, and the
records are read with the Input statement. The results are displayed in a dialog box.
Sub Main()
Open "test.dat" For Output Access Write As #1
For x = 1 To 10
r% = x * 10
Write #1,x,r%
Next x
Close
MsgBox msg
Close
End Sub
Platform(s)
All.
See Also
Open (statement)
Put (statement)
Print# (statement)
WriteIni (statement)
Syntax
WriteIni section$,ItemName$,value$[,filename$]
Description
The WriteIni statement requires the following parameters:
ItemName$ String specifying which item from within the given section
you want to change. If ItemName$ is a zero-length string
(""), then the entire section specified by section$ is deleted.
value$ String specifying the new value for the given item. If value$
is a zero-length string (""), then the item specified by
ItemName$ is deleted from the ini file.
Example
This example sets the txt extension to be associated with Notepad.
Sub Main()
WriteIni "Extensions","txt","c:\windows\notepad.exe ^.txt","win.ini"
End Sub
Platform(s)
Windows, Win32.
If the filename$ parameter does not include a path, then this statement looks for ini
files in the Windows directory.
See Also
ReadIni$ (function)
ReadIniSection (statement)
Xor (operator)
Syntax
expression1 Xor expression2
Description
If both expressions are either Boolean, Boolean variants, or Null variants, then a
logical exclusion is performed as follows:
Table 3-83 Effect of Boolean, Boolean Variant, and Null Expressions on the Xor Operator
If the first expression is and the second expression is Then the result is
Binary Exclusion
If the two expressions are Integer, then a binary exclusion is performed, returning
an Integer result. All other numeric types (including Empty variants) are
converted to Long, and a binary exclusion is then performed, returning a Long
result.
Binary exclusion forms a new value based on a bit-by-bit comparison of the binary
representations of the two expressions according to the following table:
1 Xor 1 = 0
0 Xor 1 = 1
1 Xor 0 = 0
0 Zor 0 = 0
Example
This example builds a logic table for the XOR function and displays it.
Sub Main()
For x = -1 To 0
For y = -1 To 0
z = x Xor y
msg = msg & Format(x,"True/False") & " Xor "
msg = msg & Format(y,"True/False") & " = "
msg = msg & Format(z,"True/False") & Basic.Eoln$
Next y
Next x
MsgBox msg
End Sub
Platform(s)
All.
See Also
Operator Precedence (topic)
Or (operator)
Eqv (operator)
Imp (operator); And (operator)
Year (function)
Returns the year of the date encoded in the date parameter. The value returned is
between 100 and 9999 inclusive.
Syntax
Year(date)
Description
The date parameter is any expression representing a valid date.
Example
This example returns the current year in a dialog box.
Sub Main()
tdate$ = Date$
tyear! = Year(DateValue(tdate$))
MsgBox "The current year is: " & tyear$
End Sub
Platform(s)
All.
See Also
Day (function)
Minute (function)
Second (function)
Month (function)
Hour (function)
Weekday (function)
DatePart (function)
The final section of this appendix contains a listing of the files without annotations.
The code in this example automatically displays the Attributes dialog box
whenever a user checks in a document, and generates a PDF request whenever a
user checks in a document or imports a document. This ensures that users comply
with regulatory requirements that certain information to be on all documents, or a
company policy that requires all documents be stored in a company-wide readable
file format (.PDF).
This example is made up of two files, DEFINES.SCR and HANDLERS.EBS. The file
DEFINES.SCR should be the content of a dm_script object placed in the /
Workspace Customizations/Startup Items folder of a system, group, or user
cabinet. The file HANDLERS.EBS is the content of a dm_procedure object called
"Handlers" placed in /System/Test Docbasic Procedures. This object consists of
procedures written in Docbasic.
DEFINES.SCR File
The file DEFINES.SCR contains the Define method calls that redirect certain
methods to Docbasic procedures. These procedures are specified in
HANDLERS.EBS.
The following code tells Workspace to redirect the Checkindw method to the
Docbasic procedure checkindw_handler. The path to the file HANDLERS.EBS is
hard-coded. The checkindw_handler procedure runs whenever a user checks in a
document or other System Object.
define,c,dcapp,checkindw,*,basic,
'/System/Test Docbasic Procedures/Handlers',checkindw_handler
The following code tells Workspace to redirect the Import method to the Docbasic
procedure import_handler. The import_handler procedure runs whenever a user
imports a file from an external file system to a folder or cabinet.
define,c,dcapp,import,*,basic,
'/System/Test Docbasic Procedures/Handlers',import_handler
HANDLERS.EBS File
The file HANDLERS.EBS contains Docbasic procedures that process the
Checkindw and Import methods. These methods are redirected by the code in
DEFINES.SCR.
Checkindw_handler Procedure
automatically generated for most objects so that the user does not have to
specifically request a PDF rendition.
The following code assigns a descriptive name for the procedure to a variable so
that it can be displayed later in the procedure.
appname$ = "Checkin handler procedure"
The following code gets the object ID of the object the user is checking in by
extracting the fourth item from the Mthd argument, which is the redirected
Checkindw method call. The function dmget_arg is declared later in this file.
oid$ = dmget_arg(Mthd, 4)
The following code determines what type of object is being checked in.
otype$ = dmAPIGet("get,c," & oid$ & ",r_object_type")
The following code lists the types of objects for which checkindw_handler will not
generate a PDF request.
notlist$ = "dm_script,dm_query,dm_router,dm_procedure"
The following code displays the Attributes dialog box so that the user can fill in the
attributes for this object before checking it in.
st% = dmAPIExec("attributes,c,dcapp," & oid$)
The following code returns the Checkindw method to Workspace to perform the
check-in.
newoid$ = dmAPIGet(Mthd)
The following code checks to see whether the previous dmAPIGet call returned a
valid object ID, which indicates that the import succeeded. Valid object IDs are 16
characters in length. If the object ID is not valid, the code assumes the user
cancelled the checkin, and checkindw_handler exits.
If Len(newoid$) <> 16 Then
msgbox "User cancelled the checkin.",ebInformation,appname$
End
End If
The following code checks to see whether the object is in notlist$, the list of objects
for which checkindw_handler will not generate a PDF request. If the object is in the
list, checkindw_handler exits.
The following code executes if the object is not in notlist$. The code prompts the
user to confirm whether they want a PDF rendition of the object.
r=msgbox("Would you like a PDF rendition for this document?" _
,ebYesNo or ebDefaultButton1 or ebQuestion,appname$)
The following code generates the PDF request if the user confirms that they would
like a PDF rendition.
if r = ebYes then
stamp$ = dmAPIGet("queue,c," & newoid$ & _
",dm_autorender_win31,no_real_message,5,F,,render_request_pdf")
The following code displays an error message if the return value from the previous
dmAPIGet call indicates that the code was unable to generate the PDF request.
If stamp$ = "" Then
MsgBox "Unable to queue the PDF request", ebInformation, appname$
The following code displays an informational message if the return value from
dmAPIGet indicates that the PDF request was generated.
else
msgbox "Your PDF request has been queued.",ebInformation,appname$
End If
End If
Import_handler Procedure
The following code begins the declaration of the import_handler procedure. The
Mthd parameter passes the Import method and its parameters into the procedure.
Sub import_handler (Mthd As String)
The following code gets the object ID of the object the user is importing by
extracting the fourth item from the Mthd argument, which is the redirected Import
method call. The function dmget_arg is declared later in this file.
otype$ = dmget_arg(Mthd, 4)
The following code lists the types of objects for which import_handler will not
generate a PDF request.
notlist$ = "dm_script,dm_query,dm_router,dm_procedure"
The following code returns the Import method to Workspace to perform its usual
tasks.
newoid$ = dmAPIGet(Mthd)
The following code checks to see whether the previous dmAPIGet call returned a
valid object ID. Valid object IDs are 16 characters in length. If the object ID is not
valid, the code assumes the user cancelled the import, and import_handler exits.
If Len(newoid$) <> 16 Then
End
End If
The following code checks to see whether the object is in notlist$, the list of objects
for which import_handler will not generate a PDF request. If the object is in the list,
import_handler exits.
If InStr(notlist$, otype$) > 0 Then
End
End If
The following code executes if the object is not in notlist$. The code prompts the
user to confirm whether they want a PDF rendition of the object.
r=msgbox("Would you like a PDF rendition for this document?" _
,ebYesNo or ebDefaultButton1 or ebQuestion,appname$)
The following code generates the PDF request if the user confirms that they would
like a PDF rendition.
if r = ebYes then
stamp$ = dmAPIGet("queue,c," & newoid$ & _
",dm_autorender_win31,no_real_message,5,F,,render_request_pdf")
The following code displays an error message if the return value from the previous
dmAPIGet call indicates that the code was unable to generate the PDF request.
If stamp$ = "" Then
MsgBox "Unable to queue the PDF request", ebInformation, appname$
The following code displays an informational message if the return value from
dmAPIGet indicates that the PDF request was generated.
else
msgbox "Your PDF request has been queued.",ebInformation,appname$
End If
End If
Dmget_arg Procedure
The following code begins the declaration of the dmget_arg procedure. The method
parameter passes the method and its parameters into the procedure. The position
parameter specifies which portion of the method call to return. If position is 1,
dmget_arg will return the method name rather than an argument.
Function dmget_arg (method As String, position As Integer) As String
appname$ = "dmget_arg procedure"
The following code initializes the return value of the function to an empty string.
dmget_arg = ""
The following code defines a loop that will step through the method call,
identifying substrings until the counter equals the specified position.
For i = 1 To position
If (i > 1) Then
doevents
start=finish+2
End If
finish = InStr(start, method, ",")-1
If (finish = -1) Then
If i=position Then
dmget_arg=mid$(method, start)
Else
dmget_arg=""
End If
Exit Function
else
End If
next i
dmget_arg = mid$(method, start, finish-start+1)
End Function
AUTODOWN.SCR File
The file AUTODOWN.SCR contains an Execute method call that runs a Docbasic
procedure. This procedure is specified in AUTODOWN.EBS.
execute,c,procedure,'/System/Docbasic Procedures/Auto-Down',main
AUTODOWN.EBS File
The file AUTODOWN.EBS contains a Docbasic procedure that automatically
downloads files from a docbase. This procedure is executed by the code in
AUTODOWN.SCR.
Main Procedure
The following code assigns a descriptive name for the procedure to a variable so
that it can be displayed later in the procedure.
appname$ = "Auto-Downloader"
The following code declares a new variable that stores the End of Line and New
Line characters.
nl$ = chr$(10) & chr$(13)
The following code uses a query to get the objects in the /System/Auto-Down
folder.
query$ = "select r_object_id from dm_sysobject where _
"query$ = query$ & "folder('/System/Auto-Down')" _
colid$ = dmAPIGet("readquery,c," & query$)
The following code checks the Collection ID to make sure the query parsed
correctly. Valid Collection IDs are two characters long. If the query could not be
parsed, the procedure exits.
if len(colid$) <> 2 then
smsg$ = dmAPIGet("getmessage,c")
msgbox "Unable to query contents of Auto-Down:" + nl$ + _
smsg$,ebInformation,appname$
Exit Sub
end if
The following code updates variables as each file is processed by the loop.
oid$ = dmAPIGet("get,c," & colid$ & ",r_object_id")
testfile$ = dmAPIGet("get,c," & oid$ & ",object_name")
testdate$ = dmAPIGet("get,c," & oid$ & ",r_modify_date")
mymsg = "Testing existence of: " & testfile$
The following code executes if the file was found on the user’s local drive. The
code checks to see whether the user’s local copy of the file is older than the version
found by the query in the docbase. If so, the code prompts the user to indicate
whether to download the newer version from the docbase. The code assumes that
the file is in the user’s current working directory.
If FileExists(testfile$) then
locfiledate# = FileDateTime(testfile$)
if datevalue(testdate$) > locfiledate# then
r = msgbox("Your local copy of " & testfile$ & " is old." & nl$_
& "Would you like to download the latest from the docbase?",_
ebYesNo or ebDefaultButton1 or ebQuestion ,appname$)
The following code downloads the file if the user requests it. The third End If
matches the If Datevalue statement in the previous code segment.
if r = ebYes then
msgsettext "downloading " & testfile$ & " now"
locf$ = dmAPIGet("getfile,c," & oid$ & "," & testfile$)
if len(locf$) = 0 then
msgbox "Error downloading " & testfile$,ebInformation,appname$
end if
end if
end if
The following code executes if the file was not found on the user’s local drive. The
code prompts the user to indicate whether to download the file from the docbase.
else
r = msgbox("You have no local copy of " & testfile$ & nl$ & _
"Would you like to download the latest from the docbase?",ebYesNo _
or ebDefaultButton1 or ebQuestion ,appname$)
The following code downloads the file if the user requests it. The third End If
matches the If FileExists statement earlier in the code.
if r = ebYes then
locf$ = dmAPIGet("getfile,c," & oid$ & "," & testfile$)
if len(locf$) = 0 then
msgbox "Error downloading " & testfile$,ebInformation,appname$
end if
end if
End If
The following code marks the end of the loop that downloads files.
Wend
DEFINES.SCR
define,c,dcapp,checkindw,*,basic,_
'/System/Test Docbasic Procedures/Handlers',checkindw_handler
define,c,dcapp,import,*,basic,_
'/System/Test Docbasic Procedures/Handlers',import_handler
HANDLERS.EBS
Sub checkindw_handler (Mthd As String)
appname$ = "Checkin handler procedure"
msgbox "Start checkin handler procedure",ebInformation,appname$
oid$ = dmget_arg(Mthd, 4)
otype$ = dmAPIGet("get,c," & oid$ & ",r_object_type")
notlist$ = "dm_script,dm_query,dm_router,dm_procedure"
st% = dmAPIExec("attributes,c,dcapp," & oid$)
newoid$ = dmAPIGet(Mthd)
End Sub
End Sub
End If
MsgBox emsg$
If fatalerr% Then End
End Sub
AUTODOWN.SCR
execute,c,procedure,'/System/Docbasic Procedures/Auto-Down',main
AUTODOWN.EBS
Sub Main(method as string)
appname$ = "Auto-Downloader"
nl$ = chr$(10) & chr$(13)
query$ = "select r_object_id from dm_sysobject where"
query$ = query$ & "folder('/System/Auto-Down')"
colid$ = dmAPIGet("readquery,c," & query$)
if len(colid$) <> 2 then
smsg$ = dmAPIGet("getmessage,c")
msgbox "Unable to query contents of Auto-Down:" + nl$ +_
smsg$,ebInformation,appname$
Exit Sub
end if
r = msgbox("You have no local copy of " & testfile$ & nl$ &_
"Would you like to download the latest from the docbase?",_
ebYesNo or ebDefaultButton1 or ebQuestion ,appname$)
if r = ebYes then
locf$ = dmAPIGet("getfile,c," & oid$ & "," & testfile$)
if len(locf$) = 0 then
msgbox "Error downloading " &
testfile$,ebInformation,appname$
end if
end if
End If
Wend
st% = dmAPIExec("close,c," & colid$)
End Sub
A few error messages contain placeholders which get replaced by the runtime
when forming the completed runtime error message. These placeholders appear in
the following list as the italicized word placeholder.
6 Overflow
7 Out of memory
11 Division by zero
13 Type mismatch
19 No Resume
51 Internal error
61 Disk full
68 Device unavailable
70 Permission denied
140 Dialog control identifier does not match any current control
141 The placeholder statement is not available on this dialog control type
163 This statement can only be used when a user dialog is active
432 File name or class name not found during OLE Automation operation
25 Out of memory
42 Duplicate label
48 Unknown type
52 0 expected
58 Expecting 0 or 1
65 Internal error 1
67 Internal error 3
68 Division by zero
69 Overflow in expression
&
'
()
*
+
-
/
<
<=
<>
= (assignment)
= (operator)
>
>=
\
^
_
Abs
And
ArrayDims
ArraySort
Asc
Atn
Basic.Capability
Basic.Eoln$
Basic.FreeMemory
Basic.HomeDir$
Basic.OS
Basic.PathSeparator$
Basic.Version$
Beep
Boolean
Call
CBool
CCur
CDate
CDbl
ChDir
ChDrive
Choose
Chr, Chr$
CInt
Clipboard$ (function)
Clipboard$ (statement)
Clipboard.Clear
Clipboard.GetFormat
Clipboard.GetText
Clipboard.SetText
CLng
Close
Command, Command$
Const
Cos
CreateObject
CSng
CStr
CurDir, CurDir$
Currency
CVar
CVDate
CVErr
Date
Date, Date$ (functions)
Date, Date$ (statements)
DateAdd
DateDiff
DatePart
DateSerial
DateValue
Day
DDB
DDEExecute
DDEInitiate
DDEPoke
DDERequest, DDERequest$
DDESend
DDETerminate
DDETerminateAll
DDETimeOut
Declare
DefBool
DefCur
DefDate
DefDbl
DefInt
DefLng
DefObj
DefSng
DefStr
DefVar
Dim
Dir, Dir$
DiskDrives
DiskFree
Do...Loop
Double
End
Environm Environ$
Eof
Eqv
Erase
Erl
Err (function)
Err (statement)
Error
Error, Error$
Exit Do
Exit For
Exit Function
Exit Sub
Exp
FileAttr
FileCopy
FileDateTime
FileDirs
FileExists
FileLen
FileList
FileParse$
FileType
Fix
For...Next
Format, Format$
FreeFile
Function...End
Fv
Get
GetAttr
GetObject
Global
GoSub
Goto
Hex, Hex$
Hour
If...Then...Else
IIf
Imp
Inline
Input#
Input, Input$
InputBox, InputBox$
InStr
Int
Integer
IPmt
IRR
Is
IsDate
IsEmpty
IsError
IsMissing
IsNull
IsNumeric
IsObject
Item$
ItemCount
Kill
LBound
LCase, LCase$
Left, Left$
Len
Let
Like
Line Input #
Line$
LineCount
Loc
Lock
Lof
Log
Long
LSet
LTrim, LTrim$
MacID
MacScript
Main
Mci
Mid, Mid$
Mid, Mid$
Minute
MIRR
MkDir
Mod
Month
MsgBox (function)
MsgBox (statement)
Name
Not
Nothing
Now
NPer
Npv
Object
Oct. Oct$
OKButton r
On Error
Open
OpenFilename$
Option Base
Option CStrings
Or
Pmt
PPmt
Print
Print #
Private
Public
Put
Pv
Random
Randomize
Rate
ReadINI$
ReadINISection
ReDim
REM
Reset
Resume
Return
Right, Right$
RmDir
Rnd
RSet
RTrim, RTrim$
SaveFileName$
Second
Seek
Seek
Select...Case
Set
SetAttr
Sgn
Shell
Sin
Single
Sleep
Sln
Space, Space$
Spc
Sqr
Stop
Str, Str$
StrComp
String
String, String$
Sub...End
Switch
SYD
Tab
Tan
Time, Time$ (functions)
Time, Time$ (statements)
Timer
TimeSerial
TimeValue
Trim, Trim$
Type
UBound
UCase, UCase$
UnLock
Val
Variant
VarType
Weekday
While...Wend
Width#
Word$
WordCount
Write #
Xor
Year
The stack is also used by the runtime for storage of intermediate values, so
the actual available stack space will be slightly less.
Note: The application vendor can change the above stack limitation to any
value up to 8K.
The data area that holds private variables is limitated to 16K. This data space
contains all private variables except strings and arrays, which are stored in
the string space.
The data area that holds public variables is limited to 16K. This data space
contains all public variables except strings and arrays, which are stored in
the string space.
The size of a source procedure is limited to 65534 characters. This limitation
can be avoided by breaking up large procedures into smaller ones.
A compiled procedure consists of p-code, constant data, and symbolic
information, each of which is limited to 64K. These limitations can be
avoided by breaking up large procedures into smaller ones, which is rarely
necessary.
Arrays can have up to 60 dimensions.
Variable names are limited to 80 characters.
Labels are limited to 80 characters.
Each executing procedure contains a table of structures that track calls made
to external routines. Each structure is approximately 88 bytes with an overal
size limited to 64K.
The number of open DDE channels is not fixed; rather, it is limited only by
available memory and system resources.
The number of open files is limited to 255 or the operating system limit,
whichever is less.
The number of characters within a string literal (a string enclosed within
quotation marks) is limited to 1024 characters. (Strings can be concatenated
using the concatenation [&] operator with the normal string limit of 32,764
characters.)
The number of nesting levels (i.e., loops within loops) is limited by compiler
memory.
Each GoSub requires 2 bytes of the Docbasic runtime stack.
Arrays and user-defined types cannot be passed to a method of an OLE
automation object.
Arrays and user-defined types cannot be set as the value of a property of an
OLE automation object.
Arrays and user-defined types cannot be returned from a method or
property of an OLE automation object.
Array indexes must be in the following range:
Arrays
VB and VBA support huge arrays, Docbasic does not.
Constants
VBA supports shared constants (using the Public keyword). In Docbasic, constants
must be repeated within each procedure in which they are used.
VB and VBA do not allow the concatenation of constant elements. For example, the
following procedure compiles in Docbasic but not in VB or VBA:
Const t$ = "Hello" & Chr$(9) & "there."
Sub Main()
Msgbox t$
End Sub
Sub Main()
Const t$ = "Good Bye"
MsgBox t$ 'Displays Good Bye
End Sub
Data Types
Docbasic and VBA support the Boolean and Date data types, VB does not.
Declarations
In VB and VBA, if a variable is initially declared with a type declaration character,
then that character must appear with every use of that variable. Docbasic relaxes
this by not requiring the type declaration character with every use of that variable.
Both VB and VBA support the Static keyword as a modifier for the Sub and
Function statements. Docbasic supports use of this keyword with these statements
with no effect.
In Docbasic, the above procedure will compile, but gives a Sub or function not
defined error when executed. In VB and VBA, this will automatically declare a
variable called a$ as a String.
Declare Statement
VBA supports shared Declare statements (using the Public keyword). In Docbasic,
these must be declared in every procedure in which they are used.
Docbasic and VB pass values to external routines in the same manner with the
following exceptions:
Docbasic passes True or False as Boolean values (signed short in C). VB passes
these as Boolean variants.
Variants are passed as internal variant structures in both Docbasic and VB. For all
numeric values, the types are the same. Strings, however, in Docbasic are passes as
a 16-bit internal value, whereas in VB they are passed as a 32-bit pointer to a null-
terminated string.
The variant structure in both systems is a 4-byte type (a 32-bit integer—the same
value as returned by the VarType function), followed by 4 bytes of slop, followed
by the value of the variable, as shown below:
Strings within variants are passed within an internal variant structure in both
Docbasic and VB.
a = 1000
b = .00001
a = a + b
MsgBox a
In VB and VBA, since the variables a and b are assigned Double values, the
addition is performed between two doubles, resulting in the value 1000.00001. In
Docbasic, on the other hand, a and b are assigned Single values, resulting in an
addition between two singles. When these two singles are added, there is a loss of
precision resulting in the value 1000.
In situations such as this, you should explicitly force the types using type-
declaration characters. The above code can be re-written as follows:
Dim a As Variant,b As Variant
a = 1000#
b = .00001#
a = a + b
Currency Numbers
In VB , Double numbers do not convert to Currency numbers the same way. In VB,
for example, the following procedure will fail:
Sub Main
result = CCur("-1.401298E-45")
End Sub
Docbasic does not support any of the following VBA language elements:
Array Function
ebHiragana Constant
ebKatakana Constant
ebLowerCase Constant
ebNarrow Constant
ebProperCase Constant
ebUpperCase Constant
ebWide Constant
IsArray Function
LenB Function
LoadPicture Function
On...Gosub Statement
On...Goto Statement
Static Statement
StrConv Function
TypeName Function
TypeOf Function
The syntax for MsgBox does not support the context and HelpFile parameters.
Objects
Docbasic does not support any of VB's objects (except clipboard, screen, and a few
others).
OLE Automation
Docbasic does not support named parameters. Visual Basic does not support
named parameters either; this is a feature of VBA.
Docbasic does not support the VBA bracket syntax used with OLE automation
objects. For example, the following two expressions are equivalent in VBA:
Application.Workbooks(1).Worksheets(“Sheet1”).Range(“A1”)
[A1]
Docbasic does not support the VBA bracket syntax used to resolve the scope of a
method or property:
Dim a As Object
Set a = CreateObject("Word.Basic")
a.[MsgBox] "Hello, world."'<-- Won't work in Docbasic
Parameter Passing
VB and Docbasic do not support optional parameters. This is supported by VBA.
Strings
In Docbasic, variable-length strings within structures require 2 bytes of storage. In
VB and VBA, variable-length strings within structures require 4 bytes of storage.
Sub Main
Dim a As Sample
MsgBox Len(a)
End Sub
VB and VBA do not accept strings in some functions expecting numbers such as
Int and Fix. Docbasic allows strings as long as they are convertible to numbers.
Dim A As Variant
ABS(19) 'OK
A = "10"
ABS(A) 'OK
ABS("10")'Works in Docbasic, not in VB/VBA
In Docbasic, these functions will accept any data type convertible to a number. If
the data type is a string, Docbasic converts it to a Double.
Variants
Passing variants either by value or by reference to external routines (using the
Declare statement) passes either the entire variant structure (ByVal) or a pointer to
a variant structure (ByRef) used internally by Docbasic. This means that passing
variants to externally declared routines can only be done if that routine is aware of
the internal variant structure used by Docbasic. This applies specifically to strings
and OLE automation objects stored within the variant.
In VB and VBA, on the other hand, strings and OLE automation objects within
variants are stored in their native format (i.e., 32-bit pointer to a null-terminated
string or an LPDISPATCH value).
VBA supports variant arrays; Docbasic and VB do not. This includes use of the
Array and IsArray functions.
End Sub
Sub Main
Dim v As Variant
v = 5
Test v '<-- VBA gives error here
End Sub
In the above procedure, the Declare statement on line 1 defines a prototype for the
Test function that is incompatible with the actual declaration on line 5.
Stack Size
Docbasic uses a default stack of 2K, expandable to 8K. VB and VBA uses a much
larger stack size. For example, VBA allocates approximately 14K for the stack.
Since the stack for Docbasic is smaller, you may have to be more attentive when
using local variables, especially fixed-length strings and structures, since storage
for all local variables comes from the stack.
Note: Variable-length strings only require 2 bytes of storage on the stack. Wherever
possible, use variable length strings in place of fixed-length strings.
Expression Evaluation
With Boolean expressions (i.e., expression involving And, Or, Xor, Eqv, and Imp),
if one operand is Null and the other argument is numeric, then Null is returned
regardless of the value of the other operand. For example, the following expression
returns Null:
Null And 300000
Despite the fact that the expression returns Null, VBA evaluates the numeric
operand anyway, converting it to a Long. If an overflow occurs during conversion,
File Searching
The filename matching algorithm used by Docbasic is different than that used by
VB. This affects commands that perform directory searching, such as Dir, Kill, and
FileList. The following differences exist:
In VB, an asterisk within the filename matches any characters up to the end of the
filename or to the period, whichever comes first.
In VB, the period is a separator for the filename and the extension. In Docbasic, the
period is treated as a normal filename character.
The following table describes the meaning of some common file specifications.
s*e All files that begin with "s". All files that begin with "s" and end
with "e".
s*.* All files that begin with "s". All files that begin "s" and have an
extension.
test. The file "test" with no extension. The file called "test.". Docbasic will
never find this file under Windows.
test.* All files having the root name "test" All files having the root name "test"
with any extension, such as "test", with an extension. The file "test"
"test.txt", and so on. with no extension will not be found.
This filename matching algorithm is the same across all platforms that support
Docbasic.