home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1B / DATAFILE_PDCD1B.iso / _pocketbk / pocketbook / 004 / longlist_z / FLATLIST.OPL next >
Text File  |  1994-04-13  |  5KB  |  164 lines

  1. /* 
  2.     Example OPL program which replaces choice list in a dialog
  3.     with a VAFLAT array allowing more choice items than the normal
  4.     list (limited to 254 items - this example creates a choice
  5.     list with 360 items).
  6.  
  7.     A related OPL program STRLIST.OPL uses the VASTR class of
  8.     array to reduce the amount of memory used with a penalty of
  9.     reduced speed.
  10.  
  11.     This file should be accompanied by VARRAY.TXT which describes
  12.     some of the concepts used here in a little more detail.
  13.  
  14. */
  15.  
  16. #define DatDialogPtr        $36
  17.  
  18. #define E_GEN_NOMEMORY        -10
  19.  
  20. #define SE_CHLIST_NSEL        1
  21. #define SE_CHLIST_DATA        2
  22. #define SE_CHLIST_RETAIN    4
  23.  
  24. #define C_VAFLAT        3
  25.  
  26. #define O_VA_INIT        17
  27. #define O_VA_APPEND        7
  28.  
  29. #define O_WN_SET        10
  30.  
  31.  
  32. /*  MAIN: is our top level procedure  */
  33.  
  34. PROC main:
  35.  
  36.     GLOBAL        ret%                              /*  General return  */
  37.  
  38.     ret% = Choice%:    
  39.  
  40.     IF ret% < 0
  41.         PRINT "Error was", ret%
  42.     ELSE
  43.         PRINT "You chose item", ret%
  44.     ENDIF
  45.     GET
  46.  
  47. ENDP
  48.  
  49.  
  50. /*  CHOICE%: replaces the choice list and displays the dialog  */
  51.  
  52. PROC Choice%:
  53.  
  54.     GLOBAL        datdlg%                      /*  DatDialogPtr static  */
  55.     GLOBAL        vaflat%                      /*  The C_VAFLAT object  */
  56.     GLOBAL        set%(3)                      /*  SE_CHLIST structure  */
  57.     GLOBAL        pset%                          /*  Pointer to set%()  */
  58.  
  59.     LOCAL        choice%                /*  Live variable for dCHOICE  */
  60.     LOCAL        lgnsel%              /*  set.nsel in SE_CHLIST 'set'  */
  61.     LOCAL        index%                  /*  Index of the choice list  */
  62.  
  63.     index%  = 1                             /*  Index of the dialog item  */
  64.     pset%   = ADDR(set%())          /*  pset% points to SE_CHLIST struct  */
  65.  
  66.     lgnsel%  = 0                         /*  set.nsel in SE_CHLIST 'set'  */
  67.  
  68.     set%(1)  = (SE_CHLIST_DATA) OR (SE_CHLIST_NSEL) OR (SE_CHLIST_RETAIN)
  69.     set%(3)  = lgnsel%
  70.     
  71.     PRINT "Generating list, wait a short time"
  72.     ret% = Array%:
  73.     IF ret% < 0
  74.         RETURN ret%
  75.     ENDIF
  76.  
  77.     dINIT "Test dialog"                              /*  Init the dialog  */
  78.     dCHOICE choice%, "Date", "dummy"       /*  Create a choice list with
  79.                                                                a dummy entry  */
  80.  
  81.     datdlg%  = PEEKW(DatDialogPtr)  /*  datdlg% points to current dialog  */
  82.     set%(2)  = vaflat%                             /*  set.data = varray  */
  83.     
  84.     ret% = ENTERSEND0(datdlg%, O_WN_SET, #index%, #pset%)
  85.  
  86. /*
  87.     WN_SET is a method provided by the DLGBOX class and is used to
  88.     set the data element in the property of the control associated
  89.     with the dialog box item.
  90. */
  91.     IF (ret% <> 0)                                  /*  Return any error  */
  92.         RETURN ret%
  93.     ENDIF
  94.  
  95.     IF (DIALOG > 0)                                   /*  Run the dialog  */
  96.         lgnsel% = choice%
  97.         RETURN lgnsel%                  /*  Return the option chosen  */
  98.     ENDIF
  99.  
  100. ENDP
  101.  
  102.  
  103. /*  ARRAY%: creates the array and fills it with example data  */
  104.  
  105. PROC Array%:
  106.  
  107.     LOCAL        yea%                                    /*  The year  */
  108.     LOCAL        mon%                                   /*  The month  */
  109.     LOCAL        buf$(10)                     /*  The built-up string  */
  110.     LOCAL        pbuf%                            /*  Pointer to buf$  */
  111.     LOCAL        size%                  /*  Record length for VA_INIT  */
  112.     LOCAL        gran%                    /*  Granularity for VA_INIT  */
  113.     LOCAL        ohand%               /*  Category handle of OLIB.DYL  */
  114.  
  115.     gran% = 16                                     /* Granularity  is 16  */
  116.     size% = 9                                     /*  Record length is 9  */
  117.     
  118.     ret% = FINDLIB(ohand%, "OLIB.DYL")  /*  Find category handle of OLIB  */
  119.     IF (ret% <> 0)
  120.         RETURN ret%                                 /*  Return error  */
  121.     ENDIF
  122.  
  123.     vaflat% = NEWOBJH(ohand%, C_VAFLAT)/*  Create an instance of C_VFLAT  */
  124.      IF (vaflat% = 0)
  125.         RETURN E_GEN_NOMEMORY                         /*  Return OOM  */
  126.     ELSE
  127.                                 /*  Set up the record length and granularity  */
  128.         ret% = ENTERSEND0(vaflat%, O_VA_INIT, #size%, #gran%)
  129.         IF (ret% <> 0)
  130.             RETURN ret%                     /*  Return any error  */
  131.         ENDIF
  132.     ENDIF
  133.  
  134.     yea% = 1970                                        /*  Start at 1970  */
  135.     mon% = 1                                        /*  Start at January  */
  136.  
  137. /*  
  138.     The following loops round and round adding all the month & year
  139.     combinations between Jan 1970 and Dec 2000. It is a convenient
  140.     way of generating a very long list. The strings are then added
  141.     to the array using VA_APPEND.
  142. */
  143.     WHILE (yea% <= 2000)
  144.         WHILE (mon% <= 12)
  145.             buf$ = MONTH$(mon%) + CHR$(32) + GEN$(yea%, 4) + CHR$(0)
  146.             pbuf% = UADD(ADDR(buf$), 1)         /*  Skip the LCB  */
  147.             ret% = ENTERSEND0(vaflat%, O_VA_APPEND, #pbuf%)
  148.  
  149. /*
  150.     VA_APPEND is a method provided by the (abstract) class
  151.     VAROOT. It appends the records pointed to by, in this case 'pbuf%',
  152.     to the end of the array.
  153. */
  154.             IF (ret% <> 0)
  155.                 RETURN ret%             /*  Return any error  */
  156.             ENDIF
  157.             mon% = mon% + 1                 /*  Reset to January  */
  158.         ENDWH
  159.         yea% = yea% + 1                       /*  Increment the year  */
  160.               mon% = 1                             /*  Increment the month  */
  161.     ENDWH
  162.     RETURN 0                                                /*  No error  */
  163. ENDP
  164.