Search the FAQ Archives

3 - A - B - C - D - E - F - G - H - I - J - K - L - M
N - O - P - Q - R - S - T - U - V - W - X - Y - Z
faqs.org - Internet FAQ Archives

C++ Turbo Vision FAQ, part1/3

( Part1 - Part2 - Part3 )
[ Usenet FAQs | Web FAQs | Documents | RFC Index | Counties ]
Archive-name: C++-faq/turbovision/tvplus/part1
Posting-Frequency: monthly
Last-modified: 1995/08/14
Version: 1.8
URL: http://www.zeta.org.au/~grove/tvhome.html

See reader questions & answers on this topic! - Help others by sharing your knowledge
			   WELCOME TO TVPLUS

   ======================================================================
   Copyright Robert Hazeltine and Rachel Polanskis 1995
   ======================================================================


   TVPlus is the C++ Turbo Vision FAQ.

   The FAQ is divided into the following headings:

	   Ralp Nader takes an interest in Win95
	   The Guide
	   The Epilogue

   =======================================================================
				 THE NEWS
   =======================================================================

   This heading outlines the changes made since 1995.07.13.

   1.  The TVPlus home page was amended to include an item of general 
   import that Ralph Nader has put Win95 under scrutiny (see Appendix A). 

   2.  Under the heading, TVPlus ftp site, it was noted that 
   Eric Woodruff has supplied a replacement for the message 
   input box (MIBX20.ZIP), new module for colour syntax highlighting 
   (CSH100.ZIP) and a new version of TV Virtual Memory Editor 
   (TVME30.ZIP).
   
   3.  The URL for the Verona University, Italy has been 
   included in the list of general sites of interest to TV programmers.

   =======================================================================
				  THE GUIDE
   =======================================================================

   About TVPlus
   About Turbo Vision
   Books and journals
   Software resources
   The discussion list
   UseNet newsgroups
   Handy FTP sites
   Web pages to peruse
   Selected answers on programming
   Applications written with Turbo Vision
   Acknowledgements


   ----------------------------------------------------------------------
			  About TVPlus
   ----------------------------------------------------------------------

   Objectives
   Wanted!
   Availability of TVPlus
   Style conventions
   Maintainers of TVPlus
   Distribution rights


   ----------------------------------------------------------------------
   OBJECTIVES
   ----------------------------------------------------------------------

   The object of TVPlus is to provide an answer book on Turbo Vision and to
   make access to it by its users as easy as possible.

   The emphasis during the early development is to identify various
   resources that can be commonly used in the development of TV programmes.
   Consolidating various references on the Internet into one document is
   the basic requirement, we believe, to finding what you need to use the
   TV library to full advantage - and to cut the time necessary to become
   productive.

   From this basis, we can manage the development of the FAQ more orderly
   while, at the same time, answering perhaps the most frequently asked of
   questions: "Where is ... ?" or "Where can I get ... ?"

   There has, however, been several aspects to this early emphasis. First,
   to find the resources that directly affect the use of the TV framework
   such as patches, extensions to the TV classes and the like. Secondly,
   keeping the context in which TV was developed and is used to the fore -
   thus providing leads to relevant resources such as compiler patches,
   porting to other platforms and the like. Thirdly, a little self
   indulgence in identifying and promoting applications based on Turbo
   Vision.

   ----------------------------------------------------------------------
   INFORMATION WANTED
   ----------------------------------------------------------------------

   Have you information you think others might be interested in?


   CONTRIBUTIONS

   If you have the basis of a contribution that others might find
   interesting, please polish it up for TVPlus.

   There is plenty of scope for useful articles in the pages of TVPlus,
   especially the sections that make up the chapter on Selected answers on
   programming or the chapter about Dead Parrots.

   Contributors can submit their material to us via

	   email at <mailto:grove@zeta.org.au>; or
	   anonymous ftp at <ftp://ftp.zeta.org.au/home/grove/>.


   MIRROR SITES

   TVPlus would like to establish mirror sites in the other parts of the
   world, especially in the US and Europe. By doing so we expect that
   response times for international users will be radically improved. Use
   of mirror sites will also help to eliminate the bandwidth hit on
   zeta.org.au's relatively narrow network link.

   Please contact us, the co-maintainers of TVPlus, for more information
   about becoming a mirror site for TVPlus.

   APPLICATIONS

   You can use TVPlus to publicise any software you may have written
   using Turbo Vision C++. An outline is presented in the chapter
   'Applications written with Turbo Vision' to help you prepare
   information about your application.

   ABOUT TVPLUS ITSELF

   We appreciate feedback on anything that you consider relevant -
   performance, arrangement, layout, ease of comprehension, etc.

   Anyone interested in lending a hand with these tasks?


   -----------------------------------------------------------------------
   AVAILABILITY
   -----------------------------------------------------------------------

   Notifications about TVPlus are posted periodically on the Turbo Vision
   discussion list.

   THE TEXT/PLAIN FORMAT OF TVPLUS

   The ASCII format of TVPlus is posted each calendar month to
   <mailto:turbvis@vtvm1.cc.vt.edu> and to *.answers with changes (if any)
   since being posted the previous month.

   Since TVPlus has been approved by the *.answers moderators, a copy of
   this FAQ may be downloaded from ftp://rtfm.mit.edu/pub/ or from
   our TVPlus ftp site.

   THE TEXT/HTML FORMAT OF TVPLUS

   Available on the World Wide Web at

		   <http://www.zeta.org.au/~grove/tvhome.html>,

   the Web format of TVPlus has advantages over its ASCII counterpart
   because of its

   1.  currency (material is added as the opportunity arises);
   2.  primacy (the ASCII version is derived from this one); and
   3.  flexibility (the links with other documents on line).

   If you want to download a copy of the Web version of TVPlus, you may do
   so by using our TVPlus ftp site.

   TVPlus offline

   The downloaded Web files have the extension of *.htm and can be viewed
   using any WWW browser offline. We recommend DOSLYNX for this purpose.

   DOSLYNX, which is available through ARCHIE under the the file name of
   DLX0_8A.EXE, is a creation of the University of Kansas. Enquiries
   regarding DOSLYNX should be sent there.

   To set up DOSLYNX for offline browsing use the command line options:
   DOSLYNX /nno You can configure tvhome.htm to be the home page.

   You should be able to view the downloaded ASCII version with any text
   editor as each file making up the FAQ is less than 64k.

   TVPlus mirrored privately

   Some people may prefer to access the FAQ from a local directory or from
   their shell account rather than accessing zeta.org.au directly. External
   links are operative whether access is from zeta or from a local
   directory where you have downloaded the FAQ - provided that you are
   connected to the Internet in the first place.

   If you want to use TVPlus from your local host, remember to keep your
   copy up to date or you will miss links to new files or you will be
   unaware that our files have been updated.

   So, offline or online you can use TVPlus loaded to your local directory.

   Most browers will allow you access to the source document which will
   provide quite specific URLs needed for ftpm or navigating the TVPlus'
   ftp site. They also provide bookmarks which can be used to advantage.


   ----------------------------------------------------------------------
   STYLE CONVENTIONS
   ----------------------------------------------------------------------

   This chapter outlines the style conventions used in TVPlus.

   Countries
	   ISO 3166-1981 Codes for the representation of names of countries:
	   any country name abbreviation will the same as the country
	   identification in a domain name - for example, zeta.org.au

   Currencies
	   ISO 4217-1978 Codes for the representation of currencies and
	   funds.

   Dates and time
	   ISO 2014-1976 Writing of calendar dates in all-numeric form:
	   dates are, therefore, expressed as, say, 2001.01.01 avoiding
	   ambiguity as to which country convention has been used.

   General
	   To minimise waiting time while data transfers, file sizes are, in
	   the main, < 4K and graphics use is minimal.

   HTML protocol
	   ISO 8879-1986 "Information Processing Text and Office Systems;
	   Standard Generalised Markup Language (SGML)"; HTML 2.0 is an
	   expression of this standard.

   Uniform Resource Locator (URL)
	   RFC1738 "Uniform Resource Locators": URLs used to access resources
	   on the Internet are cited, with or without delimiters, as
	   <scheme://host:port/url-path> where scheme is one of file, http,
	   news, gopher, telnet or wais and where the colon followed by the
	   TCP port number is optional; the syntatic wrapper, URL: is not
	   generally prefixed to a URL in this document.


   -----------------------------------------------------------------------
   MAINTAINERS OF TVPLUS
   -----------------------------------------------------------------------

   TVPlus is maintained by Robert Hazeltine and Rachel Polanskis from
   Sydney, Australia through our computer host, Zeta Microcomputer
   Software. This FAQ has no connection with Borland and they, in turn, do
   not contribute to the support of this service.


   -----------------------------------------------------------------------
   DISTRIBUTION RIGHTS
   -----------------------------------------------------------------------

   This FAQ may be posted to any USENET newsgroup, on-line service,
   or BBS as long as it is posted in its entirety and includes the
   copyright statement.

   This FAQ may not be distributed for financial gain.

   This FAQ may not be included in commercial collections or
   compilations without express permission from the authors.  No such
   permission has yet been given.


   -----------------------------------------------------------------------
			  About Turbo Vision
   -----------------------------------------------------------------------

   What is TV
   TV history
   TV as DLL
   TV bugs
   TV mixed and matched
   TV ports
   TV and MS-Windows
   Learning TV

   -----------------------------------------------------------------------
   WHAT IS TV
   -----------------------------------------------------------------------

   Turbo Vision is a C++ library that provides an application framework.
   It is a product of Borland International, Inc.

   -----------------------------------------------------------------------
   TV HISTORY
   -----------------------------------------------------------------------

   There are [three] versions of Turbo Vision:

   TV1.0
	 This version of the application frameworks came with BC++ 3.0;

   TV1.03
	 This version cam with BC++ 3.1:
	 .  its TV.H containing a #define _TV_VERSION which is not
		present in the earlier version; and

   TV2.0
	 This is part of the Power Pack for DOS designed for use with BC
	 4.x:
	 .  it may be used with the 16 and 32 bit DOS DPMI extenders;
	 .  it includes TInputLine validators such as TFilterValidator,
		TRangeValidator, TStringLookupValidator and TPXPictureValidator;
	 .  there is a new TMultiCheckBoxes object that is like the regular
		TCheckBoxes object but each check box can have multiple values;
		and
	 .  a new TOutline class has been added for outline views (for
		example a directory tree) with expandable and collapsible nodes.

   -----------------------------------------------------------------------
   TV as DLL
   -----------------------------------------------------------------------

   Part 1: The original proposal on making TV as DLL
   Part 2: Additional material on making TV as DLL
   Part 3: Additional comment on making TV as DLL

   -----------------------------------------------------------------------
From: grove@zeta.org.au (Rachel Polanskis)
Newsgroups: comp.os.msdos.programmer.turbovision,comp.answers,news.answers
Subject: C++ Turbo Vision FAQ, part1/3
Followup-To: poster
Approved: news-answers-request@mit.edu 
Summary: This article is a compilation of information on the use of, 
	 and resources for, Turbo Vision for C++ (Borland's application 
	 framework).

Archive-name: C++-faq/turbovision/tvplus/part1
Posting-Frequency: monthly
Last-modified: 1995/08/14
Version: 1.8
URL: http://www.zeta.org.au/~grove/tvhome.html




			   WELCOME TO TVPLUS

   ======================================================================
   Copyright Robert Hazeltine and Rachel Polanskis 1995
   ======================================================================


   TVPlus is the C++ Turbo Vision FAQ.

   The FAQ is divided into the following headings:

	   Ralp Nader takes an interest in Win95
	   The Guide
	   The Epilogue

   =======================================================================
				 THE NEWS
   =======================================================================

   This heading outlines the changes made since 1995.07.13.

   1.  The TVPlus home page was amended to include an item of general 
   import that Ralph Nader has put Win95 under scrutiny (see Appendix A). 

   2.  Under the heading, TVPlus ftp site, it was noted that 
   Eric Woodruff has supplied a replacement for the message 
   input box (MIBX20.ZIP), new module for colour syntax highlighting 
   (CSH100.ZIP) and a new version of TV Virtual Memory Editor 
   (TVME30.ZIP).
   
   3.  The URL for the Verona University, Italy has been 
   included in the list of general sites of interest to TV programmers.

   =======================================================================
				  THE GUIDE
   =======================================================================

   About TVPlus
   About Turbo Vision
   Books and journals
   Software resources
   The discussion list
   UseNet newsgroups
   Handy FTP sites
   Web pages to peruse
   Selected answers on programming
   Applications written with Turbo Vision
   Acknowledgements


   ----------------------------------------------------------------------
			  About TVPlus
   ----------------------------------------------------------------------

   Objectives
   Wanted!
   Availability of TVPlus
   Style conventions
   Maintainers of TVPlus
   Distribution rights


   ----------------------------------------------------------------------
   OBJECTIVES
   ----------------------------------------------------------------------

   The object of TVPlus is to provide an answer book on Turbo Vision and to
   make access to it by its users as easy as possible.

   The emphasis during the early development is to identify various
   resources that can be commonly used in the development of TV programmes.
   Consolidating various references on the Internet into one document is
   the basic requirement, we believe, to finding what you need to use the
   TV library to full advantage - and to cut the time necessary to become
   productive.

   From this basis, we can manage the development of the FAQ more orderly
   while, at the same time, answering perhaps the most frequently asked of
   questions: "Where is ... ?" or "Where can I get ... ?"

   There has, however, been several aspects to this early emphasis. First,
   to find the resources that directly affect the use of the TV framework
   such as patches, extensions to the TV classes and the like. Secondly,
   keeping the context in which TV was developed and is used to the fore -
   thus providing leads to relevant resources such as compiler patches,
   porting to other platforms and the like. Thirdly, a little self
   indulgence in identifying and promoting applications based on Turbo
   Vision.

   ----------------------------------------------------------------------
   INFORMATION WANTED
   ----------------------------------------------------------------------

   Have you information you think others might be interested in?


   CONTRIBUTIONS

   If you have the basis of a contribution that others might find
   interesting, please polish it up for TVPlus.

   There is plenty of scope for useful articles in the pages of TVPlus,
   especially the sections that make up the chapter on Selected answers on
   programming or the chapter about Dead Parrots.

   Contributors can submit their material to us via

	   email at <mailto:grove@zeta.org.au>; or
	   anonymous ftp at <ftp://ftp.zeta.org.au/home/grove/>.


   MIRROR SITES

   TVPlus would like to establish mirror sites in the other parts of the
   world, especially in the US and Europe. By doing so we expect that
   response times for international users will be radically improved. Use
   of mirror sites will also help to eliminate the bandwidth hit on
   zeta.org.au's relatively narrow network link.

   Please contact us, the co-maintainers of TVPlus, for more information
   about becoming a mirror site for TVPlus.

   APPLICATIONS

   You can use TVPlus to publicise any software you may have written
   using Turbo Vision C++. An outline is presented in the chapter
   'Applications written with Turbo Vision' to help you prepare
   information about your application.

   ABOUT TVPLUS ITSELF

   We appreciate feedback on anything that you consider relevant -
   performance, arrangement, layout, ease of comprehension, etc.

   Anyone interested in lending a hand with these tasks?


   -----------------------------------------------------------------------
   AVAILABILITY
   -----------------------------------------------------------------------

   Notifications about TVPlus are posted periodically on the Turbo Vision
   discussion list.

   THE TEXT/PLAIN FORMAT OF TVPLUS

   The ASCII format of TVPlus is posted each calendar month to
   <mailto:turbvis@vtvm1.cc.vt.edu> and to *.answers with changes (if any)
   since being posted the previous month.

   Since TVPlus has been approved by the *.answers moderators, a copy of
   this FAQ may be downloaded from ftp://rtfm.mit.edu/pub/ or from
   our TVPlus ftp site.

   THE TEXT/HTML FORMAT OF TVPLUS

   Available on the World Wide Web at

		   <http://www.zeta.org.au/~grove/tvhome.html>,

   the Web format of TVPlus has advantages over its ASCII counterpart
   because of its

   1.  currency (material is added as the opportunity arises);
   2.  primacy (the ASCII version is derived from this one); and
   3.  flexibility (the links with other documents on line).

   If you want to download a copy of the Web version of TVPlus, you may do
   so by using our TVPlus ftp site.

   TVPlus offline

   The downloaded Web files have the extension of *.htm and can be viewed
   using any WWW browser offline. We recommend DOSLYNX for this purpose.

   DOSLYNX, which is available through ARCHIE under the the file name of
   DLX0_8A.EXE, is a creation of the University of Kansas. Enquiries
   regarding DOSLYNX should be sent there.

   To set up DOSLYNX for offline browsing use the command line options:
   DOSLYNX /nno You can configure tvhome.htm to be the home page.

   You should be able to view the downloaded ASCII version with any text
   editor as each file making up the FAQ is less than 64k.

   TVPlus mirrored privately

   Some people may prefer to access the FAQ from a local directory or from
   their shell account rather than accessing zeta.org.au directly. External
   links are operative whether access is from zeta or from a local
   directory where you have downloaded the FAQ - provided that you are
   connected to the Internet in the first place.

   If you want to use TVPlus from your local host, remember to keep your
   copy up to date or you will miss links to new files or you will be
   unaware that our files have been updated.

   So, offline or online you can use TVPlus loaded to your local directory.

   Most browers will allow you access to the source document which will
   provide quite specific URLs needed for ftpm or navigating the TVPlus'
   ftp site. They also provide bookmarks which can be used to advantage.


   ----------------------------------------------------------------------
   STYLE CONVENTIONS
   ----------------------------------------------------------------------

   This chapter outlines the style conventions used in TVPlus.

   Countries
	   ISO 3166-1981 Codes for the representation of names of countries:
	   any country name abbreviation will the same as the country
	   identification in a domain name - for example, zeta.org.au

   Currencies
	   ISO 4217-1978 Codes for the representation of currencies and
	   funds.

   Dates and time
	   ISO 2014-1976 Writing of calendar dates in all-numeric form:
	   dates are, therefore, expressed as, say, 2001.01.01 avoiding
	   ambiguity as to which country convention has been used.

   General
	   To minimise waiting time while data transfers, file sizes are, in
	   the main, < 4K and graphics use is minimal.

   HTML protocol
	   ISO 8879-1986 "Information Processing Text and Office Systems;
	   Standard Generalised Markup Language (SGML)"; HTML 2.0 is an
	   expression of this standard.

   Uniform Resource Locator (URL)
	   RFC1738 "Uniform Resource Locators": URLs used to access resources
	   on the Internet are cited, with or without delimiters, as
	   <scheme://host:port/url-path> where scheme is one of file, http,
	   news, gopher, telnet or wais and where the colon followed by the
	   TCP port number is optional; the syntatic wrapper, URL: is not
	   generally prefixed to a URL in this document.


   -----------------------------------------------------------------------
   MAINTAINERS OF TVPLUS
   -----------------------------------------------------------------------

   TVPlus is maintained by Robert Hazeltine and Rachel Polanskis from
   Sydney, Australia through our computer host, Zeta Microcomputer
   Software. This FAQ has no connection with Borland and they, in turn, do
   not contribute to the support of this service.


   -----------------------------------------------------------------------
   DISTRIBUTION RIGHTS
   -----------------------------------------------------------------------

   This FAQ may be posted to any USENET newsgroup, on-line service,
   or BBS as long as it is posted in its entirety and includes the
   copyright statement.

   This FAQ may not be distributed for financial gain.

   This FAQ may not be included in commercial collections or
   compilations without express permission from the authors.  No such
   permission has yet been given.


   -----------------------------------------------------------------------
			  About Turbo Vision
   -----------------------------------------------------------------------

   What is TV
   TV history
   TV as DLL
   TV bugs
   TV mixed and matched
   TV ports
   TV and MS-Windows
   Learning TV

   -----------------------------------------------------------------------
   WHAT IS TV
   -----------------------------------------------------------------------

   Turbo Vision is a C++ library that provides an application framework.
   It is a product of Borland International, Inc.

   -----------------------------------------------------------------------
   TV HISTORY
   -----------------------------------------------------------------------

   There are [three] versions of Turbo Vision:

   TV1.0
	 This version of the application frameworks came with BC++ 3.0;

   TV1.03
	 This version cam with BC++ 3.1:
	 .  its TV.H containing a #define _TV_VERSION which is not
		present in the earlier version; and

   TV2.0
	 This is part of the Power Pack for DOS designed for use with BC
	 4.x:
	 .  it may be used with the 16 and 32 bit DOS DPMI extenders;
	 .  it includes TInputLine validators such as TFilterValidator,
		TRangeValidator, TStringLookupValidator and TPXPictureValidator;
	 .  there is a new TMultiCheckBoxes object that is like the regular
		TCheckBoxes object but each check box can have multiple values;
		and
	 .  a new TOutline class has been added for outline views (for
		example a directory tree) with expandable and collapsible nodes.

   -----------------------------------------------------------------------
   TV as DLL
   -----------------------------------------------------------------------

   Part 1: The original proposal on making TV as DLL
   Part 2: Additional material on making TV as DLL
   Part 3: Additional comment on making TV as DLL

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

   TV AS DLL - PART 1

   Introduction
   Header File Changes
   Source File Changes
   Building the DLL
   Using the DLL
   Problems with the Borland RTL DLL
   Feedback

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

   Contents

   This section shows how to convert TV 2.0 to a 32 bit DLL for use with BC
   4.02 and the Power Pack. The information was provided by the author,
   Eddie Stassen.

   Introduction

   This section lists the changes required to compile TV2.0 as a 32bit DLL.
   Please note that the DLL has not been tested extensively and, as I am no
   expert on DLL's, some changes may well be superfluous and there may be
   some omissions.

   I also do not make use of streamable objects in my applications, so my
   knowledge is a bit shaky there and I cannot say whether the streaming
   stuff will work (although the standard TVDEMO program does manage to
   save and retrieve the desktop). The bottom line here is that it works
   for me at this stage and I have gone through enough rebuilding cycles to
   last me quite a while.

   The changes are in essence very simple but, as they involve virtually
   every header file and a large number of the source files, I am not going
   to give a file by file description here - just general instructions on
   what to change.

   In order to keep the files compatible with the static libraries, use is
   made of macros and compile time definitions. When compiling the DLL you
   should define MAKEDLL. When compiling an application to use the DLL,
   define USEDLL. If neither of these macros are defined, the header files
   should look identical to the original ones.

   Note that section 3.2.3 describes an omission in the source code that I
   discovered while making the changes. The DLL will not compile without
   it.

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

   Header file Changes

   2.1 Start with TV.H and add the following lines at the beginning of the
   file (around line 16):

   #if defined(MAKEDLL)
	 #define _EXPTVCLASS __export
	 #define _EXPTVFUNC __export
	 #define _EXPTVDATA __export
   #elif defined(USEDLL)
	 #define _EXPTVCLASS __import
	 #define _EXPTVFUNC __import
	 #define _EXPTVDATA __import
   #else
	 #define _EXPTVCLASS
	 #define _EXPTVFUNC
	 #define _EXPTVDATA
   #endif

   A few lines down, change the lines:

   #if defined( _RTLDLL )
   #error TV must use the RTL in static form only
   #endif

   to:

   #if !defined( MAKEDLL ) && !defined( USEDLL)
   #if defined( _RTLDLL )
   #error TV must use the RTL in static form only
   #endif
   #endif

   2.2 Now the major work starts: In all the TV header files change ALL the
   class declarations from "class Txxxx" to "class _EXPTVCLASS Txxx" e.g.
   the first few lines in APP.H:
 
   class _FAR TRect;

   class TBackground : public TView {

   will change to:

   class _EXPTVCLASS _FAR TRect;

   class _EXPTVCLASS TBackground : public TView {

   etc.

   2.3 Add the _EXPTVFUNC macro to all the global function declarations,
   e.g. in COLORSEL.H line 37 change:

   TColorItem& operator + ( TColorItem& i1, TColorItem& i2 );

   to:

   TColorItem& _EXPTVFUNC operator + ( TColorItem& i1, TColorItem& i2 );

   Inline functions defined in the header files do not have to be changed.
   Here is a list of the files and functions that need to be changed:

   File :  COLORSEL.H

   TColorItem& _EXPTVFUNC operator + ( TColorItem& i1, TColorItem& i2 );
   TColorGroup& _EXPTVFUNC operator + ( TColorGroup& g, TColorItem& i );
   TColorGroup& _EXPTVFUNC operator + ( TColorGroup& g1, TColorGroup& g2 );

   File :  MENUS.H

   TSubMenu& _EXPTVFUNC operator + ( TSubMenu& s, TMenuItem& i );
   TSubMenu& _EXPTVFUNC operator + ( TSubMenu& s1, TSubMenu& s2 );
   TStatusDef& _EXPTVFUNC operator + ( TStatusDef& s1, TStatusItem& s2 );
   TStatusDef& _EXPTVFUNC operator + ( TStatusDef& s1, TStatusDef& s2 );

   File :  MSGBOX.H

   ushort _EXPTVFUNC messageBox( const char *msg, ushort aOptions );
   ushort _EXPTVFUNC messageBox( unsigned aOptions, const char *msg, ... );
   ushort _EXPTVFUNC messageBoxRect( const TRect &r, const char *msg, ushort
	 aOptions );
   ushort _EXPTVFUNC messageBoxRect( const TRect &r, ushort aOptions, const
	 char *msg, ... );
   ushort _EXPTVFUNC inputBox( const char *Title, const char *aLabel, char *s,
	 uchar limit );
   ushort _EXPTVFUNC inputBoxRect( const TRect &bounds, const char *title,

   File :  UTIL.H

   void _EXPTVFUNC fexpand( char * );
   char _EXPTVFUNC hotKey( const char *s );
   ushort _EXPTVFUNC ctrlToArrow( ushort );
   char _EXPTVFUNC getAltChar( ushort keyCode );
   ushort _EXPTVFUNC getAltCode( char ch );
   char _EXPTVFUNC getCtrlChar(ushort);
   ushort _EXPTVFUNC getCtrlCode(uchar);
   ushort _EXPTVFUNC historyCount( uchar id );
   const char * _EXPTVFUNC historyStr( uchar id, int index );
   void _EXPTVFUNC historyAdd( uchar id, const char * );
   int _EXPTVFUNC cstrlen( const char * );
   void * _EXPTVFUNC message( TView *receiver, ushort what, ushort command, void
	 *infoPtr );
   Boolean _EXPTVFUNC lowMemory();
   char * _EXPTVFUNC newStr( const char * );
   Boolean _EXPTVFUNC driveValid( char drive );
   Boolean _EXPTVFUNC isDir( const char *str );
   Boolean _EXPTVFUNC pathValid( const char *path );
   Boolean _EXPTVFUNC validFileName( const char *fileName );
   void _EXPTVFUNC getCurDir( char *dir );
   Boolean _EXPTVFUNC isWild( const char *f );

   2.4 Here come the shaky bits

   File : TOBJSTRM.H

   Change line 31:

   #ifdef __DLL__

   to:

   #if defined(__DLL__) && !defined (__FLAT__)

   Note: The above change is not entirely correct, but it works. I do not
   quite know why that #ifdef is there anyway.

   The __link() macro in line 51 was changed to:

   #define __link( s )             \
   extern _EXPTVDATA TStreamableClass s;    \
   static fLink force ## s =     \
	 { (fLink _NEAR *)&force ## s, (TStreamableClass _NEAR *)&s };

   I am not too sure about the above change and I suspect one might need a
   separate macro for your own classes.

   That concludes the changes to the header files.

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

   Source file changes

   ASM Files

   Unfortunately the assembler files need to be rebuilt to make the
   functions exportable (although I suspect you could bypass this with an
   appropriate DEF file). In my case I changed all the PUBLIC declarations
   to PUBLICDLL and re-assembled.

   CPP Files

   3.2.1 Add the _EXPTVFUNC macro to all the global non-member function
   definitions. The affected files are:

   File :  COLORSEL.CPP

   TColorItem& _EXPTVFUNC operator + ( TColorItem& i1, TColorItem& i2 )
   TColorGroup& _EXPTVFUNC operator + ( TColorGroup& g, TColorItem& i )
   TColorGroup& _EXPTVFUNC operator + ( TColorGroup& g1, TColorGroup& g2 )

   File :  MENU.CPP

   TSubMenu& _EXPTVFUNC operator + ( TSubMenu& s, TMenuItem& i )
   TSubMenu& _EXPTVFUNC operator + ( TSubMenu& s1, TSubMenu& s2 )
   TStatusDef& _EXPTVFUNC operator + ( TStatusDef& s1, TStatusItem& s2 )
   TStatusDef& _EXPTVFUNC operator + ( TStatusDef& s1, TStatusDef& s2 )

   File :  MISC.CPP

   void *_EXPTVFUNC message( TView *receiver, ushort what, ushort command,
	  void *infoPtr)
   Boolean _EXPTVFUNC lowMemory()

   File :  NEW.CPP

   void * _EXPTVFUNC operator new[] ( size_t sz )
   void * _EXPTVFUNC operator new ( size_t sz )
   void _EXPTVFUNC operator delete ( void *blk )
   void _EXPTVFUNC operator delete[] ( void *blk )

   File :  NEWSTR.CPP

   char *_EXPTVFUNC newStr( const char *s )

   File :  TCMDSET.CPP

   TCommandSet _EXPTVFUNC operator & ( const TCommandSet& tc1, const
	   TCommandSet& tc2 )
   TCommandSet _EXPTVFUNC operator | ( const TCommandSet& tc1, const
	   TCommandSet& tc2 )
   int _EXPTVFUNC operator == ( const TCommandSet& tc1, const
	   TCommandSet& tc2 )

   File :  TOBJSTRM.CPP

   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, char &ch )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, signed char &ch )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, unsigned char &ch )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, signed short &sh )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, unsigned short &sh )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, signed int &i )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, unsigned int &i )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, signed long &l )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, unsigned long &l )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, float &f )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, double &d )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, long double &ld )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, TStreamable& t )
   ipstream& _EXPTVFUNC operator >> ( ipstream& ps, void *&t )
   opstream& _EXPTVFUNC operator << ( opstream& ps, char ch )
   opstream& _EXPTVFUNC operator << ( opstream& ps, signed char ch )
   opstream& _EXPTVFUNC operator << ( opstream& ps, unsigned char ch )
   opstream& _EXPTVFUNC operator << ( opstream& ps, signed short sh )
   opstream& _EXPTVFUNC operator << ( opstream& ps, unsigned short sh )
   opstream& _EXPTVFUNC operator << ( opstream& ps, signed int i )
   opstream& _EXPTVFUNC operator << ( opstream& ps, unsigned int i )
   opstream& _EXPTVFUNC operator << ( opstream& ps, signed long l )
   opstream& _EXPTVFUNC operator << ( opstream& ps, unsigned long l )
   opstream& _EXPTVFUNC operator << ( opstream& ps, float f )
   opstream& _EXPTVFUNC operator << ( opstream& ps, double d )
   opstream& _EXPTVFUNC operator << ( opstream& ps, long double ld )
   opstream& _EXPTVFUNC operator << ( opstream& ps, TStreamable& t )
   opstream& _EXPTVFUNC operator << ( opstream& ps, TStreamable *t )

   File :  TPOINT.CPP

   TPoint _EXPTVFUNC operator - ( const TPoint& one, const TPoint& two )
   TPoint _EXPTVFUNC operator + ( const TPoint& one, const TPoint& two )
   int _EXPTVFUNC operator == ( const TPoint& one, const TPoint& two )
   int _EXPTVFUNC operator!= ( const TPoint& one, const TPoint& two )

   3.2.2 Add the _EXPTVDATA macro to global data. The following files are
   affected:

   File :  HELPBASE.CPP

   line 57:
   TCrossRefHandler _EXPTVDATA crossRefHandler = notAssigned;

   File :  TGROUP.CPP

   line 24-25:
   TView *_EXPTVDATA TheTopView = 0;
   TGroup* _EXPTVDATA ownerGroup = 0;

   File : TPROGRAM.CPP

   line 39:
   extern TPoint _EXPTVDATA shadowSize;

   File :  TVIEW.CPP

   line 34-35:
   TPoint _EXPTVDATA shadowSize = {2,1};
   uchar _EXPTVDATA shadowAttr = 0x08;

   line 40:
   extern TView *_EXPTVDATA TheTopView;

   3.2.3 Omission from the source (BUG)

   The following function is declared but not defined anywhere in the
   source:

	TStreamable *TSortedListBox::build()

   Add the following lines to STDDLG.CPP just before the #endif right at
   the end of the file:

   TStreamable *TSortedListBox::build() {
	  return new TSortedListBox( streamableInit );
	  }

   3.2.4 The streaming stuff again.

   I [sic] all those S*.CPP files (SBUTTON.CPP, SVIEW.CPP, etc) where the
   registration objects are defined (RButton, RView etc), change the
   definitions from:

   TStreamableClass RSomeClass( TSomeClass::name,
   to:
   TStreamableClass _EXPTVDATA RSomeClass( TSomeClass::name,

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


   Building the DLL

   I used the IDE to compile the DLL as scratching around in the makefile
   seemed like just too much effort. If you plan to use the IDE, set up
   your project as follows:

	   In the New Project Dialog, name your project TV32 and select
	   Target Type as Dynamic Library and DOS (32bit DPMI) as the platform.

	   De-select Turbo Vision and Class Library in the Standard Libraries
	   section.

	   Select Dynamic for the Run Time Library.

	   Add all the .CPP and .ASM files in the source\tvision directory to the
	   project.

	   Under Edit Local Options|Compiler|Defines add MAKEDLL (_RTLDLL should
	   already be there).

   For each of the .ASM files under Edit Local Options|Tool, change the
	   line to read $TASM /D__FLAT__ /m2 /ml

   When you make the project (go for lunch) an import library (TV32.LIB)
   will automatically be created. I suggest you rename this to TV32i.LIB to
   avoid confusion with the static library.

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

   Using the DLL

   Existing applications can be converted to use the DLL as follows:

   Add TV32i.LIB to the project.

   At the top level define USEDLL in Edit Local Options|Compiler|Defines.
   Go to Target Expert and switch OFF Turbo Vision under standard Libaries.

   Select Dynamic Runtime Library.

   BUILD the project.

   Your EXE file should be much smaller than before. (The TVDemo
   application compiles to about 34K). When running your application
   TV32.DLL should be in the local directory or in the path.

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

   Problems with the Borland RTL DLL

   This problem is not directly TV related but may surface if you use the
   DLL.

   When you use certain RTL functions (biosprint, inport, etc.), the linker
   will fail with an undefined symbol: _ostype. The problem is that the
   abovementiond functions force linking of the function
   __disallowDPMI32onWin32 (in DPMI32.LIB) which in turn references _ostype
   which is not exported from the C RTL DLL (CW3211.DLL).

   To get around the problem you can extract the module PLATFORM.OBJ from
   CW32.DLL and link it with your application:

   TLIB CW32.DLL *PLATFORM

   Alternatively you can just define _ostype some where in your
   application:

   unsigned int _ostype = 2;    // 2 == DOS32

   The second method is not all that safe since it assumes you are not
   running on a Win32 platform.

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

   Feedback

   The author would appreciate any feedback on this material explaining how
   to compile TV as a DLL.

   Send email to <stasseed@telkom11.telkom.co.za>

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

   TV AS DLL - PART 2

   Abstract
   The module definition file
	   tvdll16.dff
   Modifications to the headers
	   tvision/tv.h
	   other header files
   Modifications to the assembler files
   General modifications
	   tvwrite.asm
   Modifications to the source files
	   tscreen.cpp
	   system.h
   Miscellaneous modifications
	   Missing TSortedListBox:::build
	   Redundant tmenupop.cpp
   Conclusions

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

   Abstract

   This section provides comment on producing Turbo Vision 2.0 as a DLL in
   either 16 or 32-bit mode under BC 4.5 as outlined in TV as DLL - Part 1
   and adds further insight of the reviewer. The reviewer is Vincent Van
   Den Berghe.

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

   The module definition file

   For the 16-bit TV DLL, you need a module definition file to ensure that
   some critical routines always remain in memory and are never swapped
   out. To make such a file called tvdll16.def


   LIBRARY     TVDLL16

   DESCRIPTION 'TVDLL16.DLL'

   CODE PRELOAD MOVEABLE DISCARDABLE
   DATA PRELOAD MOVEABLE MULTIPLE
   SEGMENTS sysint_TEXT PRELOAD FIXED NONDISCARDABLE
						SYSERR_TEXT PRELOAD FIXED NONDISCARDABLE
						swapst_TEXT PRELOAD FIXED NONDISCARDABLE
						DRIVERS_TEXT PRELOAD FIXED NONDISCARDABLE
						DRIVERS2_TEXT PRELOAD FIXED NONDISCARDABLE
						hardware_TEXT PRELOAD FIXED NONDISCARDABLE
						TSCREEN_TEXT PRELOAD FIXED NONDISCARDABLE
						TEVENT_TEXT PRELOAD FIXED NONDISCARDABLE

   This .def file is not needed for the 32-bit DLL.

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

   Modifications to the headers

   The most extensive work to do is to modify the header files. Do not
   worry if you forget some modifications. The compiler or linker will tell
   you what you have missed. The linker will report "undefined symbols",
   the compiler will complain with "cannot derive a huge class from a far
   base" or vice-versa.

   Basically, the aim is to qualify every exportable class, function and
   data with the correct keyword and to continue using Turbo Vision as a
   static library.

   In order to do this, two macros need to be defined to tell the compiler
   what to do, namely:

	 _BUILDTVDLL                 // defined if we are building TV as a DLL
	 _TVDLL                      // defined if we are using TV as a DLL

   If neither is defined, we are building or using TV as a static library.

   tvision/tv.h

   In order to access classes in a DLL, they must be exported. A series of
   macros put at the start of tvision/tv.h (before line 16) set things up:

	 #if defined(__FLAT__) // 32-bits
	 #if defined(_BUILDTVDLL) // building 32-bits TV DLL
	 #define _EXPTVCLASS  __export
	 #define _EXPTVDATA   __export
	 #define _EXPTVFUNC   __export
	 #elif defined(_TVDLL) // using the 32-bits TV DLL
	 #define _EXPTVCLASS  __import
	 #define _EXPTVDATA   __import
	 #define _EXPTVFUNC   __import
	 #else // building or using 32-bits static library
	 #define _EXPTVCLASS
	 #define _EXPTVDATA
	 #define _EXPTVFUNC
	 #endif
	 #elif defined(_BUILDTVDLL) // we are now compiling in 16-bit
	 // building the 16-bit TV DLL
	 #define _EXPTVCLASS        __export
	 #define _EXPTVDATA __export
	 #define _EXPTVFUNC         __export
	 #elif defined(_TVDLL) // using the 16-bit TV DLL
	 #define _EXPTVCLASS __export
	 #define _EXPTVDATA
	 #define _EXPTVFUNC
	 #else // using the static TV libary
	 #define _EXPTVCLASS        __far
	 #define _EXPTVDATA __near
	 #define _EXPTVFUNC
	 #endif

	 _EXPTVCLASS will be the export qualifier for classes
	 _EXPTVDATA will be the export qualifier for (global) data
	 _EXPTVFUNC will be the export qualifier for (global) functions

   Define the macro _BUILDTVDLL if we are building the library as a DLL;
   _TVDLL if we use the TV library as a DLL; or nothing if we are making or
   using TV as the static library. These definitions will be at the command
   line options. The rules are similar to those which are needed when using
   Borland's CLASSLIB or OWL as a DLL.

   Since we change the rules, change
	 #if defined( _RTLDLL )
	 #error TV must use the RTL in static form only
	 #endif
   to
	 #if defined( _RTLDLL ) && !defined(_BUILDTVDLL) && !defined(_TVDLL)
	 #error TV must use the RTL in static form only
	 #endif
   in tvision/tv.h

   Other header files

   Class declarations

   Basically, you must change all instances of class xxxx or class _FAR
   xxxx to class _EXPTVCLASS xxxx in all header files.

   Please note the following:

   Do not forget special cases - incomplete type specifications, friend
	   classes, etc.
   If you want to have the class available, it should be qualified for
	   export.
   class and struct are equivalent for these purposes, so do not forget
	   them.
   It is not necessary to qualify a class or a struct which has no member
	   functions.

   Functions declarations

   All global functions must have the _EXPTVFUNC attribute. This includes
   the overloaded operators and the friend functions. Note that it is not
   necessary to modify the function definition (i.e. the .cpp file), unlike
   the data declarations in the following section.

   Data declarations

   These declarations are sufficient:
	 In File APP.H:
			  static TProgram * _EXPTVDATA application;
			  static TStatusLine * _EXPTVDATA statusLine;
			  static TMenuBar * _EXPTVDATA menuBar;
			  static TDeskTop * _EXPTVDATA deskTop;
			  static int _EXPTVDATA appPalette;
			  static TEvent _EXPTVDATA pending;

   Here, it is necessary to modify the data definition in the source file.
   For example, in tprogram.cpp:
	 TStatusLine * _EXPTVDATA TProgram::statusLine = 0;
	 TMenuBar * _EXPTVDATA TProgram::menuBar = 0;
	 TDeskTop * _EXPTVDATA TProgram::deskTop = 0;
	 TProgram * _EXPTVDATA TProgram::application = 0;
	 int _EXPTVDATA TProgram::appPalette = apColor;
	 TEvent _EXPTVDATA TProgram::pending;

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

   Modifications to the assembler files

   General modifications

   There are 3 reasons why the assembler files must be modified:

	  Symbolic references to class members in assembler files are different;
	  Public symbols that define member functions in assembler files are
		 different; and
	  Assembly language functions may require prolog/epilog code to load DS
		 with the DLL data segment (this procedure destroys AX).

   The first 2 reasons have one common cause: the compiler "mangles" class
   members differently if the class is flagged as exported/exportable. For
   example, the member TScreen::screenBuffer has as mangled name

			@TScreen@screenBuffer

   if TScreen is an "ordinary" class, but

			@TScreen@0screenBuffer

   if TScreen has the __export or __import attribute in 16-bit DPMI (i.e.
   the model is not __FLAT__).

   We define the macro __DLL__ to indicate that the assembler file is
   compiled for a DLL. A series of ifdef/endif constructs define the proper
   constructions.

   The changes may be grouped into 4 categories:

   Category 1: Public symbols

   All symbols declared PUBLIC at the start of the assembler file must be
   changed to PUBLICDLL (so that they can be exported). In addition, all
   public symbols that are of the form

				@classname@functionname$arguments

   must be changed to:

				@classname@0functionname$arguments

   Note the numeric 0 if the model is not __FLAT__

   This change is needed because the mangling of exported member names is
   different from the non-exported ones. The insertion of an extra 0 is the
   only thing different.

   Category 2: External symbols

   All symbols declared EXTRN at the start of the assembler file which are
   of the form @classname@functionname$arguments must change as described
   in category 1.

   Category 3: Proc declarations

   The proc declaration of public symbols in assembler files must change as
   described in category 1. In addition, a language modifier must be added.

   For example,
	 ifndef __FLAT__
	 @TView@writeStr$qssnxcuc PROC
	 else
	 @TView@writeStr$qsspxcuc PROC
	 endif
   this is changed to:
	 ifndef __FLAT__
	 ifdef __DLL__
	 @TView@0writeStr$qssnxcuc PROC WINDOWS
	 else
	 @TView@writeStr$qssnxcuc PROC
	 endif
	 else
	 ifdef __DLL__
	 @TView@writeStr$qsspxcuc PROC WINDOWS
	 else
	 @TView@writeStr$qsspxcuc PROC
	 endif
	 endif

   Do not forget to do the same thing if the proc name is specified as part
   of an ENDP statement at the end of the proc definition.

   Note that @TView@writeView$qv (defined in tvision/tvwrite.asm) does not
   need the WINDOWS language modifier since this is an internal function
   that receives its arguments through registers. Internal functions and
   protected mode thunks do not need the WINDOWS language modifier.

   Category 4: Call and usage statements

   If the EXTRN declarations are renamed, so must their uses. For example,
   affected call statements change from:

				  Call    @TDisplay@getCrtMode$qv

   to:

	ifdef __DLL__
				  Call    @TDisplay@0getCrtMode$qv
	 else
				  Call    @TDisplay@getCrtMode$qv
	 endif

   Example of a modified assembler declaration

   The file tvcursor.asm started with:

				  PUBLIC  @TView@resetCursor$qv

				  EXTRN   @TDisplay@isEGAorVGA$qv : FAR
				  EXTRN   @TScreen@cursorLines : WORD

	 IFDEF __FLAT__
				  EXTRN   @THardwareInfo@setCaretSize$qus : NEAR
				  EXTRN   @THardwareInfo@setCaretPosition$qusus : NEAR
	 ELSE
				  EXTRN   @TDisplay@getCrtMode$qv : FAR       ; For monochrome
															  ; check.
	 ENDIF

   This is changed to:
	 ifdef __DLL__
	 ; DLL-declarations

	 ifdef __FLAT__
						PUBLICDLL  @TView@resetCursor$qv

						EXTRN           @TDisplay@isEGAorVGA$qv : FAR
						EXTRN           @TScreen@cursorLines : WORD
	 else
						PUBLICDLL  @TView@0resetCursor$qv

						EXTRN           @TDisplay@0isEGAorVGA$qv : FAR
						EXTRN           @TScreen@0cursorLines : WORD
	 ; by using EQUates, we avoid having to modify the use of these
	 ; routines in  the body of the code
	 @TDisplay@isEGAorVGA$qv    EQU             @TDisplay@0isEGAorVGA$qv
	 @TScreen@cursorLines       EQU             @TScreen@0cursorLines
	 endif

	 IFDEF __FLAT__
						EXTRN   @THardwareInfo@setCaretSize$qus : NEAR
						EXTRN   @THardwareInfo@setCaretPosition$qusus :
	 NEAR
	 ELSE
						EXTRN @TDisplay@0getCrtMode$qv : FAR  ; For monochrome
															  ; check.
	 @TDisplay@getCrtMode$qv    EQU     @TDisplay@0getCrtMode$qv
	 ENDIF

	 else
	 ; - Original declarations
				  PUBLIC  @TView@resetCursor$qv

				  EXTRN   @TDisplay@isEGAorVGA$qv : FAR
				  EXTRN   @TScreen@cursorLines : WORD

	 IFDEF __FLAT__
				  EXTRN   @THardwareInfo@setCaretSize$qus : NEAR
				  EXTRN   @THardwareInfo@setCaretPosition$qusus : NEAR
	 ELSE
				  EXTRN   @TDisplay@getCrtMode$qv : FAR       ; For monochrome
 check.
	 ENDIF
	 endif

   tvwrite.asm

   In tvision/tvwrite.asm, the routine @TView@writeView$qv calls
   @THWMouse@hide$qv and @THWMouse@show$qv to hide (resp. show) the mouse
   cursor if drawing over it.

   The code assumes that AX is preserved across calls. Since
   THWMouse::hide() and THWMouse::show() are exported functions, they have
   a prolog code that destroy AX.

   You, therefore, should change:

				  CALL    @THWMouse@hide$qv
				  CALL    @@50
				  CALL    @THWMouse@show$qv
   to
				  push ax
				  CALL    @THWMouse@hide$qv
				  pop ax
				  CALL    @@50
				  push ax
				  CALL    @THWMouse@show$qv
				  pop ax

   As an aside, there are EXTRN definitions for TView::mapColor and
   THardwareInfo::screenWrite, but they are never used and may be
   eliminated if you want.

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

   Modifications to the source files

   The designers of Turbo Vision chose to use a mixture of assembly
   language and C++ for low-level features, like accessing the video
   memory, keyboard and other bios functions.

   Although it seems logical to do this, among other things, for writing to
   the screen, there is no rational explanation why functions like video
   detection (see tvision/tscreen.cpp) has to be in such a mix of language.

   For example, this routine is defined in tvision/tscreen.cpp:
	 void TDisplay::videoInt()
	 {
	 I   PUSH    BP
	 I   PUSH    ES
	 I   INT     10h
	 I   POP     ES
	 I   POP     BP
	 }
   The routine directly calls int 10 (the video bios interrupt) and assumes
   all the proper registers will be set up.

   When compiling for DLL, all exported functions (including the static
   member functions of exported classes, like videoInt() ) get a prolog
   that begins by loading the DLL's data segment in the AX register. As a
   result, the AX register are destroyed by the time the int 10 is
   executed. It so happens that AX (more specifically AH) holds the
   subfunction to be executed. The result is wrong!

   The only reliable way to solve this is to get rid of videoInt() and to
   substitute the body of the function directly at each call site. Do not
   use int86 calls! Some of the code is called within static constructors
   and int86 is unreliable at that time .

   This should yield a working tvision/tscreen.cpp

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

   Miscellaneous modifications

   As reported by Eric Stassen, there is indeed a missing member function
   which should be added to stddlg.cpp:

	 TStreamable *TSortedListBox::build()
	 {
		 return new TSortedListBox( streamableInit );
	 }

   Failure to do this causes an "undefined symbol TStreamable
   *TSortedListBox::build" error when attempting to link the Turbo Vision
   DLL. The reason for such an error message when TV is linked as a static
   library is that references to TSortedListBox::build are only pulled in
   if streaminig is actually used. If it is not used (and it usually is
   not), the reference is not pulled in and the linker does not sees it.

   A DLL is linked as a "complete" program, meaning that there must be no
   unresolved symbols. Hence, the error.

   Redundant tmenupop.cpp

   There is a redundant file called tvision/tmenupop.cpp which cannot
   compile. It is supposed to implement the class TMenuPopup defined in
   tvision/menu.h. Get rid of it.

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

   Conclusions

   It can be done. The reviewer reports he has a 16- and 32-bit Turbo
   Vision Library in a DLL, and it works like a charm!

   The ideal thing would be to incorporate Eric Woodruff's patches with the
   DLL changes so that everyone could benefit. If you try it on your own,
   however, prepare for a few hours work.


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

   ADDITIONAL COMMENT ON MAKING TV AS A DLL

   1. My application does not clear the screen when I exit. It seems that
   the destructors for TScreen etc are not being called.

   Borland C++ 4.02 has known problems when generating DLL's containing
   static objects with destructors. The "static destructor in DLL" problem
   has been fixed in 4.5.

   2. BC 4.02 creates garbage code when trying to access byte- or word-wide
   exported static member data, e.g. TScreen::screenMode. This seems to be
   a compiler bug. Perhaps somebody with BC4.5 can verify if this problem
   has been fixed.

   I have Borland C++ 4.5 and have not encountered this problem.

   The moral of the story is: do not use Borland C++ between versions 4.0
   and 4.02 included. Upgrade to 4.5 (in fact, 4.51, since the upgrade is
   supposed to be available).


   -----------------------------------------------------------------------   -----------------------------------------------------------------------
   TV BUGS
   -----------------------------------------------------------------------

   TV 1.x has several bugs. People have offered fixes and workarounds that
   make TV 1.x run more efficiently. Patches may also be obtained from Phar
   Lap if you want to use their product with TV.

   TV 2 fixed most of the bugs found in the earlier version. Eric Woodruff
   is maintaining a bug list and has released a consolidation of patches
   for TV 2, the latest of which is available from the TVPlus ftp site.

   Any substantiated bugs for TV 2 - and just not coding errors - may be
   sent to Eric Woodruff at <mailto:72134.1150@compuserve.com>.


   -----------------------------------------------------------------------
   TV MIXED AND MATCHED
   -----------------------------------------------------------------------

   It is feasible to compile TV code with different BC versions provided
   that you follow three simple steps

   1. ensure that the old version of TV will not interfere with the new
   one and, if applicable, that the second version of the compiler is
   out of the way;

   2. revise the TV source code to conform with the compiler you will
   use; and

   3. build the new TV library.

   The specifics will change depending on which version of the compiler and
   of Turbo Vision you intend to use. More information follows.


   TV 1.x AND BC4.x

   In this case, the Turbo Vision library must be re-compiled with BC4x.
   The reasons for doing so are the differences in debug format, symbol
   length and the runtime library.

   For particulars on how to do this, read TI1752 and TI1753.


   TV 2.0 AND BC 3.1

   You can compile the TV2.0 source code with BC3.1. Doing so does not
   allow you to generate protected mode applications or link BC4x libraries
   but it does retain the advantage of using the integrated debugger in the
   IDE and development in a DOS environment with the final production build
   done with BC4x.

   Changes to source code files are necessary because of the developments
   in C++ since BC3.1. It means that libraries need to be re-compiled
   having first patched the source code from the file TV2BUG.ZIP.

   You need to ensure that TV1.03 files do not conflict with TV2.0 files,
   possibly by renaming the Turbo Vision directory or deleting them if no
   longer required. At the same time, take the necessary precautions to
   prevent the BC4x and makefiles being called on.

   For detailed information, obtain the file B31TV2.ZIP which provides
   guidelines and a makefile - put together by Eric Woodruff - to help you
   adapt the code to your compiler.

   -----------------------------------------------------------------------
   TV PORTS
   -----------------------------------------------------------------------

   These include:

	   the Joern Sierwald patches to compile a portable 32 bit TV
	   supporting various C++ compilers;

	   Oliver Suciu's patches to compile TV using djgpp; and

	   Alain Borel's patches to compile TV using djgpp based on
	   the Sierwald patches.


   JOERN SIERWALD

   Joern Sierwald who is at the Technische Universitaet Hamburg-Harburg
   (Germany) maintains this code. If you want to obtain the code, its URL
   is given in the section Specialist ftp sites or is obtainable from the
   TVPlus ftp site.

   Supported compilers:

   IBM CSet++ 2.1 for native OS/2 applications;
   Borland C++ for OS/2;
   emx/gcc for native OS/2 and 32Bit DOS applications;
   Watcom C++ 10.0(a) for OS/2 and DOS4GW (dos extender) applications; and
	djgpp.

   Description:

   patches for TV 1.03 (BC3.1);
   all .asm rewritten in C++ for easy debugging;
   mouse support for all compilers;
   32Bit TEditor, 32Bit TTerminal and 32Bit containers;
   Additional ports should be easy; and
   OS/2 versions are multithreaded and consume very little CPU time.

   The djgpp support is new. It is considered a beta version having been
   tested with the OS/2 DPMI Server ONLY.  It should run with VCPI or with
   plain HIMEM.SYS, but you never know.

   N.B.  If you use these patches, please be considerate enough to provide
   the author with feedback and any bug reports.  It is nice to know how
   code performs!

   Joern thanks Alain Borel for code and debugging.


   ----------------------------------------------------------------------
   TV AND MS-WINDOWS
   ----------------------------------------------------------------------

   There is no port or tool available to facilitate a conversion of Turbo
   Vision to MS-Windows.

   The two systems are similar, but different enough that a simple
   conversion is not possible. How difficult it is depends on how your
   original program was written.

   There are 3 parts to programs - interfacing with the user, manipulating
   data, and storing the data. If you have kept the last two separate from
   the user interface, it should not be too hard to make the port. If views
   do a lot of manipulating of data or you have custom views it will
   require more effort.

   The closest you will find to convert your resources for you is something
   like TurboVision Development Toolkit which is not 100% but better than
   nothing. Alternatively, you can use the Resource Workshop to rebuild the
   initial interface and copy much of your code.

   One of the main problems converting your code is that radiobuttons,
   checkboxes, and some other controls have slightly different schemes of
   storing the data. There are slight differences in the names of some
   constants also.


   -----------------------------------------------------------------------
   LEARNING TV
   -----------------------------------------------------------------------

   If you are still learning C++, the learning curve that comes with the
   choice of TV as an application framework can be steep. There are a few
   good books that will demonstrate C++ for you. However, a book will never
   teach you a language. That comes by examining working code and through
   trial and error.

   Studying the source code for TV, if it is available, is a good way to
   understand the processes that give it life. But you must first
   understand C++.

   The examples that come with TV are a good platform to try out some of
   the features this framework offers, but they are not real world
   examples. The source code examples that can be found on the Internet are
   good ways to see the good (and bad) ways of writing C++, and the
   presentation of it.

   The discussion list will provide you with a means to try ideas out on
   one one another. No one will laugh at your suggestions or queries. In
   fact the List can be your most powerful ally in the resolving of
   problems or bugs in your code.

   The best way to learn TV and C++ is to write code. People learn by
   doing. Once you overcome the initial hurdles of the language extensions
   and continue to expand your directions, the use of TV is almost formula.

   -----------------------------------------------------------------------
			 Books and journals
   -----------------------------------------------------------------------

   Christian, Kaare (1993). "Borland C++ Techniques & Utilities." Ziff
	  Davis Press, Emeryville. ISBN 1-56276-054-8.

   Faison, Ted (1992). "Borland C++ 3.1 Object-Oriented Programming." Sams
	  Publishing, Indianopolis. Second edition. ISBN 0-672-30140-7.

   Finn, et al. (1994). "C++ Database Applications with the Paradox
		Engine." Windcrest/McGraw-Hill. ISBN 0-8306-4327-3

   Swan, Tom (1992). "Mastering Borland C++." Sams Publishing,
	  Indianopolis. ISBN 0-672-30274-8

   Welstead, Steve (1994). "Neural Network and Fuzzy Logic Applications in
      C/C++." John Wiley.  ISBN 0471-30975-3 (without disk) or
		ISBN 0471-30974-5 (with disk)

   "The C/C++ User's Journal."

   Dead Parrots

   -----------------------------------------------------------------------
   CHRISTIAN
   -----------------------------------------------------------------------

   Synopsis

   There is a 3.5" disk with source code included.

   Part 3 of this book is devoted to Turbo Vision (pages 179 - 270), but it
   only covers TV basics.

   The rest of the book teaches C++, streams, OWL, etc.

   Review

   No published review has been located yet. However, Craig Schlenter was
   of the opinion that it was a "good book."

   -----------------------------------------------------------------------
   FAISON
   -----------------------------------------------------------------------

   Synopsis

   USD39.95 with disk. The author shows how to make changes to TV defaults.
   The third edition does not include anything specifically relating to TV
   but covers BC4 instead.

   Review

   No published review has been located. Craig Schlenter rated it "very
   good".

   ----------------------------------------------------------------------- 
   FINN
   -----------------------------------------------------------------------

   Synopsis

   USD39.95 with disk. This book requires TV, Paradox Engine with Database
   Frameworks 3.01.

   Review

   A published review has not yet been located.

   -----------------------------------------------------------------------
   SWAN
   -----------------------------------------------------------------------

   Synopsis

   As the title suggests, the book relates to C++, specifically BC3.1.
   Topics covered by the author in this edition include object oriented
   programming, Turbo Vision and the ObjectWindows Library. Consistent with
   the publisher's style, the book contains such tutorial aids as
   summaries, tips, hints and cautionary notes.

   The author also describes and lists complete example programs for every
   Borland C++ procedure and function.
   USD39.95 with disk which contains the source code to the programming
   examples in the book, answers to the chapter exercises and reference
   information.

   Review

   No published review has been located. Craig Schlenter rated it "very 
   good".

   -----------------------------------------------------------------------
   WELSTEAD
   -----------------------------------------------------------------------

   Synopsis

   USD36.95 without disk or 49.95 with disk which includes source code for
   all applications and TV executables for most of the applications.

   This is a "how-to" book for writing your own neural network and fuzzy
   logic applications. Applications include pattern recognition, financial
   forecasting, chaos and dynamic control. In addition to basic neural
   network training methods such as backpropagation, the book covers
   advanced topics such as genetic algorithms, conjugate gradient,
   simulated annealing, self organizing networks and fuzzy genetic systems.

   One chapter is devoted to the development of a Turbo Vision application
   base class tailored to the general needs of training and running neural
   networks and fuzzy systems. The remaining chapters develop complete
   self-contained applications, with application-specific TV interface
   derived from the general base class.

   Review

   It is not known if a published review is available.

   Credit

   Thanks to Scott Sumner for finding and relaying this information.

   -----------------------------------------------------------------------
   CUJ
   -----------------------------------------------------------------------

   Welstead, Steve (1994). 'Scrolling List Dialog for Scientific
   Programming'. CUJ, 12(4)51-66.

   The author shows an alternative method of setting up a TV project that
   uses one header and *.cpp files as include files. The programming style
   is different to that from the Borland stable. The article describes how
   to build a scrolling list dialog using TV that will collect the input
   normally handled throught a command-line interface and prompt the user
   through a series of menus and dialog boxes.

   The source code is available from ftp://ftp.uu.net/pub/cuj   A slightly
   more elaborate version of the articles' code is available from
   ftp://vtucs.cc.vt.edu/turbo-vision.  These are promotions for Welstead's
   book.

   -----------------------------------------------------------------------
   DEAD PARROTS
   -----------------------------------------------------------------------

   Borland International (1992). "Turbo Vision for C++ User's Guide".
   Scotts Valey, CA.

   The link was suggested by the manual itself (see page 492). After
   pondering this indexed item deeply and philosophically, we realised that
   there was no answer! Therefore, applying the rule more honoured in its
   breach than observance, "Keep it simple", it became obvious that the
   reference had to be to the object itself, a (*this)!

   On a more serious note, TV is not well documented. The manual can only
   be described as obscure. This is unfortunate as a library's manual is a
   powerful adjunct. If the manual is unclear, then the benefits from the
   library will not be fully realised.

   One of the objectives of TVPlus, with your support, will be to clarify
   some of the points the manual tends to present unclearly, or does not
   mention at all. If you want to record dead parrots (i.e. would be
   errata), we would be happy to note them here.

   -----------------------------------------------------------------------
			 Software resources
   -----------------------------------------------------------------------

   This heading covers some of the software available which can be used
   with Turbo Vision to increase programming productivity.

   Utilities
   Software libraries
   The Borland TI series
   CDROM source code

   -----------------------------------------------------------------------
   UTILITIES
   -----------------------------------------------------------------------

   It seems that few utilities are designed specifically for TV. The ones
   we are aware of are listed here.

   NON COMMERCIAL

   A dialog box designer by Dave Baldwin - dlgdsn46.zip 1994
   TV resource workshop by Siskiyou Software - tvrw.zip 1993
   TV workshop by Mark Buchanan and Mark Timmings - tvwork.zip 1994:
	   generates menus, statuslines, hints and dialogs

   COMMERCIAL

   Turbo Vision Development ToolKit by IDC

   Originally for Pascal, TVDK was upgraded for C++ TV1.03. It is used to
   build TV applications. With the resource editor you can create the menu,
   hint texts and the help system. There are additional classes in the TVDT
   (like masked inputs).

   The original code contained several bugs.

   ----------------------------------------------------------------------
   Developer

	  Innovative Data Concepts
	  122 North York Road, Suite 5
	  Hatboro Pennsylvenia 19040
	  USA

	  Phone: +1 800 926 4551
	  Fax:   +1 215 443 9753
	  BBS:   +1 215 364 9131

	  Internet:
		  Technical Support:  71333.1575@compuserve.com
		  Customer Support:   75300.564@compuserve.com
	  FidoNet:
		  Technical Support:  IDC Tech Support, 1:273/232
		  Customer Support:   IDC Cust Support, 1:273/232

   ----------------------------------------------------------------------
   Product comparison

   Availability of source code

   TVDT Lite: No Source Code

   TVDT 2.5: Full, complete source code is provided for all classes,
   objects, and utilities. The Pascal source code for the Resource Editor
   and Windows Resource Converter is compatible with TP 6.0 or 7.0, and
   supports both Real Mode and Protected Mode versions of resedit.

   Resource editor

   TVDT Lite: The version of resedit supplied with the TVDT Lite package
   runs in Real Mode and is limited to 640K of memory.

   TVDT 2.5: With the full TVDT package, a 16-bit DPMI Protected Mode
   version of resedit is supplied supporting up to 16 MB of RAM.

   Debugging

   TVDT Lite: No debugging capabilities.

   TVDT 2.5: TVDT comes with the debugging libraries with complete symbolic
   debugging information for all the TVDT classes. Supports 16-bit Real
   Mode applications, 16-bit DPMI applications and 32-bit DPMI
   applications.

   Compatability

   TVDT Lite: Supports BC++ 4.0 and TV 2.0

   TVDT 2.5: In addition to supporting the Borland PowerPack, the full TVDT
   package supports earlier versions of Turbo Vision, such as the versions
   shipped with BC++ 3.1. Also supports TP 6.0, TP 7.0 and Borland Pascal
   7.0.

   Documentation

   TVDT Lite: Documentation is included in a single TV Help File; the
   package includes a TV Help File viewer using the TV THelpViewer class.

   TVDT 2.5: In addition to the on-line TV help file, the documentation is
   also available in Microsoft Windows Help File Format.

   No printed documentation is available with this release.


   -----------------------------------------------------------------------
   LIBRARIES
   -----------------------------------------------------------------------

   The libraries that extend TV is not limited to those we have listed
   here. However, we considered these to be more substantial than others of
   which we are aware.

   Protected mode for TV1.03 and BC3.1 by Kevin Morgan - pmapp.zip 1994
   Some useful gadgets and add-ins by Marc Stern - tvtool17.zip 1993
   Extension of TV classes by Roger Nelson - rvision.zip 1994
   Graphics extension by Simor Balazs - gfx210.zip 1994: excellent
   Graphics extension by Pat Reilly - tvalt.zip 1992
   Graphics extension by Mindware - tvg121.zip 1994
   Palette demonstration by Eric Woodruff - tvcolr.zip 1994
   Palette utilities by Craig Nelson - tvpal.zip 1992
   Palette utilities by Lincoln Beach Software - pald15.zip 1994
   Extension of TInputLine Class by Jeff Penrose - tde.zip 1992
   Improved help viewer and entended video mode output by Peter Brandstrom
	 - tvtoys.zip 1994
   Gadgets, widgets and special functions by Chris Ahlmstrom - face_tv.zip

   These files may be downloaded from the TVPlus site.


   ========================== END OF TEXT PART 1 =========================
-- 
Rachel Polanskis             grove@zeta.org.au            Robert Hazeltine  
                 http://www.zeta.org.au/~grove/grove.html
                       r.polanskis@nepean.uws.edu.au
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

User Contributions:

Comment about this article, ask questions, or add new information about this topic:




Part1 - Part2 - Part3

[ Usenet FAQs | Web FAQs | Documents | RFC Index ]

Send corrections/additions to the FAQ Maintainer:
grove@zeta.org.au (Rachel Polanskis)





Last Update March 27 2014 @ 02:11 PM