home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mavcl130.zip / readme.txt < prev    next >
Text File  |  1997-02-25  |  23KB  |  591 lines

  1.  
  2. Welcome to MAVERICK CLASS LIBRARY v1.30!
  3.  
  4. 1. WHAT IS IT ?
  5. MAVCL is a 32 bit class library written in IBM C++ (part of IBM VISUALAGE FOR C++)
  6. providing support for those typical business and general purpose application functions
  7. not directly provided by IBM Open Class class library. In particular MAVCL implements
  8. formatted entry fields, quality printer support, regular expressions,
  9. directory services and conversion functions
  10. for date / time with national language support.
  11. A VBE and a VBB file are included, for formatted entry fields support from
  12. VISUAL BUILDER. In the current version IBM Visual Builder lacks the support for
  13. formatted entry fields that VA for Smalltalk has.
  14.  
  15. SOURCE CODE IS INCLUDED.
  16.  
  17. I've been using these classes for two years in my OS/2 applications
  18. with high reliability and user satisfaction. I'm distributing the product
  19. as freeware to promote OS/2 application development and to get
  20. comments from other developers that could help me in improving
  21. my final product quality.
  22.  
  23. CLASSES ARE DOCUMENTED IN THIS FILE (README.TXT).
  24.  
  25. If I'll receive positive feedback from YOU I'll supply detailed design
  26. in the versions to come. The source code is commented everywhere.
  27.  
  28. The sample program SAMPLE.EXE prints a typical business report
  29. with data arranged in columns, text break within a column and
  30. a bitmap printed. It also allows the user to enter text, date and numbers in
  31. sample formatted entry fields.
  32.  
  33. AS EVERYTHING IS LINKED DINAMICALLY YOU MUST HAVE VISUALAGE DLLs
  34. IN YOUR LIBPATH TO RUN THIS SAMPLE.
  35.  
  36. Otherwise you can recompile linking to static libraries.
  37.  
  38. 2. INSTALLATION
  39.  
  40. 2.1 Development environment
  41. unzip MAVCLnnn.ZIP in a directory which is in named your LIBPATH, INCLUDE, LIB
  42. environment variables.
  43. This directory will contain all relevant source and include files,
  44. the DLL (MAVCL.DLL) and the sample program SAMPLE.EXE.
  45. The subdirectory SAMPLE contains the source code for the sample program.
  46. This release is compiled with IBM Visualage for C++ version 3.0 upgraded
  47. al level CTC306, CTO306.
  48. To get these updates ftp ftp.software.ibm.com /ps/products/visualagecpp/fixes
  49. or ftp.boulder.ibm.com same directory.
  50.  
  51. 2.2 Runtime environment
  52. Your compiled program only needs MAVCL.DLL in a directory named in LIBPATH.
  53. MAVCL.DLL cannot be renamed.
  54.  
  55. 2.3 Visual Builder
  56. Simply load the MAVFRENT.VBB file or import the parts information contained
  57. in MAVFRENT.VBE to recreate MAVFRENT.VBB.
  58. The LIBPATH, INCLUDE, LIB must be as described in 2.1 and 2.2 above.
  59. For usage of formatted entry fields in Visual Builder see section 3.1.3.
  60.  
  61. If you send me some nice icons for the four entry fields, I'll integrate them
  62. in the DLL to make them show automatically in the VB palette, in next version.
  63.  
  64. 3. FEATURES
  65. In this section a short description is given of the classes and their main methods.
  66.  
  67. 3.1 Formatted entry fields
  68.  
  69. you must include: MAVFRENT.HPP
  70. source code: MAVFRENT.CPP
  71.  
  72. 3.1.1 Description
  73.  
  74. The class FormEntryField inherits from IEntryField. Do not create instances
  75. of this class. It is only used as a base class for:
  76. AlphaEntryField: entry fields for alphanumeric (IString) variables
  77. NumEntryField: entry fields for numeric (double) variables
  78. DateEntryField: entry fields for date (IDate) variables
  79. TimeEntryField: entry fields for time (ITime) variables
  80.  
  81. NumEntryField and DateEntryField take into account national settings of OS/2
  82. to format and check variables.
  83.  
  84. All classes have a constructor for use with a resource field and a
  85. constructor to specify also coordinates in a window, overriding
  86. corresponding contrustors of IEntryField.
  87.  
  88. Depending on legal characters for each field and field configuration
  89. illegal keys are inhibited (for example during numeric entry only
  90. numbers, +, -, e characters are allowed).
  91.  
  92. For fields requiring a separator all of  " ,/-.=*_:" characters are valid
  93. separators. When leaving the field the separator required by national
  94. settings is used to format the string in the field.
  95.  
  96. When leaving the field with an invalid entry (for example and invalid date
  97. for DateEntryField or a number out of the user-given range for NumEntryField),
  98. the field background turns red to alert the operator.
  99.  
  100. 3.1.2 Main methods
  101.  
  102. 3.1.2.1 AlphaEntryField
  103.  
  104. Constructors:
  105.  
  106. AlphaEntryField::AlphaEntryField(unsigned long l,
  107. IWindow * iw, IWindow * iw1, const IRectangle & r,
  108. Boolean b1, Boolean b2, IString s, IString s1)
  109.  
  110. AlphaEntryField::AlphaEntryField(unsigned long l, IWindow * iw,
  111. Boolean b1, Boolean b2, IString s, IString s1)
  112.  
  113. where l is the field id, iw and iw1 are parent and owner, r is the
  114. framing rectangle (for these first four variables refer to IEntryField).
  115. b1=true if all capital characters required
  116. b2=true if no numeric characters are allowed
  117. s is a string containing all allowed characters, if empty (default)
  118. no check is made.
  119. s1 is a regular expression that entry field must match, if empty (default)
  120. no check is made.
  121.  
  122. The constructor
  123. AlphaEntryField(unsigned long id, IWindow * parent,
  124. IWindow * owner, const IRectangle & rect,
  125. const IEntryField::Style & style);
  126. is supplied for Visual Builder.
  127.  
  128. Main methods:
  129.  
  130. setText() to set text.
  131. text() to get text().
  132.  
  133. Instance variable access methods (used also by Visual Builder)
  134. Boolean isNoNumberAllowed() const
  135. void noNumberAllowed(Boolean noNumberAllowed)
  136. Boolean isCapsLock() const
  137. void capsLock(Boolean capsLock)
  138. IString& allowedChars () const
  139. void setAllowedChars (const IString& allowedChars)
  140. IString& regex () const
  141. void setRegex (const IString& regex)
  142.  
  143. 3.1.2.2 NumEntryField
  144.  
  145. Constructors:
  146.  
  147. NumEntryField::NumEntryField(unsigned long l,
  148. IWindow * iw, IWindow * iw1, const IRectangle & r, Boolean b1, Boolean b2,
  149. double dblMin1, double dblMax1)
  150.  
  151. NumEntryField::NumEntryField(unsigned long l, IWindow * iw,
  152. Boolean b1, Boolean b2,
  153. double dblMin1, double dblMax1)
  154.  
  155. The constructor
  156. NumEntryField(unsigned long id, IWindow * parent,
  157. IWindow * owner, const IRectangle & rect,
  158. const IEntryField::Style & style);
  159. is supplied for Visual Builder.
  160.  
  161. where l is the field id, iw and iw1 are parent and owner, r is the
  162. framing rectangle (for these first four variables refer to IEntryField).
  163. b1=true thousands separator are to be shown when the field is left
  164. b2=true if "0" is to be shown when the fields is 0, b2=false means
  165. the field is left empty when the content is 0.
  166. if dblMin1 and dblMax1 are indicated a check is made when leaving
  167. the field that the content is in the given range
  168.  
  169. Main methods:
  170.  
  171. setDouble(double) to set the field content.
  172. double getDouble() to get the field content.
  173.  
  174. Instance variable access methods (used also by Visual Builder)
  175. Boolean isThousDisplayed() const
  176. void thousDisplayed(Boolean booThousDisplayed)
  177. Boolean isShowZero() const
  178. void showZero(Boolean showZero)
  179. double minAllowed() const
  180. void setMinAllowed (const double minAllowed)
  181. double maxAllowed() const
  182. void setMaxAllowed (const double maxAllowed)
  183.  
  184. 3.1.2.3 DateEntryField
  185.  
  186. Constructors:
  187.  
  188. DateEntryField::DateEntryField(unsigned long l,
  189. IWindow * iw, IWindow * iw1, const IRectangle & r, Boolean b1)
  190.  
  191. DateEntryField::DateEntryField(unsigned long l, IWindow * iw, Boolean b1)
  192.  
  193. where l is the field id, iw and iw1 are parent and owner, r is the
  194. framing rectangle (for these first four variables refer to IEntryField).
  195. b1=true means do not display year (only month/day)
  196.  
  197. The constructor
  198. DateEntryField(unsigned long id, IWindow * parent,
  199. IWindow * owner, const IRectangle & rect,
  200. const IEntryField::Style & style);
  201. is supplied for Visual Builder.
  202.  
  203. Main methods:
  204.  
  205. setDate(IDate &) to set the field content.
  206. IDate getDate() to get the field content.
  207. IString getTextWithDefault() get the date as text returning 01/01/1700 if
  208. invalid date entered (for DB default)
  209.  
  210. Instance variable access methods (used also by Visual Builder)
  211. Boolean isNoYearDisplayed() const
  212. void noYearDisplayed(Boolean noYearDisplayed)
  213.  
  214. 3.1.2.4 TimeEntryField
  215.  
  216. TimeEntryField::TimeEntryField(unsigned long l, IWindow * iw,
  217. IWindow * iw1, const IRectangle & r)
  218.  
  219. TimeEntryField::TimeEntryField(unsigned long l, IWindow * iw)
  220.  
  221. where l is the field id, iw and iw1 are parent and owner, r is the
  222. framing rectangle (for these first four variables refer to IEntryField).
  223.  
  224. The constructor
  225. TimeEntryField(unsigned long id, IWindow * parent,
  226. IWindow * owner, const IRectangle & rect,
  227. const IEntryField::Style & style);
  228. is supplied for Visual Builder.
  229.  
  230. Main methods:
  231.  
  232. setTime(ITime &) to set the field content.
  233. ITime getTime() to get the field content.
  234. IString getTextWithDefault() get the time as text returning 00:00:00 if
  235. invalid time entered (for DB default)
  236.  
  237. 3.1.3 Visual Buider Notes
  238. VBE IMPORTED VISUAL PARTS ARE AVAILABLE FROM LEVEL CTV302 ON.
  239. You will be able to use formatted entry fields using the "Option -> Add part" menu
  240. item and typing, for example, AlphaEntryField* in the type field. Then
  241. place the cursor anywhere in your composer area and click.
  242. Entry field parts shall appear as pale gray boxes in the composition editor,
  243. which means you will not see a thing on a pale grey background.
  244. Attributes and actions have been added to make the connections.
  245. If you plan to use Maverick entry fields often, which is the case for
  246. business application developers, you'll probably like to add four entries
  247. to the data entry palette of Visual Builder using the
  248. "Option -> Modify palette -> Add New Part" menu item.
  249. If you need to connect date, time and numeric entry fields content
  250. to other objects with an attribute-attribute connection, you'll
  251. need attributes of the corresponding type (IDate, ITime, double), which are
  252. included.
  253. If you need to connect date or time to objects created by the Data Access Builder,
  254. you'll find that DAX creates attibutes of type IString for both DATE and TIME DB2
  255. field types. Unfortunately you cannot connect diectly the text attribute of
  256. Formatted entry fields to these DAX object attribute, as, if you enter an invalid
  257. date, an exception is raised (maybe that's what you want, in that case no problem).
  258. The textWithDefault attributes are implemented for date and time entry fields.
  259. These atributes contain default values (01 jan 1700 for dates and 00:00:00 for time)
  260. if the user entry is NULL or invalid, so you can connect them to DAX objects and
  261. NULL values are handled.
  262.  
  263. 3.2 Printer support
  264.  
  265. you must include: MAVPRINT.HPP
  266. source code: MAVPRINT.CPP MPSETUP.CPP
  267.  
  268. 3.2.1 Description
  269.  
  270. The MavPrint class supplies support to the activities of printer
  271. selection, printer selection dialog, font selection and retrieving,
  272. basic string printing in a presentation space, text printing in a
  273. defined rectangle in a presentation space with line wrap and
  274. bitmap printing in a defined rectangle in a presentation space with
  275. or without maintaining aspect ratio.
  276. The page is divided in header (space above margins),
  277.  margined page (space inside margins)
  278. and footer (space below margins).
  279. An handle is given to the presentation space
  280. and one to the device context so that the programmer can use all Gpi
  281. OS/2 functions directly.
  282. The printer selection method is taken from the article "One Call Does It All"
  283. by Monte Copeland in Developer Connection 6. I only rewrote the dialog
  284. functions using IBM classes and changed few things for C++ recompilation.
  285.  
  286. 3.2.2 Main methods
  287.  
  288. All Bollean functions return true on successfull completion,
  289. false on error.
  290.  
  291. void MavPrint::setHAB(HAB h1)
  292. void MavPrint::setWorldCoords(LONG l1)
  293.  
  294. You MUST call these two function before calling setupPrinter to
  295. set the anchor block and the World Coordinates unit of measure (for
  296. ex. PU_TWIPS or PU_LOMETRIC)
  297.  
  298. Boolean MavPrint::setupPrinter(PSZ pszUserQueueName,
  299. PSZ pszUserPrintFileName,
  300. IWindow *, int)
  301.  
  302. Boolean MavPrint::setupPrinter(IWindow *, int)
  303.  
  304. setupPrinter is the printer selection function.
  305. It fills the private structure PRINTERSETUP with the selected printer
  306. relevant data.
  307.  
  308. call with pszUserQueueName if you want a specific queue you know in advance,
  309. in this case you can also use pszUserPrintFileName for file printing.
  310. call with a valid owner (IWindow*) if you want the print queue dialog
  311. to be shown. the last int parameter is the number of copies.
  312. These classes have been written in Italy, so if country code is
  313. 039 the printer selection dialog is shown in italian, otherwise in english.
  314. Always call with PSZs allocated for the maximum queue name length, they will
  315. be filled on successfull completion with queue/file names.
  316. Call w/o the string parameters if you are not interested in getting
  317. queue/file names.
  318. Call with strings allocated but empty to select the default queue and
  319. getting its name.
  320.  
  321. void MavPrint::cleanupPrinter()
  322. frees all resources allocated by setupPrinter.
  323.  
  324. After you have selected a printer you must open a print job before drawing.
  325. This is done by
  326. Boolean MavPrint::openPrinterJob(PSZ pszJobTitle)
  327. that creates a suitable HPS and HDC you'll be able to retrieve using
  328. HDC MavPrint::getHDC()
  329. HPS MavPrint::getHPS()
  330.  
  331.  
  332. Remember to call
  333. void MavPrint::closePrinterJob()
  334. to close HPS and HDC, free resources and send job content to the printer.
  335.  
  336. or
  337.  
  338. void MavPrint::abortPrinterJob()
  339. to close HPS and HDC, free resources and ABORT job.
  340.  
  341. Then define margins using
  342. Boolean MavPrint::setMargins(LONG lxLeft, LONG lxRight,
  343. LONG lyTop, LONG lyBottom)
  344. This will set data needed by the conversion functions
  345.  
  346. PPOINTL MavPrint::coordsInHeader(PPOINTL p1, PPOINTL p2);
  347. PPOINTL MavPrint::coordsInFooter(PPOINTL p1, PPOINTL p2);
  348. PPOINTL MavPrint::coordsInMargins(PPOINTL p1, PPOINTL p2);
  349. PRECTL MavPrint::rectlInMargins(PRECTL r1, PRECTL r2);
  350.  
  351. You will use these functions as all the MavPrint drawing functions work in
  352. world coordinates (as if no margin was defined). You probably like more
  353. to think to points in the header/margin/footer frame, so conversions are
  354. required. For example imagine you want to print a string at the lower-left
  355. corner of your header. You store the coords (0,0) in a POINTL p2, declare
  356. a buffer POINTL p1 and call
  357.  
  358. if(! printer.printStringAt( printer.coordsInHeader(&p2, &p1), string ) ) { Error(); }
  359.  
  360. In the same way you can call the other conversion functions for Footer and
  361. margins and the rectangle conversion function for margins.
  362.  
  363. Other useful function for page size and margins handling are the following:
  364.  
  365. RECTL * MavPrint::getMargins()
  366. SIZEL * MavPrint::getMarginedPageSize()
  367. SIZEL * MavPrint::getPageSize()
  368. SIZEL * MavPrint::getHeaderSize()
  369. SIZEL * MavPrint::getFooterSize()
  370.  
  371. which simply return the sizes of the various ereas in the logical page.
  372.  
  373. We're now ready for drawing text and graphics without being concerned with
  374. frames and physical printers. All relevant data have been encapsulated in
  375. the previously defined functions.
  376.  
  377. If, for special needs, you want to access to the actual printer data you can
  378. retrieve the DEVOPENDATA struct using
  379.  
  380. PDEVOPENDATA MavPrint::getDevOpenData()
  381.  
  382. For example I needed this function programming for Workplace Shell, where
  383. the wpPrintPrinterSpecificFile function requires a structure containing data
  384. I retrieved from DEVOPENDATA.
  385.  
  386. All graphic drawing function can now be done calling the PM Gpi APIs,
  387. supplying as a parameter the HPS you can get calling MavPrint::getHPS().
  388.  
  389. MAVCL provides methods for drawing text and handle fonts.
  390.  
  391. LONG MavPrint::createFontMatching(PSZ pszFacename, LONG lPointSize,
  392. ULONG fl, PBOOL pfScalable, PSIZEF psizfxBox)
  393.  
  394. is used to create a font. An image font
  395. is first searched for and if one is not found that matches the
  396. font face and size, a scalable font is then searched.
  397. When calling this function MavPrint returns a non-zero LONG (zero is returned
  398. on error) that you can store in a local variable for the following font
  399. selection (by the way this LONG corresponds to the PM lLcId). So the
  400. typical use of this function is, as in the SAMPLE program, to build a set of
  401. fonts after job start. Each font can then be selected for actual drawing calling
  402. MavPrint::selectLogFont. When you create a font it is also selected,
  403. so you can use it without calling MavPrint::selectLogFont.
  404. pszFacename is a string containing face name (for ex. "Helvetica");
  405. lPointSize is the required nominal size of the font (for ex. 12). It is
  406. always expressed in points, independent from the world coordinates
  407. unit of measure selected for the presentation space.
  408. The optional parameter fl can be used to ask for font attributes, as italic
  409. or bold, refer to FATTRS structure fsSelection field for allowed values.
  410. The optional parameter pfScalable is a pointer to a boolean that is
  411. returned as TRUE if the created font is scalable or false.
  412. The optional parameter psizfxBox is a pointer to a SIZEF structure
  413. that is filled with the size of the selected font.
  414.  
  415. Boolean MavPrint::selectLogFont(LONG lLcId, PSIZEF psizfxBox)
  416.  
  417. This function selects a font previously created with
  418. MavPrint::createFontMatching.
  419. lLcId is the id of the font returned by MavPrint::createFontMatching.
  420. The optional parameter psizfxBox is a pointer to a SIZEF structure
  421. that is filled with the size of the selected font.
  422.  
  423. Boolean MavPrint::printStringAt(PPOINTL pnt, PSZ string, LONG len)
  424. Boolean MavPrint::printStringAt(PPOINTL pnt, IString & string, LONG len)
  425.  
  426. These functions print string (either PSZ or IString) at the point
  427. pnt in the selected font. If the optional parameter len is supplied
  428. the string is clipped to the specified len.
  429. Both pnt and len are expressed in world coords units of measure.
  430. pnt is in page coords. Use conversion functions to use
  431. margins/header/footer coordinates as shown above.
  432.  
  433.  
  434. Boolean MavPrint::printTextInBox(PRECTL prct,
  435. PSZ string, LONG & lWordsNotWritten, USHORT usShrink,
  436. LONG lControl, LONG lRound)
  437.  
  438. Boolean MavPrint::printTextInBox(PRECTL prct,
  439. IString & string, LONG & lWordsNotWritten, USHORT usShrink,
  440. LONG lControl, LONG lRound)
  441.  
  442. These functions print a text inside the rectangle area pointed by prct.
  443. in the selected font. prct is expressed in world coords units of measure.
  444. prct is in page coords. Use conversion functions to use
  445. margins coordinates as shown above.
  446. CRs (\n) are taken into account to split lines.
  447. if text does not fit lWordsNotWritten returns the number of words left out.
  448. On exit prct contains the rectangle actually used
  449. that may be less than maximum allowed in the passed prct rectangle
  450. depending on text length and on usShrink.
  451. In fact  in this case rectangle is lowered.
  452. lControl is the parameter of GpiBox (default 0)
  453. lRound is the corner rounding axis of an ellipse as in GpiBox  (default 0)
  454. usShrink = 0: do not shrink rectangle round text
  455. usShrink = 1: shrink rectangle round text  (default)
  456. usShrink = 2: shrink rectangle round text only vertically
  457. These are the most flexible text print functions of MAVCL, as they allow
  458. to print in a fixed page region, handle text split, can show the rectangular
  459. area if lControl = DRO_OUTLINE.
  460. If the area if too small to fit passed string text the functions return the
  461. number of worlds that did not fit, so that the programmer can perform
  462. the relative actions (as change page and call the function again with the
  463. remaining text).
  464.  
  465. Boolean MavPrint::printBitmapInBox(RECTL * rectl, PSZ pszFileName,
  466. Boolean booMaintainAspectRatio)
  467.  
  468. These functions print a text inside the rectangle area pointed by prct.
  469. prct is expressed in world coords units of measure.
  470. prct is in page coords. Use conversion functions to use
  471. margins coordinates as shown above.
  472. The bitmap is idetintified by its file name.
  473. The function can shrink or expand the bitmap to fill the passed rectangular
  474. region.
  475. if booMaintainAspectRatio is set to true the bitmap is sshrinked or expanded
  476. to fit the supplied area, but if the area horizontal/vertical size ratio is
  477. not equal to the bitmap ratio the bitmap is drawn at the lower-left corner
  478. of prct and its apect ratio maintained.
  479.  
  480. Boolean MavPrint::newPage()
  481. Changes page.
  482.  
  483.  
  484. 3.3 Date/Number conversions to/from string
  485.  
  486. you must include: MAVCONV.HPP
  487. source code: MAVCONV.CPP
  488.  
  489. 3.3.1 Description
  490.  
  491. This is not a class, it is a collection of functions you can use to convert
  492. date/numbers to/from strings taking into account national settings of OS/2
  493. to format and check variables.
  494.  
  495. For dates all of  " ,/-.=*_:" characters are valid
  496. separators.
  497.  
  498. 3.3.2 Main methods
  499.  
  500. IDate StringToDate(const IString & temps1)
  501.  
  502. IString DateToString(const IDate & d, const Boolean booNoYear)
  503. booNoYear = true makes year digits not to be swown.
  504. booFullYear = if true 4 digits swown for year (1987) else 2 = default (87).
  505.  
  506. double StringToDouble(IString & temps)
  507.  
  508. IString DoubleToString(const double d, const Boolean booTh)
  509. booTh = true makes thousands separators to be swown.
  510.  
  511.  
  512. 3.4 regular expressions
  513.  
  514. you must include: MAVREGEX.HPP
  515. source code: MAVREGEX.CPP
  516.  
  517. 3.4.1 Description
  518.  
  519. 3.4.2 Main methods
  520.  
  521. Constructor:
  522.  
  523. RegEx::RegEx(istream & s1, ostream & s2, IString& strFlags);
  524. s1 and s2 are input and output streams.
  525. s2 will be filled after process() call.
  526. for strFlags see MAVREGEX.CPP.
  527.  
  528. void RegEx::process(IString & strRegex);
  529. fills the output stream with the matching line.
  530.  
  531. 3.5 directory services
  532.  
  533. you must include: MAVDRSR.HPP
  534. source code: MAVDRSR.CPP
  535.  
  536. 3.5.1 Description
  537.  
  538. This is a very simple class that returns the files in a directory.
  539.  
  540. 3.5.2 Main methods
  541.  
  542. Constructor:
  543.  
  544. DirServ::DirServ(IString & str1)
  545. str1 is the directory name.
  546.  
  547. IString DirServ::getNext()
  548. returns the next file in the directory.
  549.  
  550. INT DirServ::errorCode()
  551. read error code.
  552.  
  553. 4. WHAT'S NEW
  554.  
  555. ver 1.3
  556.  
  557. - OS/2 Warp 4.0 supported
  558. - abortPrinterJob method added
  559. - number of copies in setupPrinter method added
  560.  
  561. ver 1.2
  562.  
  563. - Fomatted entry fields integration in Visual Builder
  564.  
  565. - Minor bug fixed in time and date entry fields: retyping on the
  566. first part of the field caused a wrong cursor placement at the end
  567. of the field.
  568.  
  569. ver 1.1
  570.  
  571. - Visualage C++ compiler ver. 3.01 support
  572.  
  573. 5. REGISTRATION
  574.  
  575. Please read REGISTER.DOC and LICENSE.TXT
  576.  
  577. 6. CONTACTING THE AUTHOR
  578.  
  579. If you use MAVCL in your program(s) please send your comments to the
  580. address below using the form in REGISTER.DOC.
  581.  
  582. Your help and encouragement will ensure future versions of MAVCL.
  583.  
  584. Fabrizio AVERSA
  585. Via Tangorra 1
  586. Rome 00191
  587. Italy
  588. Tel/Fax +39-6-3297747
  589. internet: faversa@mbox.vol.it
  590.  
  591.