home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / tvision / tfield / tdbfield.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-25  |  8.4 KB  |  357 lines

  1. /*------------------------------------------------------------*/
  2. /* filename -       tdbfield.cpp                              */
  3. /*                                                            */
  4. /* function(s)                                                */
  5. /*                  TDoubleField member functions             */
  6. /*------------------------------------------------------------*/
  7.  
  8. /*------------------------------------------------------------*/
  9. /*                                                            */
  10. /*    Turbo Vision Extensions -- Version 1.1.1                */
  11. /*                                                            */
  12. /*                                                            */
  13. /*    Portions Copyright (c) 1991 by Borland International    */
  14. /*    All Rights Reserved.                                    */
  15. /*                                                            */
  16. /*    TV Extensions are Copyright (c) 1992 by Michael Bonner  */
  17. /*    These extensions may be freely used by any programmer   */
  18. /*    including royalty free inclusion in any commercial      */
  19. /*    application, but any commercial rights to the source    */
  20. /*    code or object files of the Extensions are reserved.    */
  21. /*                                                            */
  22. /*   Thanks to Jerry Jankura CI$ 70170,306 who contributed    */
  23. /*   the TDoubleField code!.                                            */
  24. /*------------------------------------------------------------*/
  25.  
  26. #define Uses_ipstream
  27. #define Uses_MsgBox
  28. #define Uses_opstream
  29. #define Uses_TDeskTop
  30. #define Uses_TDialog
  31. #define Uses_TDrawBuffer
  32. #define Uses_TEvent
  33. #define Uses_TField
  34. #define Uses_TDoubleField
  35. #define Uses_TKeys
  36. #define Uses_TRect
  37. #define Uses_TView
  38.  
  39. #include <tv.h>
  40. #include "tfield.h"
  41.  
  42. #if !defined( __CTYPE_H )
  43. #include <ctype.h>
  44. #endif  // __CTYPE_H
  45.  
  46. #if !defined( __STRING_H )
  47. #include <String.h>
  48. #endif  // __STRING_H
  49.  
  50. #if !defined( __DOS_H )
  51. #include <Dos.h>
  52. #endif  // __DOS_H
  53.  
  54. #if !defined( __MEM_H )
  55. #include <Mem.h>
  56. #endif  // __MEM_H
  57.  
  58. #if !defined( __STDLIB_H )
  59. #include <Stdlib.h>
  60. #endif // __STDLIB_H
  61.  
  62. #if !defined( __STRSTREAM_H )
  63. #include <Strstream.h>
  64. #endif // __STRSTREAM_H
  65.  
  66. const char * const near TDoubleField :: name = "TDoubleField";
  67.  
  68. TDoubleField :: TDoubleField (const TRect & bounds, int aMaxLen) :
  69.   TField (bounds, aMaxLen),
  70. value (0),
  71. maxValue (0),
  72. minValue (0),
  73. formatString (NULL)
  74. {
  75.   fieldType = TDoubleFieldType;
  76. }
  77.  
  78. TDoubleField :: ~TDoubleField ()
  79. {
  80.   if (formatString != NULL)
  81.      delete formatString;
  82. }
  83.  
  84. void TDoubleField :: convertData ()
  85. {
  86.     value = atof (data);
  87.     char buffer [SizeDouble];
  88.     sprintf (buffer, (formatString == NULL) ? "%.2f" : formatString, value);
  89.     strnset( data, '\0', maxLen );
  90.     strncpy (data, buffer, maxLen);
  91.     data [maxLen] = EOS;
  92.     drawView ();
  93.     dataChanged = False;
  94. }
  95.  
  96. ushort TDoubleField :: dataSize ()
  97. {
  98.   return sizeof (value);
  99. }
  100.  
  101. ushort TDoubleField :: filterCharCode (ushort charCode)      //Virtual
  102. {
  103.   char buffer [SizeDouble];
  104.  
  105.   ushort retChar = 0;
  106.  
  107.   Boolean test = False;
  108.  
  109.   switch (charCode)
  110.   {
  111.   case '0':
  112.   case '1':
  113.   case '2':
  114.   case '3':
  115.   case '4':
  116.   case '5':
  117.   case '6':
  118.   case '7':
  119.   case '8':
  120.   case '9':
  121.   case '.':
  122.     retChar = charCode;
  123.     break;
  124.  
  125.   case '-':
  126.     if ((selStart == 0)&&
  127.         (selEnd == strlen (data)))
  128.     {
  129.       if ((tfOptions & tfValidateMin) != 0)
  130.         if (value > minValue)
  131.         test = True;
  132.       else
  133.         test = False;
  134.         else
  135.         test = True;
  136.  
  137.       if (test)
  138.       {
  139.           if (dataChanged)
  140.           convertData ();
  141.         value--;
  142.         sprintf (buffer, (formatString == NULL) ? "%.2f" : formatString, value);
  143.           strnset (data, '\0', maxLen);
  144.           strncpy (data, buffer, maxLen);
  145.           data [maxLen] = EOS;
  146.         drawView ();
  147.       }
  148.       else
  149.         if ((tfOptions & tfBeepError) != 0)
  150.         beep ();
  151.         retChar = 1;
  152.     }
  153.      else
  154.       if (curPos == 0)
  155.       retChar = charCode;
  156.     else
  157.       if ((tfOptions & tfBeepError) != 0)
  158.       beep ();
  159.     break;
  160.  
  161.   case '+':
  162.     if ((selStart == 0)&&
  163.         (selEnd == strlen (data)))
  164.     {
  165.       if ((tfOptions & tfValidateMax) != 0)
  166.         if (value < maxValue)
  167.         test = True;
  168.       else
  169.         test = False;
  170.       else
  171.         test = True;
  172.  
  173.       if (test)
  174.       {
  175.           if (dataChanged)
  176.           convertData ();
  177.         value++;
  178.           sprintf (buffer, (formatString == NULL) ? "%.2f" : formatString, value);
  179.           strnset (data, '\0', maxLen);
  180.           strncpy (data, buffer, maxLen);
  181.           data [maxLen] = EOS;
  182.           drawView ();
  183.       }
  184.       else
  185.         if ((tfOptions & tfBeepError) != 0)
  186.         beep ();
  187.         retChar = 1;
  188.     }
  189.     else
  190.       if ((tfOptions & tfBeepError) != 0)
  191.       beep ();
  192.     break;
  193.  
  194.   case 0:
  195.     break;
  196.  
  197.   default:
  198.     if ((tfOptions & tfBeepError) != 0)
  199.         beep ();
  200.  
  201.   };
  202.  
  203.  
  204.   return retChar;
  205. }
  206.  
  207. void TDoubleField :: getData (void * rec)
  208. {
  209.   convertData ();
  210.   memcpy (rec, &value, sizeof (value));
  211. }
  212.  
  213. Boolean TDoubleField :: isValid (ushort command)
  214. {
  215.   Boolean status = True;
  216.   char buf [160];
  217.  
  218.   switch (command) {
  219.   case cmArriving:
  220.      status = True;
  221.      break;
  222.  
  223.   case cmLeaving:
  224.      if (((tfOptions & tfNotEmpty) != 0)&&
  225.         (strlen (data) == 0)) {
  226.         status = False;
  227.       if ((tfOptions & tfBeepError) != 0)
  228.         beep ();
  229.       messageBox ("This field must contain a number!",
  230.         mfWarning | mfOKButton);
  231.     }
  232.     else
  233.       if (((tfOptions & tfValidateMax) != 0)&&
  234.       (value > maxValue)) {
  235.       status = False;
  236.       if ((tfOptions & tfBeepError) != 0)
  237.         beep ();
  238.         ostrstream os (buf, sizeof (buf));
  239.       os << "The number in this field must be less than "
  240.         << maxValue << "!" << ends;
  241.       messageBox (buf, mfWarning | mfOKButton);
  242.     }
  243.     else
  244.       if (((tfOptions & tfValidateMin) != 0)&&
  245.       (value < minValue)) {
  246.       status = False;
  247.       if ((tfOptions & tfBeepError) != 0)
  248.         beep ();
  249.       ostrstream os (buf, sizeof (buf));
  250.         os << "The number in this field must be greater than "
  251.         << minValue << "!" << ends;
  252.       messageBox (buf, mfWarning | mfOKButton);
  253.     };
  254.     break;
  255.   };
  256.  
  257.   return status;
  258. }
  259.  
  260. ushort TDoubleField :: processKeyCode (ushort keyCode)       //Virtual
  261. {
  262.   ushort retKeyCode = keyCode;
  263.   // return a 1 to selectAll( true ) the field in the handleEvent routine
  264.  
  265.   char buffer [SizeDouble];
  266.  
  267.   if (keyCode == kbPgDn)
  268.      if ((selStart == 0)&&
  269.      (selEnd == strlen (data)))
  270.   {
  271.      if (dataChanged)
  272.         convertData ();
  273.      value += 10;
  274.      if (((tfOptions & tfValidateMax) != 0)&&
  275.       (value > maxValue))
  276.     {
  277.         value -= 10;
  278.       if ((tfOptions & tfBeepError) != 0)
  279.         beep ();
  280.     };
  281.     retKeyCode = 1;
  282.     sprintf (buffer, (formatString == NULL) ? "%.2f" : formatString, value);
  283.      strnset (data, '\0', maxLen);
  284.      strncpy (data, buffer, maxLen);
  285.      data [maxLen] = EOS;
  286.     drawView ();
  287.   };
  288.  
  289.   if (keyCode == kbPgUp)
  290.     if ((selStart == 0)&&
  291.     (selEnd == strlen (data)))
  292.   {
  293.     if (dataChanged)
  294.       convertData ();
  295.     value -= 10;
  296.     if (((tfOptions & tfValidateMin) != 0)&&
  297.       (value < minValue))
  298.     {
  299.       value += 10;
  300.       if ((tfOptions & tfBeepError) != 0)
  301.           beep ();
  302.     };
  303.     retKeyCode = 1;
  304.     sprintf (buffer, (formatString == NULL) ? "%.2f" : formatString, value);
  305.      strnset (data, '\0', maxLen);
  306.      strncpy (data, buffer, maxLen);
  307.      data [maxLen] = EOS;
  308.     drawView ();
  309.   };
  310.  
  311.   return retKeyCode;
  312. }
  313.  
  314. void TDoubleField :: setData (void * rec)
  315. {
  316.     char buffer [SizeDouble];
  317.     memcpy (&value, rec, sizeof (value));
  318.     sprintf (buffer, (formatString == NULL) ? "%.2f" : formatString, value);
  319.     strnset( data, '\0', maxLen );
  320.     strncpy (data, buffer, maxLen);
  321.     data [maxLen] = EOS;
  322.     selectAll (True);
  323. }
  324.  
  325. void TDoubleField :: setFormat (char * newFormat)
  326. {
  327.   if (formatString != NULL)
  328.      delete formatString;
  329.  
  330.   formatString = newStr (newFormat);
  331.  
  332.   char buffer [SizeDouble];
  333.   sprintf (buffer, (formatString == NULL) ? "%.2f" : formatString, value);
  334.   strnset (data, '\0', maxLen);
  335.   strncpy (data, buffer, maxLen);
  336.   data [maxLen] = EOS;
  337.   drawView ();
  338. }
  339.  
  340. void TDoubleField :: setMax (float newMax)
  341. {
  342.   maxValue = newMax;
  343.   setTFOptions (tfValidateMax, True);
  344.  
  345.   if (minValue > maxValue)
  346.     minValue = maxValue;
  347. }
  348.  
  349. void TDoubleField :: setMin (float newMin)
  350. {
  351.   minValue = newMin;
  352.   setTFOptions (tfValidateMin, True);
  353.  
  354.   if (maxValue < minValue)
  355.     maxValue = minValue;
  356. }
  357.