home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 April / Chip_1997-04_cd.bin / prezent / cb / data.z / SYSDEFS.H < prev    next >
C/C++ Source or Header  |  1997-01-16  |  76KB  |  1,944 lines

  1. //---------------------------------------------------------------------------
  2. //    sysdefs.h - support for properties & vcl intrinsic types
  3. //---------------------------------------------------------------------------
  4. // $Revision:   1.87  $
  5. //-------------------------------------------------------------------------
  6. //    copyright (c) 1996 Borland International
  7. //----------------------------------------------------------------------------
  8. #ifndef SYSDEFS_H
  9. #define SYSDEFS_H
  10. #if __BORLANDC__ < 0x500
  11. #error BCW 5.0 or greater required
  12. #endif
  13.  
  14. //---------------------------------------------------------------------------
  15. // VCL files must be built with namespace option enabled to eliminate
  16. //     ambiguities such as Graphics and Windows TBitmap.
  17. //---------------------------------------------------------------------------
  18. #if !defined(BCB_NAMESPACES)
  19. #define BCB_NAMESPACES
  20. #endif
  21.  
  22. //---------------------------------------------------------------------------
  23. #pragma option -w-lvc       // turn off "temp used for param" warnings
  24. #pragma option -w-inl       // turn off "cannot expand inline..." warnings
  25.  
  26. #pragma anon_struct on      // support anonymous structs (within unions)
  27. //---------------------------------------------------------------------------
  28. #include <stdlib.h>
  29. #include <stdio.h>
  30. #ifdef SEEK_SET
  31. #undef SEEK_SET
  32. #undef SEEK_CUR
  33. #undef SEEK_END
  34. #endif
  35. #include <string.h>
  36. #include <dstring.h>
  37. //---------------------------------------------------------------------------
  38. #define DYNAMIC
  39. #define MESSAGE
  40. #define HIDESBASE __declspec(hidesbase)
  41.  
  42. extern "C" __int64 _roundToInt64(long double);
  43.  
  44. //---------------------------------------------------------------------------
  45. //forward declarations
  46. //
  47. #if defined(BCB_NAMESPACES)
  48. namespace Ole2
  49. {
  50. #endif
  51.  
  52.   class IUnknown;
  53.   class IDispatch;
  54.  
  55. #if defined(BCB_NAMESPACES)
  56. }
  57. #endif
  58.  
  59. #if defined(BCB_NAMESPACES)
  60. namespace Classes
  61. {
  62. #endif
  63.  
  64.   class TPersistent;
  65.  
  66. #if defined(BCB_NAMESPACES)
  67. }
  68. using namespace Classes;
  69. #endif
  70.  
  71. #if defined(BCB_NAMESPACES)
  72. namespace System
  73. {
  74. #endif
  75.  
  76. class __declspec(delphireturn) Variant;
  77.  
  78. //---------------------------------------------------------------------------
  79. class TMetaClass;
  80. //---------------------------------------------------------------------------
  81. typedef TMetaClass* TClass;
  82. //---------------------------------------------------------------------------
  83. //---------------------------------------------------------------------------
  84. class __declspec(delphireturn) CurrencyBase
  85. {
  86.   public:
  87.     __int64 Val;
  88. };
  89. //---------------------------------------------------------------------------
  90. class __declspec(delphireturn) Currency : public CurrencyBase
  91. {
  92.   friend Currency __fastcall operator +(int lhs, const Currency& rhs);
  93.   friend Currency __fastcall operator -(int lhs, const Currency& rhs);
  94.   friend Currency __fastcall operator *(int lhs, const Currency& rhs);
  95.   friend Currency __fastcall operator /(int lhs, const Currency& rhs);
  96.   friend Currency __fastcall operator +(double lhs, const Currency& rhs);
  97.   friend Currency __fastcall operator -(double lhs, const Currency& rhs);
  98.   friend Currency __fastcall operator *(double lhs, const Currency& rhs);
  99.   friend Currency __fastcall operator /(double lhs, const Currency& rhs);
  100.   public:
  101.     __fastcall Currency()                        {Val = 0;}
  102.     __fastcall Currency(double val)         {Val = _roundToInt64(10000 * val);}
  103.     __fastcall Currency(int val)           {Val = 10000*(__int64)val;}
  104.     __fastcall Currency(const CurrencyBase& src) {Val = src.Val;}
  105.     __fastcall Currency(const Currency& src)     {Val = src.Val;}
  106.     __fastcall Currency(const AnsiString& src);
  107.  
  108.     Currency& __fastcall operator =(double rhs)
  109.     {
  110.     Val = _roundToInt64(10000 * rhs);
  111.     return *this;
  112.     }
  113.     Currency& __fastcall operator =(int rhs)
  114.       {Val = 10000*(__int64)rhs; return *this;}
  115.     Currency& __fastcall operator =(const CurrencyBase& rhs)
  116.       {Val=rhs.Val;return *this;}
  117.     Currency& __fastcall operator =(const Currency& rhs)
  118.       {Val = rhs.Val; return *this;}
  119.  
  120.     Currency& __fastcall operator +=(const Currency& rhs)
  121.       {Val += rhs.Val; return *this;}
  122.     Currency& __fastcall operator -=(const Currency& rhs)
  123.       {Val -= rhs.Val; return *this;}
  124.     Currency& __fastcall operator *=(const Currency& rhs)
  125.       {Val *= rhs.Val; Val /= 10000; return *this;}
  126.     Currency& __fastcall operator /=(const Currency& rhs)
  127.       {Val *= 10000; Val /= rhs.Val; return *this;}
  128.     Currency& __fastcall operator %=(int rhs)
  129.       {Val %= 10000 * (__int64)rhs; return *this;}
  130.  
  131.     Currency& operator ++() {Val += 10000; return *this;}
  132.     Currency operator ++(int) {Currency tmp(*this); Val += 10000; return tmp;}
  133.     Currency& operator --() {Val -= 10000; return *this;}
  134.     Currency operator --(int) {Currency tmp(*this); Val -= 10000; return tmp;}
  135.  
  136.     Currency __fastcall operator +(const Currency& rhs) const
  137.       {Currency tmp(*this); return tmp += rhs;}
  138.     Currency __fastcall operator -(const Currency& rhs) const
  139.       {Currency tmp(*this); return tmp -= rhs;}
  140.     Currency __fastcall operator *(const Currency& rhs) const
  141.       {Currency tmp(*this); return tmp *= rhs;}
  142.     Currency __fastcall operator /(const Currency& rhs) const
  143.       {Currency tmp(*this); return tmp /= rhs;}
  144.  
  145.     Currency __fastcall operator +(int rhs) const
  146.       {Currency tmp(*this); return tmp += Currency(rhs);}
  147.     Currency __fastcall operator -(int rhs) const
  148.       {Currency tmp(*this); return tmp -= Currency(rhs);}
  149.     Currency __fastcall operator *(int rhs) const
  150.       {Currency tmp(*this); return tmp *= Currency(rhs);}
  151.     Currency __fastcall operator /(int rhs) const
  152.       {Currency tmp(*this); return tmp /= Currency(rhs);}
  153.     Currency __fastcall operator %(int rhs) const
  154.       {return Currency(static_cast<int>(Val % (10000 * (__int64)rhs))) / 10000;}
  155.  
  156.     Currency __fastcall operator +(double rhs) const
  157.       {Currency tmp(*this); return tmp += Currency(rhs);}
  158.     Currency __fastcall operator -(double rhs) const
  159.       {Currency tmp(*this); return tmp -= Currency(rhs);}
  160.     Currency __fastcall operator *(double rhs) const
  161.       {Currency tmp(*this); return tmp *= Currency(rhs);}
  162.     Currency __fastcall operator /(double rhs) const
  163.       {Currency tmp(*this); return tmp /= Currency(rhs);}
  164.  
  165.     Currency __fastcall operator -() const
  166.       {Currency tmp(*this); tmp.Val = -(tmp.Val); return tmp;}
  167.  
  168.     Currency __fastcall operator !() const
  169.       {Currency tmp(*this); tmp.Val = !(tmp.Val); return tmp;}
  170.  
  171.     // comparisons (Currency rhs)
  172.     bool __fastcall operator ==(const Currency& rhs) const
  173.       {return Val == rhs.Val;}
  174.     bool __fastcall operator !=(const Currency& rhs) const
  175.       {return Val != rhs.Val;}
  176.     bool __fastcall operator >(const Currency& rhs) const
  177.       {return Val > rhs.Val;}
  178.     bool __fastcall operator <(const Currency& rhs) const
  179.       {return Val < rhs.Val;}
  180.     bool __fastcall operator >=(const Currency& rhs) const
  181.       {return Val >= rhs.Val;}
  182.     bool __fastcall operator <=(const Currency& rhs) const
  183.       {return Val <= rhs.Val;}
  184.  
  185.     // comparisons (int rhs)
  186.     bool __fastcall operator ==(int rhs) const
  187.       {return Val == 10000 * (__int64)rhs;}
  188.     bool __fastcall operator !=(int rhs) const
  189.       {return Val != 10000 * (__int64)rhs;}
  190.     bool __fastcall operator >(int rhs) const
  191.       {return Val > 10000 * (__int64)rhs;}
  192.     bool __fastcall operator <(int rhs) const
  193.       {return Val < 10000 * (__int64)rhs;}
  194.     bool __fastcall operator >=(int rhs) const
  195.       {return Val >= 10000 * (__int64)rhs;}
  196.     bool __fastcall operator <=(int rhs) const
  197.       {return Val <= 10000 * (__int64)rhs;}
  198.  
  199.     // comparisons (double rhs)
  200.     bool __fastcall operator ==(double rhs) const
  201.       {return Val == _roundToInt64(10000 * (long double)rhs);}
  202.     bool __fastcall operator !=(double rhs) const
  203.       {return Val != _roundToInt64(10000 * (long double)rhs);}
  204.     bool __fastcall operator >(double rhs) const
  205.       {return Val > _roundToInt64(10000 * (long double)rhs);}
  206.     bool __fastcall operator <(double rhs) const
  207.       {return Val < _roundToInt64(10000 * (long double)rhs);}
  208.     bool __fastcall operator >=(double rhs) const
  209.       {return Val >= _roundToInt64(10000 * (long double)rhs);}
  210.     bool __fastcall operator <=(double rhs) const
  211.       {return Val <= _roundToInt64(10000 * (long double)rhs);}
  212.  
  213.     __fastcall operator double() const {return ((double)Val) / 10000;}
  214.     __fastcall operator int() const    {return (int) (Val / 10000);}
  215.     __fastcall operator AnsiString() const;
  216. };
  217. //Currency friends
  218. inline Currency __fastcall operator +(int lhs, const Currency& rhs)
  219.   {Currency tmp(lhs); return tmp += rhs;}
  220. inline Currency __fastcall operator -(int lhs, const Currency& rhs)
  221.   {Currency tmp(lhs); return tmp -= rhs;}
  222. inline Currency __fastcall operator *(int lhs, const Currency& rhs)
  223.   {Currency tmp(lhs); return tmp *= rhs;}
  224. inline Currency __fastcall operator /(int lhs, const Currency& rhs)
  225.   {Currency tmp(lhs); return tmp /= rhs;}
  226. inline Currency __fastcall operator +(double lhs, const Currency& rhs)
  227.   {Currency tmp(lhs); return tmp += rhs;}
  228. inline Currency __fastcall operator -(double lhs, const Currency& rhs)
  229.   {Currency tmp(lhs); return tmp -= rhs;}
  230. inline Currency __fastcall operator *(double lhs, const Currency& rhs)
  231.   {Currency tmp(lhs); return tmp *= rhs;}
  232. inline Currency __fastcall operator /(double lhs, const Currency& rhs)
  233.   {Currency tmp(lhs); return tmp /= rhs;}
  234. //---------------------------------------------------------------------------
  235. inline ostream& operator <<(ostream& os, const Currency& arg)
  236.     {os << AnsiString(arg); return os;}
  237. inline istream& operator >>(istream& is, Currency& arg)
  238.     {AnsiString s; is >> s; arg = s; return is;}
  239. //---------------------------------------------------------------------------
  240. class __declspec(delphireturn) TDateTimeBase
  241. {
  242.   public:
  243.     double Val;
  244. };
  245. //---------------------------------------------------------------------------
  246. class __declspec(delphireturn) TDateTime : public TDateTimeBase
  247. {
  248.   public:
  249.     // Used by TDateTime(const AnsiString& src)
  250.     enum TDateTimeFlag {Date, Time, DateTime};
  251.  
  252.     static TDateTime __fastcall CurrentDate();
  253.     static TDateTime __fastcall CurrentTime();
  254.     static TDateTime __fastcall CurrentDateTime();
  255.     static TDateTime __fastcall FileDateToDateTime(int fileDate);
  256.  
  257.     __fastcall TDateTime()                                  {Val = 0;}
  258.     __fastcall TDateTime(const TDateTimeBase& src)          {Val = src.Val;}
  259.     __fastcall TDateTime(const TDateTime& src)              {Val = src.Val;}
  260.     __fastcall TDateTime(const double src)                  {Val = src;}
  261.     __fastcall TDateTime(const int src)                     {Val = src;}
  262.     __fastcall TDateTime(const AnsiString& src, TDateTimeFlag flag = DateTime);
  263.     __fastcall TDateTime(unsigned short year, unsigned short month,
  264.                          unsigned short day);
  265.     __fastcall TDateTime(unsigned short hour, unsigned short min,
  266.                          unsigned short sec, unsigned short msec);
  267.  
  268.     TDateTime& __fastcall operator =(const TDateTimeBase& rhs)
  269.       {Val = rhs.Val;return *this;}
  270.     TDateTime& __fastcall operator =(const TDateTime& rhs)
  271.       {Val = rhs.Val;  return *this;}
  272.     TDateTime& __fastcall operator =(const double rhs)
  273.       {Val = rhs; return *this;}
  274.     TDateTime& __fastcall operator =(const int rhs)
  275.       {Val = rhs; return *this;}
  276.  
  277.     TDateTime& __fastcall operator +=(const TDateTimeBase& rhs)
  278.       {Val+=rhs.Val;return *this;}
  279.     TDateTime& __fastcall operator +=(const TDateTime& rhs)
  280.       {Val += rhs.Val; return *this;}
  281.     TDateTime& __fastcall operator +=(const double rhs)
  282.       {Val += rhs; return *this;}
  283.     TDateTime& __fastcall operator +=(const int rhs)
  284.       {Val += rhs; return *this;}
  285.  
  286.     TDateTime& __fastcall operator -=(const TDateTimeBase& rhs)
  287.       {Val-=rhs.Val;return *this;}
  288.     TDateTime& __fastcall operator -=(const TDateTime& rhs)
  289.       {Val -= rhs.Val; return *this;}
  290.     TDateTime& __fastcall operator -=(const double rhs)
  291.       {Val -= rhs; return *this;}
  292.     TDateTime& __fastcall operator -=(const int rhs)
  293.       {Val -= rhs; return *this;}
  294.  
  295.     TDateTime& operator ++() {Val++; return *this;}
  296.     TDateTime operator ++(int) {TDateTime tmp(*this); Val++; return tmp;}
  297.     TDateTime& operator --() {Val--; return *this;}
  298.     TDateTime operator --(int) {TDateTime tmp(*this); Val--; return tmp;}
  299.  
  300.     TDateTime __fastcall operator +(const TDateTimeBase& rhs) const
  301.       {return Val+rhs.Val;}
  302.     TDateTime __fastcall operator +(const TDateTime& rhs) const
  303.       {return Val+rhs.Val;}
  304.     TDateTime __fastcall operator +(const double rhs) const {return Val+rhs;}
  305.     TDateTime __fastcall operator +(const int rhs) const {return Val+rhs;}
  306.  
  307.     TDateTime __fastcall operator -(const TDateTimeBase& rhs) const
  308.       {return Val-rhs.Val;}
  309.     TDateTime __fastcall operator -(const TDateTime& rhs) const
  310.       {return Val-rhs.Val;}
  311.     TDateTime __fastcall operator -(const double rhs) const {return Val-rhs;}
  312.     TDateTime __fastcall operator -(const int rhs) const {return Val-rhs;}
  313.  
  314.     // comparisons
  315.     bool __fastcall operator ==(const TDateTime& rhs) const
  316.       {return Val == rhs.Val;}
  317.     bool __fastcall operator !=(const TDateTime& rhs) const
  318.       {return Val != rhs.Val;}
  319.     bool __fastcall operator >(const TDateTime& rhs) const
  320.       {return Val > rhs.Val;}
  321.     bool __fastcall operator <(const TDateTime& rhs) const
  322.       {return Val < rhs.Val;}
  323.     bool __fastcall operator >=(const TDateTime& rhs) const
  324.       {return Val >= rhs.Val;}
  325.     bool __fastcall operator <=(const TDateTime& rhs) const
  326.       {return Val <= rhs.Val;}
  327.  
  328.     __fastcall operator AnsiString() const;//<Date||Time||DateTime>String(smart)
  329.     AnsiString __fastcall FormatString(const AnsiString& format);
  330.     AnsiString __fastcall DateString() const;
  331.     AnsiString __fastcall TimeString() const;
  332.     AnsiString __fastcall DateTimeString() const;
  333.     __fastcall operator double() const {return Val;}
  334.     __fastcall operator int() const    {return (int)Val;}
  335.  
  336.     int __fastcall DayOfWeek() const;
  337.     int __fastcall FileDate() const;
  338.     void __fastcall DecodeDate(unsigned short* year, unsigned short*
  339.       month, unsigned short* day) const;
  340.     void __fastcall DecodeTime(unsigned short* hour, unsigned short*
  341.       min, unsigned short* sec, unsigned short* msec) const;
  342. };
  343. //---------------------------------------------------------------------------
  344. inline ostream& operator <<(ostream& os, const TDateTime& arg)
  345.     {os << AnsiString(arg); return os;}
  346. inline istream& operator >>(istream& is, TDateTime& arg)
  347.     {AnsiString s; is >> s; arg = s; return is;}
  348. //---------------------------------------------------------------------------
  349. //class TObject {};
  350. typedef SmallString<255> ShortString;
  351. class   __declspec(delphiclass) TObject
  352. {
  353.   public:
  354.     __fastcall TObject() {}
  355.     __fastcall Free();
  356.     TClass __fastcall ClassType();
  357.     void __fastcall CleanupInstance();
  358.     void * __fastcall FieldAddress(const ShortString &Name);
  359.  
  360.     static TObject * __fastcall InitInstance(TClass cls, void *instance);
  361.     static ShortString __fastcall ClassName(TClass cls);
  362.     static bool __fastcall ClassNameIs(TClass cls, const AnsiString string);
  363.     static TClass __fastcall ClassParent(TClass cls);
  364.     static void * __fastcall ClassInfo(TClass cls);
  365.     static long __fastcall InstanceSize(TClass cls);
  366.     static bool __fastcall InheritsFrom(TClass cls, TClass aClass);
  367.     static void * __fastcall MethodAddress(TClass cls, const ShortString &Name);
  368.     static ShortString __fastcall MethodName(TClass cls, void *Address);
  369.  
  370.     ShortString __fastcall ClassName()
  371.     {
  372.       return ClassName(ClassType());
  373.     }
  374.  
  375.     bool __fastcall ClassNameIs(const AnsiString string)
  376.     {
  377.       return ClassNameIs(ClassType(), string);
  378.     }
  379.  
  380.     TClass __fastcall ClassParent()
  381.     {
  382.       return ClassParent(ClassType());
  383.     }
  384.  
  385.     void * __fastcall ClassInfo()
  386.     {
  387.       return ClassInfo(ClassType());
  388.     }
  389.  
  390.     long __fastcall InstanceSize()
  391.     {
  392.       return InstanceSize(ClassType());
  393.     }
  394.  
  395.     bool __fastcall InheritsFrom(TClass aClass)
  396.     {
  397.       return InheritsFrom(ClassType(), aClass);
  398.     }
  399.  
  400.     void * __fastcall MethodAddress(const ShortString &Name)
  401.     {
  402.       return MethodAddress(ClassType(), Name);
  403.     }
  404.  
  405.     ShortString __fastcall MethodName(void *Address)
  406.     {
  407.       return MethodName(ClassType(), Address);
  408.     }
  409.  
  410.     virtual void __fastcall AfterConstruction();
  411.     virtual void __fastcall BeforeDestruction();
  412.     virtual void __fastcall Dispatch(void *Message);
  413.     virtual void __fastcall DefaultHandler(void* Message);
  414.  
  415.   private:
  416.     virtual TObject* __fastcall NewInstance(TClass cls);
  417.  
  418.   public:
  419.     virtual void __fastcall FreeInstance();
  420.     virtual __fastcall ~TObject() {}
  421. };
  422.  
  423. class   TMetaClass
  424. {
  425.   public:
  426.     TObject * __fastcall InitInstance(void *instance)
  427.     {
  428.       TObject::InitInstance(this, instance);
  429.     }
  430.  
  431.     ShortString __fastcall ClassName()
  432.     {
  433.       return TObject::ClassName(this);
  434.     }
  435.  
  436.     bool __fastcall ClassNameIs(const AnsiString &string)
  437.     {
  438.       return    TObject::ClassNameIs(this,string);
  439.     }
  440.  
  441.     TClass __fastcall ClassParent()
  442.     {
  443.       return TObject::ClassParent(this);
  444.     }
  445.  
  446.     void * __fastcall ClassInfo()
  447.     {
  448.       return TObject::ClassInfo(this);
  449.     }
  450.  
  451.     long __fastcall InstanceSize()
  452.     {
  453.       return TObject::InstanceSize(this);
  454.     }
  455.  
  456.     bool __fastcall InheritsFrom(TClass aClass)
  457.     {
  458.       return TObject::InheritsFrom(this, aClass);
  459.     }
  460.  
  461.     void * __fastcall MethodAddress(const ShortString &Name)
  462.     {
  463.       return TObject::MethodAddress(this, Name);
  464.     }
  465.  
  466.     ShortString __fastcall MethodName(void *Address)
  467.     {
  468.       return TObject::MethodName(this,Address);
  469.     }
  470. };
  471.  
  472. #define BEGIN_MESSAGE_MAP       virtual void __fastcall Dispatch(void *Message) \
  473.                                 {                                               \
  474.                                         switch  (((PMessage)Message)->Msg)      \
  475.                                         {
  476. #define MESSAGE_HANDLER(msg,type,meth)                                          \
  477.                                         case    msg:                            \
  478.                                                 meth(*((type *)Message));       \
  479.                                                 break;
  480. #define END_MESSAGE_MAP(base)           default:                                \
  481.                                                                 base::Dispatch(Message);        \
  482.                                                         break;                          \
  483.                                         }                                                                                       \
  484.                                 }
  485. //---------------------------------------------------------------------------
  486. typedef DummySmallString<255> DummyShortString;
  487. typedef bool Boolean;                   //
  488. typedef int Integer;                    // -2147483648..2147484647
  489. typedef char Char;                       // 0..255
  490. typedef wchar_t WideChar;               //
  491. typedef signed char Shortint;           // -128..127
  492. typedef short Smallint;                 // -32768..32767
  493. typedef unsigned char Byte;             // 0..255
  494. typedef unsigned short Word;            // 0..65535
  495. typedef unsigned long DWord;            // 0..4294967295
  496. typedef void* Pointer;                  //
  497. typedef Char AnsiChar;                  //
  498. typedef signed long Longint;            // -2147483648..2147484647
  499. typedef unsigned int Cardinal;            // 0..2147484647
  500. typedef long double Extended;           // 10 byte real
  501. typedef float Single;                   // 4 byte real
  502. typedef double Double;                  // 8 byte real
  503. typedef Char* const Openstring;         // D16 string/D32 shortstring formalparm
  504. typedef void* file;                     //
  505. typedef void* Text;                     //
  506. typedef Text TextFile;                  //
  507. typedef Char* PChar;                    //
  508. typedef PChar PAnsiChar;                //
  509. typedef WideChar* PWideChar;            //
  510. typedef Byte ByteBool;                  //
  511. typedef Word WordBool;                  //
  512. typedef Cardinal LongBool;              //
  513. typedef AnsiString String;              //
  514. typedef ShortString* PShortString;      //
  515. typedef AnsiString* PAnsiString;        //
  516. typedef PAnsiString PString;            //
  517. typedef Extended* PExtended;            //
  518. typedef Currency* PCurrency;            //
  519. typedef Variant* PVariant;              //
  520. typedef __int64 LONG64;                 //
  521.  
  522. // Comp
  523. // Range: -263+1 .. 263-1, Significant digits: 19-20, Size: 8
  524. // The Comp (computational) type holds only integral values within -263+1
  525. // to 263-1, which is approximately -9.2 * 1018 to 9.2 * 1018.
  526. //
  527. struct Comp {
  528.     Comp();
  529.     Comp(double d);
  530.     Comp(Currency d);
  531.     operator =(double d);
  532.     operator =(Currency d);
  533.     operator double();
  534.     operator Currency();
  535.   private:
  536.     char __data[8];
  537. };
  538.  
  539. extern double   __cdecl CompToDouble(Comp acomp);
  540. extern void     __cdecl DoubleToComp(double adouble, Comp &result);
  541. extern Currency __cdecl CompToCurrency(Comp acomp);
  542. extern void     __cdecl CurrencyToComp(Currency acurrency, Comp &result);
  543.  
  544.  
  545. inline Comp::Comp() {
  546.   DoubleToComp(0.0, *this);
  547. }
  548.  
  549. inline Comp::Comp(double d) {
  550.   *this = d;
  551. }
  552.  
  553. inline Comp::operator = (double d) {
  554.   DoubleToComp(d, *this);
  555. }
  556.  
  557. inline Comp::operator double() {
  558.   return CompToDouble(*this);
  559. }
  560.  
  561. inline Comp::Comp(Currency d) {
  562.   *this = d;
  563. }
  564.  
  565. inline Comp::operator = (Currency d) {
  566.   CurrencyToComp(d, *this);
  567. }
  568.  
  569. inline Comp::operator Currency() {
  570.   return CompToCurrency(*this);
  571. }
  572.  
  573. //---------------------------------------------------------------------------
  574. // Set template implements Delphi sets
  575. //---------------------------------------------------------------------------
  576. template<class T, unsigned char minEl, unsigned char maxEl>
  577. class __declspec(delphireturn) Set
  578. {
  579.   friend ostream& operator <<(ostream& os, const Set& arg)
  580.   {
  581.     for (int i = minEl; i <= maxEl; i++)
  582.       if (arg.Contains(static_cast<T>(i)))
  583.         os << '1';
  584.       else
  585.         os << '0';
  586.     return os;
  587.   }
  588.  
  589.   friend istream& operator >>(istream& is, Set& arg)
  590.   {
  591.     unsigned char el;
  592.     for (int i = minEl; i <= maxEl; i++)
  593.     {
  594.       is >> el;
  595.       if (el == '1')
  596.         arg << static_cast<T>(i);
  597.     }
  598.     return is;
  599.   }
  600.   public:
  601.     __fastcall Set() {memset(Data, 0, sizeof (Data));}
  602.     __fastcall Set(const Set& src)
  603.     {
  604.       for (int i = 0; i < sizeof (Data); i++)
  605.         Data[i] = src.Data[i];
  606.     }
  607.  
  608.     Set& __fastcall operator =(const Set& rhs)
  609.     {
  610.       if (this != &rhs)
  611.       {
  612.         for (int i = 0; i < sizeof (Data); i++)
  613.           Data[i] = rhs.Data[i];
  614.       }
  615.       return *this;
  616.     }
  617.     Set& __fastcall operator +=(const Set& rhs) //Union
  618.     {
  619.       for (int i = 0; i < sizeof (Data); i++)
  620.         Data[i] |= rhs.Data[i];
  621.       return *this;
  622.     }
  623.     Set& __fastcall operator -=(const Set& rhs) //Difference
  624.     {
  625.       for (int i = 0; i < sizeof (Data); i++)
  626.         Data[i] ^= (Data[i] & rhs.Data[i]);
  627.       return *this;
  628.     }
  629.     Set& __fastcall operator *=(const Set& rhs) //Intersection
  630.     {
  631.       for (int i = 0; i < sizeof (Data); i++)
  632.         Data[i] &= rhs.Data[i];
  633.       return *this;
  634.     }
  635.  
  636.     Set __fastcall operator +(const Set& rhs) const //Union
  637.     {
  638.       Set<T, minEl, maxEl> s;
  639.       for (int i = 0; i < sizeof (Data); i++)
  640.         s.Data[i] = Data[i] | rhs.Data[i];
  641.       return s;
  642.     }
  643.     Set __fastcall operator -(const Set& rhs) const //Difference
  644.     {
  645.       Set<T, minEl, maxEl> s;
  646.       for (int i = 0; i < sizeof (Data); i++)
  647.         s.Data[i] = Data[i] ^ (Data[i] & rhs.Data[i]);
  648.       return s;
  649.     }
  650.     Set __fastcall operator *(const Set& rhs) const //Intersection
  651.     {
  652.       Set<T, minEl, maxEl> s;
  653.       for (int i = 0; i < sizeof (Data); i++)
  654.         s.Data[i] = Data[i] & rhs.Data[i];
  655.       return s;
  656.     }
  657.  
  658.     Set& __fastcall operator <<(const T el) //Add element
  659.     {
  660. #pragma option -w-ccc
  661.       if (el >= minEl && el <= maxEl)
  662. #pragma option -w+ccc
  663.         Data[(int)(el/8) - (int)(minEl/8)] |=
  664.           (unsigned char)((unsigned short)1 << (el % 8));
  665.       return *this;
  666.     }
  667.     Set& __fastcall operator >>(const T el) //Remove element
  668.     {
  669. #pragma option -w-ccc
  670.       if (el >= minEl && el <= maxEl)
  671. #pragma option -w+ccc
  672.         Data[(int)(el/8) - (int)(minEl/8)] &=
  673.           (unsigned char)~((unsigned short)1 << (el % 8));
  674.       return *this;
  675.     }
  676.  
  677.     bool __fastcall Contains(const T el) const
  678.     {
  679. #pragma option -w-ccc
  680.       return (el >= minEl && el <= maxEl)?
  681. #pragma option -w+ccc
  682.         (Data[(int)(el/8) - (int)(minEl/8)] &
  683.           (unsigned char)((unsigned short)1 << (el % 8))): false;
  684.     }
  685.  
  686.     Set& __fastcall Clear()
  687.     {
  688.       for (int i = 0; i < sizeof (Data); i++)
  689.         Data[i] = 0;
  690.       return *this;
  691.     }
  692.  
  693.     bool __fastcall operator ==(const Set& rhs) const
  694.     {
  695.       for (int i = 0; i < sizeof (Data); i++)
  696.         if (Data[i] != rhs.Data[i])
  697.           // Not so fast, if first or last byte, make sure that
  698.           // the compare does not include unused bits (mask them)
  699.           if (i == 0)
  700.           {
  701.             if(((0xFF >> (8-(minEl%8))) ^ Data[i]) !=
  702.                ((0xFF >> (8-(minEl%8))) ^ rhs.Data[i]))
  703.               return false;
  704.           }
  705.           else if (sizeof (Data) > 1 && i == sizeof (Data) - 1)
  706.           {
  707.             if(((0xFF << (1+(maxEl%8))) ^ Data[i]) !=
  708.                ((0xFF << (1+(maxEl%8))) ^ rhs.Data[i]))
  709.               return false;
  710.           }
  711.           else
  712.             return false;
  713.       return true;
  714.     }
  715.     bool __fastcall operator !=(const Set& rhs) const {return !operator==(rhs);}
  716.   protected:
  717.     unsigned char Data[((((int)(maxEl/8))-((int)(minEl/8))+1) != 3)?
  718.       (((int)(maxEl/8))-((int)(minEl/8))+1): 4];
  719. };
  720. //---------------------------------------------------------------------------
  721. template<class T, unsigned char minEl, unsigned char maxEl> class DummySet
  722. {
  723.   protected:
  724.     unsigned char Data[((((int)(maxEl/8))-((int)(minEl/8))+1) != 3)?
  725.       (((int)(maxEl/8))-((int)(minEl/8))+1): 4];
  726. };
  727. //---------------------------------------------------------------------------
  728.  
  729. class TVarArrayBound {
  730.   public:
  731.     Integer ElementCount;
  732.     Integer LowBound;
  733. };
  734.  
  735. typedef class TVarArray *PVarArray;
  736.  
  737. class TVarArray {
  738.   public:
  739.     Word DimCount;
  740.     Word Flags;
  741.     Integer ElementSize;
  742.     Integer LockCount;
  743.     Pointer Data;
  744.     TVarArrayBound Bounds[256] /* [0..255] */;
  745. };
  746. //---------------------------------------------------------------------------
  747. #define varEmpty (Byte)(0)
  748. #define varNull (Byte)(1)
  749. #define varSmallint (Byte)(2)
  750. #define varInteger (Byte)(3)
  751. #define varSingle (Byte)(4)
  752. #define varDouble (Byte)(5)
  753. #define varCurrency (Byte)(6)
  754. #define varDate (Byte)(7)
  755. #define varOleStr (Byte)(8)
  756. #define varDispatch (Byte)(9)
  757. #define varError (Byte)(10)
  758. #define varBoolean (Byte)(11)
  759. #define varVariant (Byte)(12)
  760. #define varUnknown (Byte)(13)
  761. #define varByte (Byte)(17)
  762. #define varString (Word)(256)
  763. #define varTypeMask (Word)(4095)
  764. #define varArray (Word)(8192)
  765. #define varByRef (Word)(16384)
  766. #define varStrArg (Byte)(72)
  767. //---------------------------------------------------------------------------
  768. #define vtInteger (Byte)(0)
  769. #define vtBoolean (Byte)(1)
  770. #define vtChar (Byte)(2)
  771. #define vtExtended (Byte)(3)
  772. #define vtString (Byte)(4)
  773. #define vtPointer (Byte)(5)
  774. #define vtPChar (Byte)(6)
  775. #define vtObject (Byte)(7)
  776. #define vtClass (Byte)(8)
  777. #define vtWideChar (Byte)(9)
  778. #define vtPWideChar (Byte)(10)
  779. #define vtAnsiString (Byte)(11)
  780. #define vtCurrency (Byte)(12)
  781. #define vtVariant (Byte)(13)
  782. //---------------------------------------------------------------------------
  783. typedef class TVarData *PVarData;
  784.  
  785. class TVarData {
  786.   public: //!JK protected:
  787.     Word VType;
  788.     Word Reserved1;
  789.     Word Reserved2;
  790.     Word Reserved3;
  791.     union {
  792.       Smallint VSmallint;
  793.       Integer VInteger;
  794.       Single VSingle;
  795.       Double VDouble;
  796.       CurrencyBase VCurrency;
  797.       TDateTimeBase VDate;
  798.       PWideChar VOleStr;
  799.       Ole2::IDispatch* VDispatch;
  800.       Integer VError;
  801.       WordBool VBoolean;
  802.       Ole2::IUnknown* VUnknown;
  803.       Byte VByte;
  804.       Pointer VString;
  805.       PVarArray VArray;
  806.       Pointer VPointer;
  807.     };
  808. };
  809. //-----------------------------------------------------------------------
  810. class TVarRec;
  811. typedef TVarRec* PVarRec;
  812. class TVarRec
  813. {
  814.   public:
  815.     union
  816.     {
  817.       Integer      VInteger;
  818.       Boolean      VBoolean;
  819.       Char         VChar;
  820.       PExtended    VExtended;
  821.       PShortString VString;
  822.       Pointer      VPointer;
  823.       PChar        VPChar;
  824.       TObject*     VObject;
  825.       TClass       VClass;
  826.       WideChar     VWideChar;
  827.       PWideChar    VPWideChar;
  828.       Pointer      VAnsiString;
  829.       PCurrency    VCurrency;
  830.       PVariant     VVariant;
  831.     };
  832.     union
  833.     {
  834.       Byte VType;
  835.       long ForceAlignment; //!JK should be removed, if alignment set to 4
  836.                            //!JK we don't need this
  837.     };
  838.  
  839.     //---- constructors ----
  840.     __fastcall TVarRec(): VType(vtInteger), VInteger(0) {} //default int 0
  841.     __fastcall TVarRec(Integer src): VType(vtInteger), VInteger(src) {}
  842.     __fastcall TVarRec(Boolean src): VType(vtBoolean), VBoolean(src) {}
  843.     __fastcall TVarRec(char src): VType(vtChar), VChar(src) {}
  844.     __fastcall TVarRec(const Extended& src): VType(vtExtended),
  845.       VExtended(const_cast<Extended*>(&src)) {}
  846.     __fastcall TVarRec(const ShortString& src): VType(vtString),
  847.       VString(const_cast<PShortString>(&src)) {}
  848.     __fastcall TVarRec(const Pointer src): VType(vtPointer), VPointer(src) {}
  849.     __fastcall TVarRec(const PChar src): VType(vtPChar), VPChar(src) {}
  850.     __fastcall TVarRec(const char* src): VType(vtPChar),
  851.       VPChar(reinterpret_cast<PChar>(const_cast<char*>(src))) {}
  852.     __fastcall TVarRec(const TObject& src): VType(vtObject),
  853.       VObject(const_cast<TObject*>(&src)) {}
  854.     __fastcall TVarRec(const TClass src): VType(vtClass), VClass(src) {}
  855.     __fastcall TVarRec(WideChar src): VType(vtWideChar), VWideChar(src) {}
  856.     __fastcall TVarRec(const PWideChar src): VType(vtPWideChar),
  857.       VPWideChar(src) {}
  858.     __fastcall TVarRec(const AnsiString src): VType(vtAnsiString),
  859.       VAnsiString(src.c_str()) {}
  860.     __fastcall TVarRec(const Currency& src): VType(vtCurrency),
  861.       VCurrency(const_cast<PCurrency>(&src)) {}
  862.     __fastcall TVarRec(const Variant& src): VType(vtVariant),
  863.       VVariant(const_cast<PVariant>(&src)) {}
  864.  
  865.     //---- assignments ----
  866.     __fastcall operator =(Integer src) {VType = vtInteger; VInteger = src;}
  867.     __fastcall operator =(Boolean src) {VType = vtBoolean; VBoolean = src;}
  868.     __fastcall operator =(char src) {VType = vtChar; VChar = src;}
  869.     __fastcall operator =(const Extended& src) {VType = vtExtended;
  870.       VExtended = const_cast<PExtended>(&src);}
  871.     __fastcall operator =(const ShortString& src) {VType = vtString;
  872.       VString = const_cast<PShortString>(&src);}
  873.     __fastcall operator =(const Pointer src) {VType = vtPointer;VPointer = src;}
  874.     __fastcall operator =(const PChar src) {VType = vtPChar; VPChar = src;}
  875.     __fastcall operator =(const char* src) {VType = vtPChar;
  876.       VPChar = reinterpret_cast<PChar>(const_cast<char*>(src));}
  877.     __fastcall operator =(const TObject& src) {VType = vtObject;
  878.       VObject = const_cast<TObject*>(&src);}
  879.     __fastcall operator =(const TClass src) {VType = vtClass; VClass = src;}
  880.     __fastcall operator =(WideChar src) {VType = vtWideChar; VWideChar = src;}
  881.     __fastcall operator =(const PWideChar src) {VType = vtPWideChar;
  882.       VPWideChar = src;}
  883.     __fastcall operator =(const AnsiString src) {VType = vtAnsiString;
  884.       VAnsiString = src.c_str();}
  885.     __fastcall operator =(const Currency& src) {VType = vtCurrency;
  886.       VCurrency = const_cast<PCurrency>(&src);}
  887.     __fastcall operator =(const Variant& src) {VType = vtVariant;
  888.       VVariant = const_cast<PVariant>(&src);}
  889. };
  890. //-----------------------------------------------------------------------
  891. template<class T> class OpenArray
  892. {
  893.   public:
  894.     __fastcall OpenArray(T arg0)
  895.     {
  896.       Array = new T[Count = 1];
  897.       Array[0] = arg0;
  898.     }
  899.     __fastcall OpenArray(T arg0, T arg1)
  900.     {
  901.       Array = new T[Count = 2];
  902.       Array[0] = arg0;
  903.       Array[1] = arg1;
  904.     }
  905.     __fastcall OpenArray(T arg0, T arg1, T arg2)
  906.     {
  907.       Array = new T[Count = 3];
  908.       Array[0] = arg0;
  909.       Array[1] = arg1;
  910.       Array[2] = arg2;
  911.     }
  912.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3)
  913.     {
  914.       Array = new T[Count = 4];
  915.       Array[0] = arg0;
  916.       Array[1] = arg1;
  917.       Array[2] = arg2;
  918.       Array[3] = arg3;
  919.     }
  920.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4)
  921.     {
  922.       Array = new T[Count = 5];
  923.       Array[0] = arg0;
  924.       Array[1] = arg1;
  925.       Array[2] = arg2;
  926.       Array[3] = arg3;
  927.       Array[4] = arg4;
  928.     }
  929.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5)
  930.     {
  931.       Array = new T[Count = 6];
  932.       Array[0] = arg0;
  933.       Array[1] = arg1;
  934.       Array[2] = arg2;
  935.       Array[3] = arg3;
  936.       Array[4] = arg4;
  937.       Array[5] = arg5;
  938.     }
  939.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6)
  940.     {
  941.       Array = new T[Count = 7];
  942.       Array[0] = arg0;
  943.       Array[1] = arg1;
  944.       Array[2] = arg2;
  945.       Array[3] = arg3;
  946.       Array[4] = arg4;
  947.       Array[5] = arg5;
  948.       Array[6] = arg6;
  949.     }
  950.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  951.                          T arg7)
  952.     {
  953.       Array = new T[Count = 8];
  954.       Array[0] = arg0;
  955.       Array[1] = arg1;
  956.       Array[2] = arg2;
  957.       Array[3] = arg3;
  958.       Array[4] = arg4;
  959.       Array[5] = arg5;
  960.       Array[6] = arg6;
  961.       Array[7] = arg7;
  962.     }
  963.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  964.                          T arg7, T arg8)
  965.     {
  966.       Array = new T[Count = 9];
  967.       Array[0] = arg0;
  968.       Array[1] = arg1;
  969.       Array[2] = arg2;
  970.       Array[3] = arg3;
  971.       Array[4] = arg4;
  972.       Array[5] = arg5;
  973.       Array[6] = arg6;
  974.       Array[7] = arg7;
  975.       Array[8] = arg8;
  976.     }
  977.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  978.                          T arg7, T arg8, T arg9)
  979.     {
  980.       Array = new T[Count = 10];
  981.       Array[0] = arg0;
  982.       Array[1] = arg1;
  983.       Array[2] = arg2;
  984.       Array[3] = arg3;
  985.       Array[4] = arg4;
  986.       Array[5] = arg5;
  987.       Array[6] = arg6;
  988.       Array[7] = arg7;
  989.       Array[8] = arg8;
  990.       Array[9] = arg9;
  991.     }
  992.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  993.                          T arg7, T arg8, T arg9, T arg10)
  994.     {
  995.       Array = new T[Count = 11];
  996.       Array[0] = arg0;
  997.       Array[1] = arg1;
  998.       Array[2] = arg2;
  999.       Array[3] = arg3;
  1000.       Array[4] = arg4;
  1001.       Array[5] = arg5;
  1002.       Array[6] = arg6;
  1003.       Array[7] = arg7;
  1004.       Array[8] = arg8;
  1005.       Array[9] = arg9;
  1006.       Array[10] = arg10;
  1007.     }
  1008.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1009.                          T arg7, T arg8, T arg9, T arg10, T arg11)
  1010.     {
  1011.       Array = new T[Count = 12];
  1012.       Array[0] = arg0;
  1013.       Array[1] = arg1;
  1014.       Array[2] = arg2;
  1015.       Array[3] = arg3;
  1016.       Array[4] = arg4;
  1017.       Array[5] = arg5;
  1018.       Array[6] = arg6;
  1019.       Array[7] = arg7;
  1020.       Array[8] = arg8;
  1021.       Array[9] = arg9;
  1022.       Array[10] = arg10;
  1023.       Array[11] = arg11;
  1024.     }
  1025.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1026.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12)
  1027.     {
  1028.       Array = new T[Count = 13];
  1029.       Array[0] = arg0;
  1030.       Array[1] = arg1;
  1031.       Array[2] = arg2;
  1032.       Array[3] = arg3;
  1033.       Array[4] = arg4;
  1034.       Array[5] = arg5;
  1035.       Array[6] = arg6;
  1036.       Array[7] = arg7;
  1037.       Array[8] = arg8;
  1038.       Array[9] = arg9;
  1039.       Array[10] = arg10;
  1040.       Array[11] = arg11;
  1041.       Array[12] = arg12;
  1042.     }
  1043.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1044.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1045.                          T arg13)
  1046.     {
  1047.       Array = new T[Count = 14];
  1048.       Array[0] = arg0;
  1049.       Array[1] = arg1;
  1050.       Array[2] = arg2;
  1051.       Array[3] = arg3;
  1052.       Array[4] = arg4;
  1053.       Array[5] = arg5;
  1054.       Array[6] = arg6;
  1055.       Array[7] = arg7;
  1056.       Array[8] = arg8;
  1057.       Array[9] = arg9;
  1058.       Array[10] = arg10;
  1059.       Array[11] = arg11;
  1060.       Array[12] = arg12;
  1061.       Array[13] = arg13;
  1062.     }
  1063.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1064.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1065.                          T arg13, T arg14)
  1066.     {
  1067.       Array = new T[Count = 15];
  1068.       Array[0] = arg0;
  1069.       Array[1] = arg1;
  1070.       Array[2] = arg2;
  1071.       Array[3] = arg3;
  1072.       Array[4] = arg4;
  1073.       Array[5] = arg5;
  1074.       Array[6] = arg6;
  1075.       Array[7] = arg7;
  1076.       Array[8] = arg8;
  1077.       Array[9] = arg9;
  1078.       Array[10] = arg10;
  1079.       Array[11] = arg11;
  1080.       Array[12] = arg12;
  1081.       Array[13] = arg13;
  1082.       Array[14] = arg14;
  1083.     }
  1084.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1085.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1086.                          T arg13, T arg14, T arg15)
  1087.     {
  1088.       Array = new T[Count = 16];
  1089.       Array[0] = arg0;
  1090.       Array[1] = arg1;
  1091.       Array[2] = arg2;
  1092.       Array[3] = arg3;
  1093.       Array[4] = arg4;
  1094.       Array[5] = arg5;
  1095.       Array[6] = arg6;
  1096.       Array[7] = arg7;
  1097.       Array[8] = arg8;
  1098.       Array[9] = arg9;
  1099.       Array[10] = arg10;
  1100.       Array[11] = arg11;
  1101.       Array[12] = arg12;
  1102.       Array[13] = arg13;
  1103.       Array[14] = arg14;
  1104.       Array[15] = arg15;
  1105.     }
  1106.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1107.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1108.                          T arg13, T arg14, T arg15, T arg16)
  1109.     {
  1110.       Array = new T[Count = 17];
  1111.       Array[0] = arg0;
  1112.       Array[1] = arg1;
  1113.       Array[2] = arg2;
  1114.       Array[3] = arg3;
  1115.       Array[4] = arg4;
  1116.       Array[5] = arg5;
  1117.       Array[6] = arg6;
  1118.       Array[7] = arg7;
  1119.       Array[8] = arg8;
  1120.       Array[9] = arg9;
  1121.       Array[10] = arg10;
  1122.       Array[11] = arg11;
  1123.       Array[12] = arg12;
  1124.       Array[13] = arg13;
  1125.       Array[14] = arg14;
  1126.       Array[15] = arg15;
  1127.       Array[16] = arg16;
  1128.     }
  1129.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1130.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1131.                          T arg13, T arg14, T arg15, T arg16, T arg17)
  1132.     {
  1133.       Array = new T[Count = 18];
  1134.       Array[0] = arg0;
  1135.       Array[1] = arg1;
  1136.       Array[2] = arg2;
  1137.       Array[3] = arg3;
  1138.       Array[4] = arg4;
  1139.       Array[5] = arg5;
  1140.       Array[6] = arg6;
  1141.       Array[7] = arg7;
  1142.       Array[8] = arg8;
  1143.       Array[9] = arg9;
  1144.       Array[10] = arg10;
  1145.       Array[11] = arg11;
  1146.       Array[12] = arg12;
  1147.       Array[13] = arg13;
  1148.       Array[14] = arg14;
  1149.       Array[15] = arg15;
  1150.       Array[16] = arg16;
  1151.       Array[17] = arg17;
  1152.     }
  1153.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1154.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1155.                          T arg13, T arg14, T arg15, T arg16, T arg17, T arg18)
  1156.     {
  1157.       Array = new T[Count = 19];
  1158.       Array[0] = arg0;
  1159.       Array[1] = arg1;
  1160.       Array[2] = arg2;
  1161.       Array[3] = arg3;
  1162.       Array[4] = arg4;
  1163.       Array[5] = arg5;
  1164.       Array[6] = arg6;
  1165.       Array[7] = arg7;
  1166.       Array[8] = arg8;
  1167.       Array[9] = arg9;
  1168.       Array[10] = arg10;
  1169.       Array[11] = arg11;
  1170.       Array[12] = arg12;
  1171.       Array[13] = arg13;
  1172.       Array[14] = arg14;
  1173.       Array[15] = arg15;
  1174.       Array[16] = arg16;
  1175.       Array[17] = arg17;
  1176.       Array[18] = arg18;
  1177.     }
  1178.     __fastcall OpenArray(const OpenArray& src)
  1179.     {
  1180.       Array = new T[Count = src.Count];
  1181.       for (int i = 0; i < Count; i++)
  1182.         Array[i] = src.Array[i];
  1183.     }
  1184.     __fastcall ~OpenArray() {delete [] Array;}
  1185.     OpenArray& __fastcall operator =(const OpenArray& rhs);
  1186.     __fastcall operator T*() {return Array;}
  1187.     int __fastcall GetHigh() {return Count - 1;}
  1188.  
  1189.   private:
  1190.     T* Array;
  1191.     long Count;
  1192. };
  1193. //-----------------------------------------------------------------------
  1194. template<class T>
  1195. OpenArray& __fastcall
  1196. OpenArray<T>::operator =(const OpenArray& rhs)
  1197. {
  1198.   if (this != &rhs)
  1199.   {
  1200.     Array = new T[Count = rhs.Count];
  1201.     for (int i = 0; i < Count; i++)
  1202.       Array[i] = rhs.Array[i];
  1203.   }
  1204.   return *this;
  1205. }
  1206. //-----------------------------------------------------------------------
  1207. // Used with OPENARRAY macro (immediately following this template declaration)
  1208. template<class T> class OpenArrayCount
  1209. {
  1210.   public:
  1211.     __fastcall OpenArrayCount(T arg0): Count(1) {}
  1212.     __fastcall OpenArrayCount(T arg0,T arg1): Count(2) {}
  1213.     __fastcall OpenArrayCount(T arg0,T arg1,T arg2): Count(3) {}
  1214.     __fastcall OpenArrayCount(T arg0,T arg1,T arg2,T arg3): Count(4) {}
  1215.     __fastcall OpenArrayCount(T arg0,T arg1,T arg2,T arg3,T arg4): Count(5) {}
  1216.     __fastcall OpenArrayCount(T arg0,T arg1,T arg2,T arg3,T arg4, T arg5)
  1217.       : Count(6) {}
  1218.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1219.       T arg6): Count(7) {}
  1220.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1221.       T arg6, T arg7): Count(8) {}
  1222.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1223.       T arg6, T arg7, T arg8): Count(9) {}
  1224.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1225.       T arg6, T arg7, T arg8, T arg9): Count(10) {}
  1226.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1227.       T arg6, T arg7, T arg8, T arg9, T arg10): Count(11) {}
  1228.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1229.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11): Count(12) {}
  1230.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1231.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12): Count(13) {}
  1232.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1233.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13)
  1234.       : Count(14) {}
  1235.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1236.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1237.       T arg14): Count(15) {}
  1238.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1239.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1240.       T arg14, T arg15): Count(16) {}
  1241.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1242.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1243.       T arg14, T arg15, T arg16): Count(17) {}
  1244.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1245.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1246.       T arg14, T arg15, T arg16, T arg17): Count(18) {}
  1247.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1248.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1249.       T arg14, T arg15, T arg16, T arg17, T arg18): Count(19) {}
  1250.     int __fastcall GetHigh() {return Count - 1;}
  1251.   private:
  1252.     long Count;
  1253. };
  1254. //-----------------------------------------------------------------------
  1255. // OPENARRAY: construct an OpenArray<type> on the fly
  1256. //
  1257. #define OPENARRAY(type, values) \
  1258.         OpenArray<type>values, OpenArrayCount<type>values.GetHigh()
  1259. //-----------------------------------------------------------------------
  1260. // ARRAYOFCONST: construct an OpenArray<TVarRec> on the fly
  1261. //
  1262. #define ARRAYOFCONST(values) \
  1263.         OpenArray<TVarRec>values, OpenArrayCount<TVarRec>values.GetHigh()
  1264. //---------------------------------------------------------------------
  1265. #define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
  1266. //-----------------------------------------------------------------------
  1267. // EXISTINGARRAY: pass an existing array where an open array is expected
  1268. #define EXISTINGARRAY(a) (a), ((sizeof(a)/sizeof(a[0]))-1)
  1269. //-----------------------------------------------------------------------
  1270. // SLICE: pass part of an existing array where an open array is expected
  1271. #define SLICE(a, n) (a), (n - 1)
  1272. //-----------------------------------------------------------------------
  1273. //forward declare AutoCmd - used by Variant's Exec function
  1274. class AutoCmd;
  1275. //-----------------------------------------------------------------------
  1276.  
  1277. // Required for windows.hpp
  1278. //
  1279. #if !defined(LOCALE_SYSTEM_DEFAULT)
  1280. // !JW  We don't want to undefine this if it came from winnt.h!
  1281. # define NOW_UNDEF_LOCALE_SYSTEM_DEFAULT TRUE
  1282. # if !defined(BCB_NAMESPACES)
  1283. #   define LOCALE_SYSTEM_DEFAULT Smallint(2048)
  1284. # else
  1285. #   define LOCALE_SYSTEM_DEFAULT System::Smallint(2048)
  1286. # endif
  1287. #endif
  1288.  
  1289. //-----------------------------------------------------------------------
  1290. class __declspec(delphireturn) Variant: public TVarData
  1291. {
  1292.   friend class AutoCmd;
  1293.   friend ostream& operator <<(ostream& os, const Variant& arg);
  1294.   public:
  1295.     static Variant __fastcall CreateObject(const String& ProgID);
  1296.     static Variant __fastcall GetActiveObject(const String& ProgID);
  1297.     //ctors
  1298.     __fastcall Variant();
  1299.     __fastcall Variant(const Variant& src);
  1300.  
  1301.     //By value constructors
  1302.     __fastcall Variant(const short src);
  1303.     __fastcall Variant(const int src);
  1304.     __fastcall Variant(const float src);
  1305.     __fastcall Variant(const double src);
  1306.     __fastcall Variant(const Currency src);
  1307.     __fastcall Variant(const TDateTime src);
  1308.     __fastcall Variant(const bool src);
  1309.     __fastcall Variant(const WordBool src);
  1310.     __fastcall Variant(const Byte src);
  1311.     __fastcall Variant(const AnsiString& src);
  1312.     __fastcall Variant(const char* src); // treat as asciiz pointer
  1313.     __fastcall Variant(wchar_t* const src);
  1314.     __fastcall Variant(Ole2::IDispatch* const src);
  1315.     __fastcall Variant(Ole2::IUnknown* const src);
  1316.  
  1317.     //By ref constructors
  1318.     __fastcall Variant(short* src);
  1319.     __fastcall Variant(int* src);
  1320.     __fastcall Variant(float* src);
  1321.     __fastcall Variant(double* src);
  1322.     __fastcall Variant(Currency* src);
  1323.     __fastcall Variant(TDateTime* src);
  1324.     __fastcall Variant(WordBool* src);
  1325.     __fastcall Variant(Byte* src);
  1326.     __fastcall Variant(wchar_t** src);
  1327.  
  1328.     // constructor for array of variants of type varType
  1329.     __fastcall Variant(const int* bounds, const int boundsSize, Word varType);
  1330.  
  1331.     // constructor for one dimensional array of type Variant
  1332.     __fastcall Variant(const Variant* values, const int valuesSize);
  1333.  
  1334.     __fastcall ~Variant();
  1335.  
  1336.     //assignments
  1337.     Variant& __fastcall operator =(const Variant& rhs);
  1338.     Variant& __fastcall operator +=(const Variant& rhs);
  1339.     Variant& __fastcall operator -=(const Variant& rhs);
  1340.     Variant& __fastcall operator *=(const Variant& rhs);
  1341.     Variant& __fastcall operator /=(const Variant& rhs);
  1342.     Variant& __fastcall operator %=(const Variant& rhs);
  1343.     Variant& __fastcall operator &=(const Variant& rhs);
  1344.     Variant& __fastcall operator |=(const Variant& rhs);
  1345.     Variant& __fastcall operator ^=(const Variant& rhs);
  1346.     Variant& __fastcall operator <<=(const Variant& rhs);
  1347.     Variant& __fastcall operator >>=(const Variant& rhs);
  1348.  
  1349.     // comparisons (Variant on right)
  1350.     bool __fastcall operator ==(const Variant& rhs) const;
  1351.     bool __fastcall operator !=(const Variant& rhs) const;
  1352.     bool __fastcall operator <(const Variant& rhs) const;
  1353.     bool __fastcall operator >(const Variant& rhs) const;
  1354.     bool __fastcall operator <=(const Variant& rhs) const;
  1355.     bool __fastcall operator >=(const Variant& rhs) const;
  1356.  
  1357.     // comparisons (int on right)
  1358.     bool __fastcall operator ==(int rhs) const
  1359.       {return operator ==(Variant(rhs));}
  1360.     bool __fastcall operator !=(int rhs) const
  1361.       {return operator !=(Variant(rhs));}
  1362.     bool __fastcall operator < (int rhs) const
  1363.       {return operator < (Variant(rhs));}
  1364.     bool __fastcall operator > (int rhs) const
  1365.       {return operator > (Variant(rhs));}
  1366.     bool __fastcall operator <=(int rhs) const
  1367.       {return operator <=(Variant(rhs));}
  1368.     bool __fastcall operator >=(int rhs) const
  1369.       {return operator >=(Variant(rhs));}
  1370.  
  1371.     // comparisons (double on right)
  1372.     bool __fastcall operator ==(double rhs) const
  1373.       {return operator ==(Variant(rhs));}
  1374.     bool __fastcall operator !=(double rhs) const
  1375.       {return operator !=(Variant(rhs));}
  1376.     bool __fastcall operator < (double rhs) const
  1377.       {return operator <(Variant(rhs));}
  1378.     bool __fastcall operator > (double rhs) const
  1379.       {return operator >(Variant(rhs));}
  1380.     bool __fastcall operator <=(double rhs) const
  1381.       {return operator <=(Variant(rhs));}
  1382.     bool __fastcall operator >=(double rhs) const
  1383.       {return operator >=(Variant(rhs));}
  1384.  
  1385.     // binary operators (Variant on right)
  1386.     Variant __fastcall operator +(const Variant& rhs) const;
  1387.     Variant __fastcall operator -(const Variant& rhs) const;
  1388.     Variant __fastcall operator *(const Variant& rhs) const;
  1389.     Variant __fastcall operator /(const Variant& rhs) const;
  1390.     Variant __fastcall operator %(const Variant& rhs) const;
  1391.     Variant __fastcall operator &(const Variant& rhs) const;
  1392.     Variant __fastcall operator |(const Variant& rhs) const;
  1393.     Variant __fastcall operator ^(const Variant& rhs) const;
  1394.     Variant __fastcall operator <<(const Variant& rhs) const;
  1395.     Variant __fastcall operator >>(const Variant& rhs) const;
  1396.  
  1397.     // binary operators (AnsiString on right)
  1398.     Variant __fastcall operator -(const AnsiString& rhs) const
  1399.       {return operator -(Variant(rhs));}
  1400.     Variant __fastcall operator *(const AnsiString& rhs) const
  1401.       {return operator *(Variant(rhs));}
  1402.     Variant __fastcall operator /(const AnsiString& rhs) const
  1403.       {return operator /(Variant(rhs));}
  1404.     Variant __fastcall operator %(const AnsiString& rhs) const
  1405.       {return operator %(Variant(rhs));}
  1406.     Variant __fastcall operator &(const AnsiString& rhs) const
  1407.       {return operator &(Variant(rhs));}
  1408.     Variant __fastcall operator |(const AnsiString& rhs) const
  1409.       {return operator |(Variant(rhs));}
  1410.     Variant __fastcall operator ^(const AnsiString& rhs) const
  1411.       {return operator ^(Variant(rhs));}
  1412.     Variant __fastcall operator <<(const AnsiString& rhs) const
  1413.       {return operator <<(Variant(rhs));}
  1414.     Variant __fastcall operator >>(const AnsiString& rhs) const
  1415.       {return operator >>(Variant(rhs));}
  1416.  
  1417.     // binary operators (int on right)
  1418.     Variant __fastcall operator +(int rhs) const
  1419.       {return operator +(Variant(rhs));}
  1420.     Variant __fastcall operator -(int rhs) const
  1421.       {return operator -(Variant(rhs));}
  1422.     Variant __fastcall operator *(int rhs) const
  1423.       {return operator *(Variant(rhs));}
  1424.     Variant __fastcall operator /(int rhs) const
  1425.       {return operator /(Variant(rhs));}
  1426.     Variant __fastcall operator %(int rhs) const
  1427.       {return operator %(Variant(rhs));}
  1428.     Variant __fastcall operator &(int rhs) const
  1429.       {return operator &(Variant(rhs));}
  1430.     Variant __fastcall operator |(int rhs) const
  1431.       {return operator |(Variant(rhs));}
  1432.     Variant __fastcall operator ^(int rhs) const
  1433.       {return operator ^(Variant(rhs));}
  1434.     Variant __fastcall operator <<(int rhs) const
  1435.       {return operator <<(Variant(rhs));}
  1436.     Variant __fastcall operator >>(int rhs) const
  1437.       {return operator >>(Variant(rhs));}
  1438.  
  1439.     // binary operators (double on right)
  1440.     Variant __fastcall operator +(double rhs) const
  1441.       {return operator +(Variant(rhs));}
  1442.     Variant __fastcall operator -(double rhs) const
  1443.       {return operator -(Variant(rhs));}
  1444.     Variant __fastcall operator *(double rhs) const
  1445.       {return operator *(Variant(rhs));}
  1446.     Variant __fastcall operator /(double rhs) const
  1447.       {return operator /(Variant(rhs));}
  1448.     Variant __fastcall operator %(double rhs) const
  1449.       {return operator %(Variant(rhs));}
  1450.     Variant __fastcall operator &(double rhs) const
  1451.       {return operator &(Variant(rhs));}
  1452.     Variant __fastcall operator |(double rhs) const
  1453.       {return operator |(Variant(rhs));}
  1454.     Variant __fastcall operator ^(double rhs) const
  1455.       {return operator ^(Variant(rhs));}
  1456.     Variant __fastcall operator <<(double rhs) const
  1457.       {return operator <<(Variant(rhs));}
  1458.     Variant __fastcall operator >>(double rhs) const
  1459.       {return operator >>(Variant(rhs));}
  1460.  
  1461.     // unary operators
  1462.     Variant __fastcall operator -() const;
  1463.     Variant __fastcall operator !() const;
  1464.  
  1465.     // conversion operators
  1466.     __fastcall operator short() const;
  1467.     __fastcall operator int() const;
  1468.     __fastcall operator float() const;
  1469.     __fastcall operator double() const;
  1470.     __fastcall operator Currency() const;
  1471.     __fastcall operator TDateTime() const;
  1472.     __fastcall operator bool() const;
  1473.     __fastcall operator WordBool() const;
  1474.     __fastcall operator Byte() const;
  1475.     __fastcall operator AnsiString() const;
  1476.     __fastcall operator Ole2::IDispatch*();
  1477.     __fastcall operator Ole2::IUnknown*();
  1478.  
  1479.     // by ref conversion operators
  1480.     __fastcall operator short*();
  1481.     __fastcall operator int*();
  1482.     __fastcall operator float*();
  1483.     __fastcall operator double*();
  1484.     __fastcall operator Currency*();
  1485.     __fastcall operator TDateTime*();
  1486.     __fastcall operator WordBool*();
  1487.     __fastcall operator Byte*();
  1488.     __fastcall operator wchar_t**();
  1489.  
  1490.     // HRESULT methods
  1491.     void __fastcall SetError(const Integer err);
  1492.     Integer __fastcall GetError() const;
  1493.  
  1494.     void __fastcall Clear();
  1495.     Variant& __fastcall ChangeType(int VarType);
  1496.     Variant __fastcall AsType(int VarType) const;
  1497.  
  1498.     int __fastcall Type() const;
  1499.     bool __fastcall IsNull() const;
  1500.     bool __fastcall IsEmpty() const;
  1501.  
  1502.     // variant array stuff
  1503.     bool    __fastcall IsArray() const;
  1504.     Variant __fastcall GetElement(const int i1) const;
  1505.     Variant __fastcall GetElement(const int i1, const int i2) const;
  1506.     Variant __fastcall GetElement(const int i1, const int i2, const int i3)
  1507.       const;
  1508.     Variant __fastcall GetElement(const int i1, const int i2, const int i3,
  1509.       const int i4) const;
  1510.     Variant __fastcall GetElement(const int i1, const int i2, const int i3,
  1511.       const int i4, const int i5) const;
  1512.     void __fastcall PutElement(const Variant& data, const int i1);
  1513.     void __fastcall PutElement(const Variant& data, const int i1, const int i2);
  1514.     void __fastcall PutElement(const Variant& data, const int i1, const int i2,
  1515.       const int i3);
  1516.     void __fastcall PutElement(const Variant& data, const int i1, const int i2,
  1517.       const int i3, const int i4);
  1518.     void __fastcall PutElement(const Variant& data, const int i1, const int i2,
  1519.       const int i3, const int i4, const int i5);
  1520.     int __fastcall ArrayDimCount() const;
  1521.     int __fastcall ArrayLowBound(const int dim = 1) const;
  1522.     int __fastcall ArrayHighBound(const int dim = 1) const;
  1523.     void __fastcall ArrayRedim(int highBound);
  1524.     Pointer __fastcall ArrayLock();
  1525.     void    __fastcall ArrayUnlock();
  1526.  
  1527.     // Automation Goodies
  1528.     Variant __fastcall Exec(AutoCmd& cmd, Integer lcid = LOCALE_SYSTEM_DEFAULT);
  1529.  
  1530.     // Alternate Syntax for Automation
  1531.     // (Doesn't support Named Parameters for now)
  1532.     void OleProcedure(const String& name, Variant& v0 = Variant(),
  1533.       Variant& v1 = Variant(),Variant& v2 = Variant(),Variant& v3 = Variant(),
  1534.       Variant& v4 = Variant(),Variant& v5 = Variant(),Variant& v6 = Variant(),
  1535.       Variant& v7 = Variant(),Variant& v8 = Variant(),Variant& v9 = Variant());
  1536.     Variant OleFunction(const String& name, Variant& v0 = Variant(),
  1537.       Variant& v1 = Variant(),Variant& v2 = Variant(),Variant& v3 = Variant(),
  1538.       Variant& v4 = Variant(),Variant& v5 = Variant(),Variant& v6 = Variant(),
  1539.       Variant& v7 = Variant(),Variant& v8 = Variant(),Variant& v9 = Variant());
  1540.     Variant OlePropertyGet(const String& name, Variant& v0 = Variant(),
  1541.       Variant& v1 = Variant(),Variant& v2 = Variant(),Variant& v3 = Variant(),
  1542.       Variant& v4 = Variant(),Variant& v5 = Variant(),Variant& v6 = Variant(),
  1543.       Variant& v7 = Variant(),Variant& v8 = Variant(),Variant& v9 = Variant());
  1544.     void OlePropertySet(const String& name, Variant& v0 = Variant(),
  1545.       Variant& v1 = Variant(),Variant& v2 = Variant(),Variant& v3 = Variant(),
  1546.       Variant& v4 = Variant(),Variant& v5 = Variant(),Variant& v6 = Variant(),
  1547.       Variant& v7 = Variant(),Variant& v8 = Variant(),Variant& v9 = Variant());
  1548.     // End of Alternate Syntax for Automation
  1549.   private:
  1550.     // AutoCmd::GetParm & GetNamedParm uses operator [] (AutoCmd is a friend)
  1551.     // operator[] can only be used for arrays of type Variant
  1552.     Variant& __fastcall operator [](const int idx);
  1553. };
  1554.  
  1555. #ifdef NOW_UNDEF_LOCALE_SYSTEM_DEFAULT
  1556. #undef LOCALE_SYSTEM_DEFAULT
  1557. #endif
  1558. //-----------------------------------------------------------------------
  1559. //ostream& operator <<(ostream& os, const Variant& arg);
  1560. //-----------------------------------------------------------------------
  1561. // Variant global scope comparisons (int on left)
  1562. inline bool __fastcall operator ==(int lhs, const Variant& rhs)
  1563.   {return Variant(lhs).operator ==(rhs);}
  1564. inline bool __fastcall operator !=(int lhs, const Variant& rhs)
  1565.   {return Variant(lhs).operator !=(rhs);}
  1566. inline bool __fastcall operator < (int lhs, const Variant& rhs)
  1567.   {return Variant(lhs).operator < (rhs);}
  1568. inline bool __fastcall operator > (int lhs, const Variant& rhs)
  1569.   {return Variant(lhs).operator > (rhs);}
  1570. inline bool __fastcall operator <=(int lhs, const Variant& rhs)
  1571.   {return Variant(lhs).operator <=(rhs);}
  1572. inline bool __fastcall operator >=(int lhs, const Variant& rhs)
  1573.   {return Variant(lhs).operator >=(rhs);}
  1574.  
  1575. // Variant global scope comparisons (double on left)
  1576. inline bool __fastcall operator ==(double lhs, const Variant& rhs)
  1577.   {return Variant(lhs).operator ==(rhs);}
  1578. inline bool __fastcall operator !=(double lhs, const Variant& rhs)
  1579.   {return Variant(lhs).operator !=(rhs);}
  1580. inline bool __fastcall operator < (double lhs, const Variant& rhs)
  1581.   {return Variant(lhs).operator < (rhs);}
  1582. inline bool __fastcall operator > (double lhs, const Variant& rhs)
  1583.   {return Variant(lhs).operator > (rhs);}
  1584. inline bool __fastcall operator <=(double lhs, const Variant& rhs)
  1585.   {return Variant(lhs).operator <=(rhs);}
  1586. inline bool __fastcall operator >=(double lhs, const Variant& rhs)
  1587.   {return Variant(lhs).operator >=(rhs);}
  1588.  
  1589. // Variant binary global scope operators (AnsiString on left)
  1590. inline Variant __fastcall operator - (const AnsiString& lhs, const Variant& rhs)
  1591.   {return Variant(lhs).operator -(rhs);}
  1592. inline Variant __fastcall operator * (const AnsiString& lhs, const Variant& rhs)
  1593.   {return Variant(lhs).operator *(rhs);}
  1594. inline Variant __fastcall operator / (const AnsiString& lhs, const Variant& rhs)
  1595.   {return Variant(lhs).operator /(rhs);}
  1596. inline Variant __fastcall operator % (const AnsiString& lhs, const Variant& rhs)
  1597.   {return Variant(lhs).operator %(rhs);}
  1598. inline Variant __fastcall operator & (const AnsiString& lhs, const Variant& rhs)
  1599.   {return Variant(lhs).operator &(rhs);}
  1600. inline Variant __fastcall operator | (const AnsiString& lhs, const Variant& rhs)
  1601.   {return Variant(lhs).operator |(rhs);}
  1602. inline Variant __fastcall operator ^ (const AnsiString& lhs, const Variant& rhs)
  1603.   {return Variant(lhs).operator ^(rhs);}
  1604. inline Variant __fastcall operator <<(const AnsiString& lhs, const Variant& rhs)
  1605.   {return Variant(lhs).operator <<(rhs);}
  1606. inline Variant __fastcall operator >>(const AnsiString& lhs, const Variant& rhs)
  1607.   {return Variant(lhs).operator >>(rhs);}
  1608.  
  1609. // Variant binary global scope operators (int on left)
  1610. inline Variant __fastcall operator +(int lhs, const Variant& rhs)
  1611.   {return Variant(lhs).operator +(rhs);}
  1612. inline Variant __fastcall operator -(int lhs, const Variant& rhs)
  1613.   {return Variant(lhs).operator -(rhs);}
  1614. inline Variant __fastcall operator *(int lhs, const Variant& rhs)
  1615.   {return Variant(lhs).operator *(rhs);}
  1616. inline Variant __fastcall operator /(int lhs, const Variant& rhs)
  1617.   {return Variant(lhs).operator /(rhs);}
  1618. inline Variant __fastcall operator %(int lhs, const Variant& rhs)
  1619.   {return Variant(lhs).operator %(rhs);}
  1620. inline Variant __fastcall operator &(int lhs, const Variant& rhs)
  1621.   {return Variant(lhs).operator &(rhs);}
  1622. inline Variant __fastcall operator |(int lhs, const Variant& rhs)
  1623.   {return Variant(lhs).operator |(rhs);}
  1624. inline Variant __fastcall operator ^(int lhs, const Variant& rhs)
  1625.   {return Variant(lhs).operator ^(rhs);}
  1626. inline Variant __fastcall operator <<(int lhs, const Variant& rhs)
  1627.   {return Variant(lhs).operator <<(rhs);}
  1628. inline Variant __fastcall operator >>(int lhs, const Variant& rhs)
  1629.   {return Variant(lhs).operator >>(rhs);}
  1630.  
  1631. // Variant binary global scope operators (double on left)
  1632. inline Variant __fastcall operator +(double lhs, const Variant& rhs)
  1633.   {return Variant(lhs).operator +(rhs);}
  1634. inline Variant __fastcall operator -(double lhs, const Variant& rhs)
  1635.   {return Variant(lhs).operator -(rhs);}
  1636. inline Variant __fastcall operator *(double lhs, const Variant& rhs)
  1637.   {return Variant(lhs).operator *(rhs);}
  1638. inline Variant __fastcall operator /(double lhs, const Variant& rhs)
  1639.   {return Variant(lhs).operator /(rhs);}
  1640. inline Variant __fastcall operator %(double lhs, const Variant& rhs)
  1641.   {return Variant(lhs).operator %(rhs);}
  1642. inline Variant __fastcall operator &(double lhs, const Variant& rhs)
  1643.   {return Variant(lhs).operator &(rhs);}
  1644. inline Variant __fastcall operator |(double lhs, const Variant& rhs)
  1645.   {return Variant(lhs).operator |(rhs);}
  1646. inline Variant __fastcall operator ^(double lhs, const Variant& rhs)
  1647.   {return Variant(lhs).operator ^(rhs);}
  1648. inline Variant __fastcall operator <<(double lhs, const Variant& rhs)
  1649.   {return Variant(lhs).operator <<(rhs);}
  1650. inline Variant __fastcall operator >>(double lhs, const Variant& rhs)
  1651.   {return Variant(lhs).operator >>(rhs);}
  1652.  
  1653. //-----------------------------------------------------------------------
  1654. //forward declare NamedParm - used by AutoArg's operator << function
  1655. class NamedParm;
  1656. //-----------------------------------------------------------------------
  1657. class AutoCmd
  1658. {
  1659.   public:
  1660.     AutoCmd(const String& name): Name(name) {}
  1661.     AutoCmd(const AutoCmd& src);
  1662.     virtual AutoCmd& SetName(const String& name);
  1663.  
  1664.     //Named arg
  1665.     virtual AutoCmd& operator <<(const NamedParm& np);
  1666.     //By value args
  1667.     virtual AutoCmd& operator <<(const Variant& arg);
  1668.     virtual AutoCmd& operator <<(const short arg);
  1669.     virtual AutoCmd& operator <<(const int arg);
  1670.     virtual AutoCmd& operator <<(const float arg);
  1671.     virtual AutoCmd& operator <<(const double arg);
  1672.     virtual AutoCmd& operator <<(const Currency arg);
  1673.     virtual AutoCmd& operator <<(const TDateTime arg);
  1674.     virtual AutoCmd& operator <<(const bool arg);
  1675.     virtual AutoCmd& operator <<(const WordBool arg);
  1676.     virtual AutoCmd& operator <<(const Byte arg);
  1677.     virtual AutoCmd& operator <<(const AnsiString& arg);
  1678.     virtual AutoCmd& operator <<(const char* arg) // treat as asciiz pointer
  1679.       {return operator <<(AnsiString(arg));}
  1680.     //!JK not allowed    virtual AutoCmd& operator <<(wchar_t* const arg);
  1681.     virtual AutoCmd& operator <<(Ole2::IDispatch* const arg);
  1682.     virtual AutoCmd& operator <<(Ole2::IUnknown* const arg);
  1683.     //By ref args
  1684.     virtual AutoCmd& operator <<(Variant* arg);
  1685.     virtual AutoCmd& operator <<(short* arg);
  1686.     virtual AutoCmd& operator <<(int* arg);
  1687.     virtual AutoCmd& operator <<(float* arg);
  1688.     virtual AutoCmd& operator <<(double* arg);
  1689.     virtual AutoCmd& operator <<(Currency* arg);
  1690.     virtual AutoCmd& operator <<(TDateTime* arg);
  1691.     virtual AutoCmd& operator <<(WordBool* arg);
  1692.     virtual AutoCmd& operator <<(Byte* arg);
  1693.     //!JK not allowed    virtual AutoCmd& operator <<(wchar_t** arg);
  1694.     virtual AutoCmd& operator <<(AnsiString* arg);
  1695.  
  1696.     virtual AutoCmd& Clear();       // ClearName() + ClearArgs()
  1697.     virtual AutoCmd& ClearName();   // SetName("")
  1698.     virtual AutoCmd& ClearArgs();   // Clear Parms and NamedParms
  1699.  
  1700.     virtual Byte GetCallType() const = 0;
  1701.     virtual bool RequestResult() const = 0;
  1702.     virtual int GetArgType(const Byte idx) const;
  1703.     virtual int GetNamedArgType(const Byte idx) const;
  1704.     virtual String GetName() const { return Name; }
  1705.     virtual Byte GetArgCount() const;
  1706.     virtual Byte GetNamedArgCount() const;
  1707.     virtual Variant& GetParm(const Byte idx);
  1708.     virtual Variant& GetNamedParm(const Byte idx);
  1709.     virtual String GetNamedParmName(const Byte idx) const;
  1710.     virtual String GetStringArg(const Byte idx) {return StringArgs[idx];}
  1711.     virtual String* GetStringPtr(const Byte idx) {return StringPtrs[idx];}
  1712.     virtual String GetNamedStringArg(const Byte idx) {return NamedStringArgs[idx];}
  1713.     virtual String* GetNamedStringPtr(const Byte idx) {return NamedStringPtrs[idx];}
  1714.  
  1715.   protected:
  1716.     void AddElement();
  1717.     String Name;            // name of command
  1718.     Variant Parms;          // positional arguments
  1719.     Variant ParmTypes;      // types of positional arguments
  1720.     Variant NamedParms;     // named arguments
  1721.     Variant NamedParmTypes; // types of named arguments
  1722.     Variant NamedParmNames; // names of named arguments
  1723.     AnsiString StringArgs[32];       // MaxDispArgs = 32 in oleauto.hpp
  1724.     AnsiString* StringPtrs[32];      // MaxDispArgs = 32 in oleauto.hpp
  1725.     AnsiString NamedStringArgs[32];  // MaxDispArgs = 32 in oleauto.hpp
  1726.     AnsiString* NamedStringPtrs[32]; // MaxDispArgs = 32 in oleauto.hpp
  1727. };
  1728. //-----------------------------------------------------------------------
  1729. class NamedParm
  1730. {
  1731.   public:
  1732. //    NamedParm(const String& name, Variant& parm): Name(name), Parm(parm) {}
  1733.     //By value ctors
  1734.     NamedParm(const String& name, const Variant& arg):
  1735.       Name(name), Type(varVariant), Parm(arg) {}
  1736.     NamedParm(const String& name, const short arg):
  1737.       Name(name), Type(varSmallint), Parm(arg) {}
  1738.     NamedParm(const String& name, const int arg):
  1739.       Name(name), Type(varInteger), Parm(arg) {}
  1740.     NamedParm(const String& name, const float arg):
  1741.       Name(name), Type(varSingle), Parm(arg) {}
  1742.     NamedParm(const String& name, const double arg):
  1743.       Name(name), Type(varDouble), Parm(arg) {}
  1744.     NamedParm(const String& name, const Currency arg):
  1745.       Name(name), Type(varCurrency), Parm(arg) {}
  1746.     NamedParm(const String& name, const TDateTime arg):
  1747.       Name(name), Type(varDate), Parm(arg) {}
  1748.     NamedParm(const String& name, const bool arg):
  1749.       Name(name), Type(varBoolean), Parm(arg) {}
  1750.     NamedParm(const String& name, const WordBool arg):
  1751.       Name(name), Type(varBoolean), Parm(arg) {}
  1752.     NamedParm(const String& name, const Byte arg):
  1753.       Name(name), Type(varByte), Parm(arg) {}
  1754.     NamedParm(const String& name, const AnsiString& arg):
  1755.       Name(name), Type(varString), StringParm(arg) {}
  1756.     NamedParm(const String& name, const char* arg): // treat as asciiz pointer
  1757.       Name(name), Type(varString), StringParm(arg) {}
  1758.     //!JK not allowed NamedParm(const String& name, wchar_t* const arg):
  1759.     //!JK not allowed   Name(name), Type(varOleStr), Parm(arg) {}
  1760.     NamedParm(const String& name, Ole2::IDispatch* const arg):
  1761.       Name(name), Type(varDispatch), Parm(arg) {}
  1762.     NamedParm(const String& name, Ole2::IUnknown* const arg):
  1763.       Name(name), Type(varUnknown), Parm(arg) {}
  1764.     //By ref ctors
  1765.     NamedParm(const String& name, Variant* arg);
  1766.     NamedParm(const String& name, short* arg):
  1767.       Name(name), Type(varSmallint | varByRef), Parm(arg) {}
  1768.     NamedParm(const String& name, int* arg):
  1769.       Name(name), Type(varInteger | varByRef), Parm(arg) {}
  1770.     NamedParm(const String& name, float* arg):
  1771.       Name(name), Type(varSingle | varByRef), Parm(arg) {}
  1772.     NamedParm(const String& name, double* arg):
  1773.       Name(name), Type(varDouble | varByRef), Parm(arg) {}
  1774.     NamedParm(const String& name, Currency* arg):
  1775.       Name(name), Type(varCurrency | varByRef), Parm(arg) {}
  1776.     NamedParm(const String& name, TDateTime* arg):
  1777.       Name(name), Type(varDate | varByRef), Parm(arg) {}
  1778.     NamedParm(const String& name, WordBool* arg):
  1779.       Name(name), Type(varBoolean | varByRef), Parm(arg) {}
  1780.     NamedParm(const String& name, Byte* arg):
  1781.       Name(name), Type(varByte | varByRef), Parm(arg) {}
  1782.     //!JK not allowed NamedParm(const String& name, wchar_t** arg):
  1783.     //!JK not allowed   Name(name), Type(varOleStr | varByRef), Parm(arg) {}
  1784.     NamedParm(const String& name, String* arg):
  1785.       Name(name), Type(varString | varByRef), StringPtr(arg) {}
  1786.  
  1787.     virtual Variant GetParm() const { return Parm; }
  1788.     virtual AnsiString GetStringParm() const { return StringParm; }
  1789.     virtual AnsiString* GetStringPtr() const { return StringPtr; }
  1790.     virtual int GetType() const { return Type; }
  1791.     virtual String GetParmName() const { return Name; }
  1792.   protected:
  1793.     void AddElement();
  1794.     String Name;
  1795.     Variant Parm;
  1796.     AnsiString StringParm;
  1797.     AnsiString* StringPtr;
  1798.     int Type;
  1799. };
  1800. //-----------------------------------------------------------------------
  1801. class Procedure: public AutoCmd
  1802. {
  1803.   public:
  1804.     Procedure(const String& name): AutoCmd(name) {}
  1805.     Procedure(const AutoCmd& src): AutoCmd(src) {dynamic_cast<const Procedure*>(&src);}
  1806.     virtual Byte GetCallType() const;
  1807.     virtual bool RequestResult() const { return false; }
  1808. };
  1809. //-----------------------------------------------------------------------
  1810. class Function: public AutoCmd
  1811. {
  1812.   public:
  1813.     Function(const String& name): AutoCmd(name) {}
  1814.     Function(const AutoCmd& src): AutoCmd(src) {dynamic_cast<const Function*>(&src);}
  1815.     virtual Byte GetCallType() const;
  1816.     virtual bool RequestResult() const { return true; }
  1817. };
  1818. //-----------------------------------------------------------------------
  1819. class PropertySet: public AutoCmd
  1820. {
  1821.   public:
  1822.     PropertySet(const String& name): AutoCmd(name) {}
  1823.     PropertySet(const AutoCmd& src): AutoCmd(src) {dynamic_cast<const PropertySet*>(&src);}
  1824.     virtual Byte GetCallType() const;
  1825.     virtual bool RequestResult() const { return false; }
  1826. };
  1827. //-----------------------------------------------------------------------
  1828. class PropertyGet: public AutoCmd
  1829. {
  1830.   public:
  1831.     PropertyGet(const String& name): AutoCmd(name) {}
  1832.     PropertyGet(const AutoCmd& src): AutoCmd(src) {dynamic_cast<const PropertyGet*>(&src);}
  1833.     virtual Byte GetCallType() const;
  1834.     virtual bool RequestResult() const { return true; }
  1835. };
  1836. //-----------------------------------------------------------------------
  1837. typedef class TMemoryManager *PMemoryManager;
  1838.  
  1839. class TMemoryManager {
  1840.   public:
  1841.         Pointer __fastcall (*GetMem)(Integer Size);
  1842.         Integer __fastcall (*FreeMem)(Pointer P);
  1843.         Pointer __fastcall (*ReallocMem)(Pointer P, Integer Size);
  1844. } ;
  1845.  
  1846. class THeapStatus {
  1847.   public:
  1848.     Cardinal TotalAddrSpace;
  1849.     Cardinal TotalUncommitted;
  1850.     Cardinal TotalCommitted;
  1851.     Cardinal TotalAllocated;
  1852.     Cardinal TotalFree;
  1853.     Cardinal FreeSmall;
  1854.     Cardinal FreeBig;
  1855.     Cardinal Unused;
  1856.     Cardinal Overhead;
  1857.     Cardinal HeapErrorCode;
  1858. } ;
  1859.  
  1860. typedef Integer __fastcall (*TThreadFunc)(Pointer Parameter);
  1861.  
  1862. #if 0
  1863. //---------------------------------------------------------------------------
  1864. typedef void* HINSTANCE;
  1865. #if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__)
  1866. #define CALLBACK    __stdcall
  1867. #define WINAPI      __stdcall
  1868. #define WINAPIV     __cdecl
  1869. #define APIENTRY    WINAPI
  1870. #define APIPRIVATE  __stdcall
  1871. #define PASCAL      __stdcall
  1872. #else
  1873. #define CALLBACK
  1874. #define WINAPI
  1875. #define WINAPIV
  1876. #define APIENTRY    WINAPI
  1877. #define APIPRIVATE
  1878. #define PASCAL      pascal
  1879. #endif
  1880. #endif
  1881.  
  1882. //---------------------------------------------------------------------
  1883. #define USEDATAMODULE(FileName, DataModuleName)  \
  1884.    class __declspec(delphiclass) T##DataModuleName;       \
  1885.    extern T##DataModuleName *DataModuleName;
  1886. //---------------------------------------------------------------------
  1887. #define USEDATAMODULENS(FileName, UnitName, DataModuleName)  \
  1888.    namespace UnitName {         \
  1889.    class __declspec(delphiclass) T##DataModuleName;       \
  1890.    extern T##DataModuleName *DataModuleName;              \
  1891.    };               \
  1892.    using namespace UnitName
  1893. //---------------------------------------------------------------------
  1894. #define USEFORM(FileName, FormName) \
  1895.    class __declspec(delphiclass) T##FormName;       \
  1896.    extern T##FormName *FormName;
  1897. //---------------------------------------------------------------------
  1898. #define USEFORMNS(FileName, UnitName, FormName) \
  1899.    namespace UnitName {         \
  1900.    class __declspec(delphiclass) T##FormName;       \
  1901.    extern T##FormName *FormName;          \
  1902.    };               \
  1903.    using namespace UnitName
  1904. //---------------------------------------------------------------------
  1905. #define USEUNIT(ModName) \
  1906.    extern DummyThatIsNeverReferenced
  1907. //---------------------------------------------------------------------------
  1908. #define USEOBJ(FileName) \
  1909.    extern DummyThatIsNeverReferenced
  1910. //-----------------------------------------------------------------------
  1911. #define USERC(FileName) \
  1912.    extern DummyThatIsNeverReferenced
  1913. //-----------------------------------------------------------------------
  1914. #define USEDEF(FileName) \
  1915.    extern DummyThatIsNeverReferenced
  1916. //-----------------------------------------------------------------------
  1917. #define USERES(FileName) \
  1918.    extern DummyThatIsNeverReferenced
  1919. //-----------------------------------------------------------------------
  1920. #define USELIB(FileName) \
  1921.    extern DummyThatIsNeverReferenced
  1922. //-----------------------------------------------------------------------
  1923. #define USEFILE(FileName) \
  1924.    extern DummyThatIsNeverReferenced
  1925. //-----------------------------------------------------------------------
  1926.  
  1927. #if defined(BCB_NAMESPACES)
  1928. }
  1929. using namespace System;
  1930. using System::TClass;
  1931.  
  1932. namespace Typinfo {
  1933.   struct  TTypeInfo;
  1934.   typedef TTypeInfo *PTypeInfo;
  1935. }
  1936.  
  1937. #if !defined(__typeinfo)
  1938. # define __typeinfo(type)  (PTypeInfo)TObject::ClassInfo(__classid(type))
  1939. #endif
  1940.  
  1941. #endif  //  BCB_NAMESPACES
  1942. #endif  //  SYSDEFS_H
  1943.  
  1944.