Internet Newsgroups: comp.lang.basic.visual,comp.answers,news.answers
Subject: comp.lang.basic.visual VB/DOS Frequently Asked Questions
X-Content-Currency: This FAQ changes regularly.  When a saved or printed copy
                    is over 6 months old, please obtain a new one.
Expires: Sun, 8 May 1994 05:30:49 GMT
Organization: Visual Basic FAQ Maintainers
Date: Thu, 21 Apr 1994 05:30:52 GMT
X-Posting-Frequency: Posted on the 5th and 20th of each month.
Summary: Frequently asked questions concerning Visual Basic for DOS.
Keywords: FAQ VISUAL BASIC DOS

               VISUAL BASIC FOR DOS (VBDOS)
            Commonly asked Questions & Answers
                      Section IX - C
           -----------------------------------

PREFACE:
This document is a compilation of frequently asked questions and their
answers about Visual Basic for DOS which have been gathered from the
comp.lang.basic.visual newsgroup.   Although some efforts have been
made to find obvious errors, there is no guarantee that the information in
this document is error-free.  The FAQ maintainer, or anyone else
associated with this document, assume NO liability for the content or use
of this document.  If you find any errors, please report them to the address
given below.

Most FAQs (including this one) are available at the anonymous ftp archive
site "rtfm.mit.edu".  All four parts of the VB FAQ may be found in the
directory "pub/usenet/comp.lang.basic.visual".

You can also have the VB FAQs e-mailed to you by sending a message
to "mail-server@rtfm.mit.edu" with ONLY the text "send
usenet/comp.lang.basic.visual/*" in the body of the message.  This will
send all four parts of the VB FAQ to you in four e-mail messages.

--------------------------------------------------------------------------------
------------

1. How do I use (create) global variables in VBDOS?
   1.1.    VBDOS provides the user with two types of global variables.
           These are both used in declarations of variables.

       To share variables between all subs and functions in a specific
       module, use the SHARED keyword. This makes that specific
       variable global _in that module_. For example:

              DIM SHARED CancelFlag AS INTEGER

       would make the variable CancelFlag a global variable in that
       module.

       To share global variables between separate modules, use the
       COMMON keyword. For example:

            COMMON SHARED CancelFlag AS INTEGER

       would make the variable global between all modules that this
       common statement appears in, and since we are using the
       SHARED keyword also, this will also be shared in all the subs
       and functions in the modules which this declare statement
       appears. All COMMON statements must be matched between
       modules which the variables should be global in. For example,
       if you have one set of 10 COMMON statements in one module,
       and a different set of 10 COMMON statements in another
       module in the same project, you will get a 'Type Mismatch
       Error'. Make all COMMON blocks identical in all the modules
       in a specific project. 

2. Does VBDOS make standalone .exe files?
   2.1.    VBDOS can compile programs in two different ways (user
           option). It can compile programs to use a RUNTIME file (like
           a DLL) or can be compiled as a standalone .exe file. 

3. What is the current version of the VBDOS compiler?
   3.1. VBDOS is currently at version 1.0

4.     How do I not make a text box beep when I hit the enter key?
   4.1.    Put "something else" in your _KeyPress event, depending on
           what you really want. This code example makes *nothing*
           happen, for an extended period of time:

       Sub Text1_KeyPress (KeyAscii As Integer)
           If KeyAscii = 13 Then   '13 is Key_Return
               KeyAscii = 0  '0 (zero) is nothing
           End If
       End Sub

       This might not be a very nice thing to do, since your users
       usually have some intention when they press Enter. Usually
       they will want to jump to the next control, like the Tab key
       does. You will then change the line KeyAscii=0 to KeyAscii=9
       (Key_Tab) in the example above. 

       BTW, you'll also find this in the Microsoft VB
       KnowledgeBase. They add that you should set the MultiLine
       property to False. Of course.

5. How does Visual Basic handle shelled tasks? How do I find out
   when they are finished.
   5.1.    In VBDOS, all shelled tasks are completed before control
           returns to the program. No tasks are done while the DOS
           command is being executed.

6. How do I break lines of long text into multiple lines of text in the
   msgbox?
   6.1.    Use the append a chr$(13) to the end of the string to break
           lines into multiple lines. EG:

           msg$ = "This is line 1" + chr$(13)
           msg$ = msg$ + "This is line 2"
           MSGBOX msg$

7. What's the difference between MODAL and MODELESS forms?
   7.1.    Modal forms are forms which require user input before any
           other actions can be taken place. In other words, a modal form
           has exclusive focus until it is dismissed. When showing a
           modal form, the program pauses at the SHOW command until
           the modal form is either hidden or unloaded. The internal
           MSGBOX and INPUTBOX$ forms are examples of modal
           forms. To show a form modally, use the syntax:
           MyForm.SHOW 1

   7.2.    Modeless forms are those which are shown but do not require
           immediate user input. Most child forms (in a MDI application)
           are typically modeless. To show a form modeless, use the
           syntax: MyForm.SHOW

8. When/Why should I use Option Explicit?
   8.1.    Opinions vary greatly on this subject. The main reason to use
           the OPTION EXPLICIT statement at the top of all modules is
           to minimize the amount of bugs introduced into your code by
           misspelling a variable name. Most variants of BASIC (including
           VB) have the capability to create variables 'on the fly' (without
           any declarations). This capability can be a double edged sword.

       At the minimum, it is suggested to use the DEFINT A-Z
       statement in leu of OPTION EXPLICIT. This statement will
       cause any variables which are created on the fly to be created
       as integers as opposed to single precisions. (Integers take up
       less memory). 

       The OPTION EXPLICIT statement causes VB to 'disable' it's
       ability to create variables on the fly. Thus, all variables must be
       declared using a DIM or REDIM statement. All variables not
       declared will cause an error when the OPTION EXPLICIT
       statement is used. This will eliminate any bugs when a variable
       is misspelled.

9. Why doesn't PRINT or CLS from a frm module work?
   9.1.    To print information to the screen bypassing the desktop, the
           commands must be issued from a .BAS module. All
           PRINT/CLS output from a form module is directed to the nul:
           device.

10.    How do I invoke FKey traps which won't be triggered by other keys
       which share the same KeyCode?
   10.1.   To trap the only FKeys in events you need to use a
           combination of the KeyDown, KeyPress, and KeyUp
           events. 

       The basic concept for this is that _all_ keys trap the UP &
       DOWN events, while only 'printable' characters trigger the
       KeyPress event. Thus, when a character key is pressed, it will
       trigger the KeyDown, the KeyPress, then the KeyUp events (in
       that order). While a FKey (or arrow, or tab, etc...) will trigger
       the KeyDown, then the KeyUp events (in that order). 

       The following code uses a textbox tag property to decide
       whether a printable character is pressed or not.

           SUB Text1_KeyDown()
               Text1.tag = "key"
           END SUB

           SUB Text1_KeyPress()
               Text1.tag = ""
           END SUB

           SUB Text1_KeyUp()
              IF Text1.tag = "key" then
               '--PUT F-KEY HANDLER HERE----
              ELSE
               '--PUT OTHER KEY HANDLERS HERE----
              END IF
           END SUB

11.    How do I boost memory available to VBDOS.EXE (the IDE)?
   11.1.   Try to have as much EMM available as possible.
           VBDOS.EXE allocates subroutines & functions which are
           < 16K into EMM.
   11.2.   To make more conventional mem availble, use the /S:n
           switch. This will make VBDOS.EXE use a specific
           amount of conventional memory. A good compromise
           between speed & memory is /S:340. The lower the n
           value, the slower the environment runs.
   11.3.   Running out of DGROUP usually causes most 'out of
           memory' errors. Possible causes are:
       11.3.1.Too many subs & functions exist. Each one takes up
           46 bytes of DGROUP.
       11.3.2. Large static arrays. All static arrays are stored in
               DGROUP. If a DIM statement is for a COMMON
               SHARED statement, the array becomes static. Make
               the COMMON SHARED statement appear before
               the DIM statement to make the array Dynamic &
               therefore will not be stored in DGROUP.
       11.3.3. Variable Overhead. Each var has a 4 byte overhead
               for _each_ module. For multiple modules projects
               which use lots of Global (COMMON) statements,
               this overhead is repeated for _each_ module.
   11.4.   Possible causes for running out conventional memory:
       11.4.1. Not enough EMM.
       11.4.2. Subs or functions which exceed 16K.
       11.4.3. Large arrays. Non-variable length string arrays can
               be stored in EMM using the /ea switch.

12.    My program runs in the IDE, but won't run when compiled??
   12.1.   Arrays are dynamic by default in the IDE, but when they
           are compiled, they are static by default. Therefore, they
           are stored in DGROUP instead of the far heap. Use
           '$DYNAMIC to make all arrays dynamic or use REDIM
           instead of DIM.
   12.2.   Program generates a "program memory overflow" during
           compile. You need to break a single module into multiple
           ones.

