SECTION 18 - Turbo Vision
--------------------------------

This document contains information that is most often provided
to users of this section.  There is a listing (when available)
of common Technical Information Documents and example files that
can be downloaded from the libraries, and a listing of the most
frequently asked questions and their answers.


TECHNICAL INFORMATION DOCUMENTS AND EXAMPLE FILES
-------------------------------------------------

TI1721   Determining input focus on Turbo Vision
TI1725   Local Menus in Turbo Vision
TI1729   Simultaneous Dialogs in Turbo Vision 
TI1779   Adding and Removing items from a Turbo Vision Listbox
TI469    Turbo Vision program to go into 132 column mode
TI991    Multiple variations of TInputLine for Turbo Vision
TI993    Use different color combinations in Turbo Vision

TVG110.ZIP   Graphics Mode Version of Turbo Vision


FREQUENTLY ASKED QUESTIONS AND ANSWERS
--------------------------------------

Q:   "Can Turbo Vision be run in graphics mode?"

A:   Turbo Vision was not designed to support graphics. However,
     there is a file in this library 1 (TVG110.ZIP), which gives
     you a graphics-mode version of Turbo Vision.  There may be
     others uploaded periodically, it's best to search the
     libraries.

Q:   "Are there any books that cover Turbo Vision?"

A:   Books that cover Turbo Vision are:

      "A Programmer Guide to Turbo Vision"
         by Freddy Etrl, Ralph Machholz and Andi Golgath
         Addison-Wesley ISBN 0-201-62401-X

      "Turbo Pascal 6.0 Techniques and Utilities"
         by Neil J. Rubenking
         Ziff Davis Press ISBN 1-56276-010-6

      "Clean Coding in Turbo Pascal 6"
         by Amrik Dhillon
         M&T Books ISBN 1-55851-228-4

Q:   "I don't seem to be getting all the memory used by
     collections after disposing them.  What could be going
     wrong?"

A:   If you don't seem to be getting back all your memory when
     disposing of a collection, then there are several things you
     may be doing wrong:

     *  You are allocating the collection with 
    
             MyColl := New(PMyColl, init(...))

        but are only destroying it with
        
             MyColl^.Done

        instead of 

             Dispose(MyColl, Done).

     *  You have a memory leak in your TObject descendant that
        you are placing in the collection (check your allocations
        in the Init constructor and the deallocs in your Done
        destructor).

     *  You are not putting TObject descendants in the
        collection at all (this generally creates program
        crashes.

     *  If you call the delete method, the delete method just
        removes the object from the collection but does NOT
        destroy the object, Free removes the object from the
        collection and then destroys it by calling FreeItem
        (which normally calls Dispose(Item, Done)).

Q:   "What is the proper way to switch from TVision to graphics
     and back?"

A:   For an example you can ook at the DosShell code in APP.PAS
     (or in TVDEMO, if you're using TP6). Follow the same steps,
     but replace the Exec statement with your graphics stuff.
     If you're using TP7/BP7, you may find that you need to
     replace the DoneDosMem/InitDosMem with
     DoneMemory/InitMemory.

Q:   "How do you make change the default background of a TVision
     application?"

A:   The TBackground object is designed to use only 1 ascii
     character. You could create a new type of background
     object.

    Type
       PMyBackground = ^TMyBackground;
       TMyBackground = Object(TView)
         { Variables go here to support your box or text or whatever }
        Procedure Draw; virtual;
        Function GetPalette: PPalette; virtual; { You override this }
         { Other methods here like Load and Store }
       End;

    Procedure TMyBackground.Draw;
    Begin
      { Your drawing routine which draws over the whole view }
    End;

    
    Also, you will have to override TDesktop.

    Type
       PMyDesktop = TMyDesktop;
       TMyDesktop = Object(TDesktop)
        Procedure InitBackground; virtual;
    End;

    Procedure TMyDesktop.InitBackground;
    Var
       P: PView;
       R: TRect;
    Begin
       GetExtent(R);
       P := New(PMyBackground, Init(R));
       If ValidView(P) Then
           Insert(P);
    End;

    
    You must also override InitDesktop in your main TApplication.

    Type
       PMyApp = ^TMyApp;
       TMyApp = Object(TApplication)
        Procedure InitDesktop; virtual;
       End;

    Procedure TMyApp.InitDesktop;
    Var
       P: PView;
    Begin
       GetExtent(R);
       Inc(R.A.Y);
       Dec(R.B.Y);
       P := New(PDesktop, Init(R));
       If ValidView(P) Then
           Insert(P);
    End;
