home *** CD-ROM | disk | FTP | other *** search
- '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- '!!! ** [ READ THIS ] ** !!!!!!!! ** [ READ THIS ] ** !!!
- '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ' DATA FILE, RANDDATA.DAT REQUIRED FOR THIS PROGRAM -- SEE SCRLFILE.DOC
- '***************************************************************************
- '**** THIS PROGRAM MUST BE USED WITH ONE OF THE FOLLOWING LIBRARIES: ****
- '***************************************************************************
- '**** For QB4.5 unenhanced version use QBUNEN.QLB ****
- '**** For BASIC 7.1 unenhanced version use PDSUNEN.QLB ****
- '**** For VBDOS 1.0 unenhanced version use VBUNEN.QLB ****
- '**** For QB4.50 enhanced version use QBALL.QLB or QBNER.QLB ****
- '**** For BASIC 7.1 enhanced version use PDSALL.QLB or PDSNER.QLB ****
- '**** For VBDOS 1.0 enhanced version use VBALL.QLB or VBNER.QLB ****
- '**** Load QB, QBX, or VBDOS with the /L option and the correct library ****
- '***************************************************************************
- ' INSTRUCTIONS
- ' ------------
- ' 1. MAKE SURE THE DATA FILE, RANDDATA.DAT, IS IN THE CURRENT
- ' DRIVE/DIRECTORY. IF THE DATA FILE IS NOT AVAILABLE IT MAY BE
- ' MADE USING MAKERAND.BAS ( SEE SCRLFILE.DOC ).
- ' 2. LOAD QUICKBASIC OR PDS WITH THE CORRECT LIBRARY. ( SEE ABOVE )
- ' 3. LOAD SCRLRAND.BAS ( THIS PROGRAM ) INTO QB OR QBX.
- ' 4. RUN THE PROGRAM. ( SHIFT F5 )
- '
- ' **** SEE SCRLFILE.DOC FOR ADDITIONAL INFORMATION ****
- '***************************************************************************
- DECLARE FUNCTION LBUTTON% ()
- DECLARE FUNCTION MOUSEINWIND% (W%)
- DECLARE FUNCTION MOUSEON% (ONOFF%)
- DECLARE FUNCTION CHOICEBAR% (CH$(), TR%, LC%, WD%, ATTR%, HATTR%, EXIT$)
- DECLARE FUNCTION CHOICEWIND% (TITLE$, T$(), C$(), TR%, LC%, ATTR%, HATTR%, ESCEX%, BRDR%)
-
- DIM CH$(3)
- CH$(1) = "ENTER=SELECT": CH$(2) = "ESC=EXIT": CH$(3) = "F1=FIND"
-
- CALL SETWIND(1, 1, 7, 0, 15) ' INITIALIZE WINDOW MEMORY.
- CALL INPTINIT(1, 1, 0, 1, 1) ' INITIALIZE INPUT MEMORY.
- JUNK% = MOUSEON%(1) ' INITIALIZE MOUSE AND TURN IT "ON".
- CALL MAKEWIND(1, "", 1, 1, 80, 25, 112, 2)
- CALL CUROFF
-
- DO
- ANS$ = ""
- CALL GETANS("Color or Mono (C/M) ?", "CM", ANS$, 100, 100, 143, 0, 11)
- IF ANS$ = "C" THEN COL% = 31 ELSE COL% = 112
- LOOP WHILE ANS$ = CHR$(27)
-
- CALL BOXW(21, 10, 59, 3, 2)
-
- IF COL% = 31 THEN A% = 31 ELSE A% = 15
- CALL INFOLINE(25, 2, 78, A%) ' TURN INFO-LINE ON.
-
- '---------------------------------------------------------------------------
- ' DESCRIPTION WINDOW
-
- CALL MAKEWIND(2, "@Virtual scroll window template - Using random file access", 2, 100, 74, 8, COL%, 111)
- CALL PRINTW("This scroll window scrolls through a random access file. It holds 5", 1, 2)
- CALL PRINTW("records at a time. This eliminates the need to place the entire file", 2, 2)
- CALL PRINTW("in memory, minimizing precious string space usage. This template may", 3, 2)
- CALL PRINTW("be used with binary or indexed files with slight modification.", 4, 2)
- '---------------------------------------------------------------------------
- ' MAKE THE WINDOW TO BE USED AS THE SCROLL WINDOW.
- ' INITIALIZE VARIABLES
-
- FILEPOINTER = 1 ' START AT RECORD# 1.
- RTRN% = 1 ' SCROLL BAR OVER 1ST ENTRY.
- ROWS% = 5 ' INTERIOR ROWS IN SCROLL WINDOW.
- ' IF WINDOW HAS A TITLE BOX ROWS% = NUMBER OF
- ' WINDOW ROWS - 4 ELSE ROWS% = NUMBER OF WINDOW
- ' ROWS - 2.
- DIM A$(ROWS%) ' DIMENSION ARRAY TO HOLD SCROLL WINDOW ENTRIES.
- FC% = 1 ' THE FIRST CHARACTER FOR ENTRIES IN SCROLL WINDOW
- ' PRINTS IN THE FIRST COLUMN IN THE WINDOW.
- ' WITH VIRTUAL SCROLL WINDOWS THE CHARACTER IN THE
- ' 1st COLUMN IS NOT ALWAYS THE 1st CHARACTER.
- DATAFILE$ = "RANDDATA.DAT" ' DATA FILE
- FILENUM% = 1 ' USE FILE NUMBER 1
- DIM DUMMY$(0) ' SCROLL WINDOW REQUIRES THIS FOR INFOLINE
-
- TYPE RECORDTYPE ' PLACE YOUR OWN TYPE HERE
- MARK AS STRING * 1
- NAM AS STRING * 25
- ADD1 AS STRING * 30
- CITY AS STRING * 25
- STATE AS STRING * 10
- ZIP AS STRING * 9
- END TYPE
- DIM RECORD AS RECORDTYPE
-
- RECORDLEN% = LEN(RECORD)
-
- CALL MAKEWIND(20, "", 12, 100, 74, ROWS% + 4, COL%, 111) ' SCROLL WINDOW
-
- ' SCROLL WINDOW'S TITLE
- TITLE$ = "NAME ADDRESS CITY STATE ZIP"
-
- ' --------------------------------------------------------------------------
- ' FIND THE NUMBER OF RECORDS IN THE FILE BASED ON THE RECORD LENGTH.
-
- OPEN DATAFILE$ FOR RANDOM AS FILENUM% LEN = RECORDLEN%
- MAXENTRIES = LOF(1) / RECORDLEN%
- CLOSE
-
- OPEN DATAFILE$ FOR RANDOM AS FILENUM% LEN = RECORDLEN%
-
- RK% = CHOICEBAR%(CH$(), 23, 5, 70, 112, 0, "VIEW")
-
- GETFILE:
- GOSUB GETRECORDS
-
- ' ---------------------------------------------------------------------------
- ' PRINT THE INSTRUCTIONS AND PLACE THE RECORDS IN THE SCROLL WINDOW.
-
- CALL PRINTW("[ (+) = Mark ]■■■■■■■■■[ (-) = Unmark ]", 6, 100)
- MAKESCRL:
- IF ENTRIES% < 1 THEN CALL PRINTW("No entries..", 1, 100): END
-
- ' KIND$ REPRESENTS TYPE OF SCROLL WINDOW ON ENTRY AND THE MARKED ENTRIES
- ' ON EXIT.
- ' SET KIND$ TO "M" TO MAKE A "MARKED" SCROLL WINDOW.
-
- CALL INFOFIXED(" Up/Down/Left/Right -- Pgup/Pgdn -- Home/End -- Tab/Shift Tab -- Mouse")
- KIND$ = "M" ' THIS IS A "MARK" SCROLL WINDOW.
-
-
- ' SET EXIT CRITERIA AND MARKED ENTRIES.
-
- CALL B4SCRL("MCT1REXO", SCROLLMARK$, 0, NOREFRESH%)
- NOREFRESH% = 0
-
- ' ENTER THE SCROLL WINDOW
- CALL SCRLWIND(A$(), DUMMY$(), TITLE$, ENTRIES%, KIND$, RTRN%, LI%, FC%, RK%, 0, 1, 0)
-
- CALL INFOFIXED("") ' ERASE THE FIXED INFO STRING.
- IF RK% = 200 OR RK% = 14 OR RK% = 15 THEN ' Mouse pressed out of scroll window
- CALL PRINTW("─────────", 6, 100)
- RK% = CHOICEBAR%(CH$(), 23, 5, 70, 112, 0, "1EOT")
- SELECT CASE RK%
- CASE 1: RK% = 13 ' simulate ENTER
- CASE -1, 3: RK% = 1 ' simulate F1
- CASE 2: RK% = 27 ' simulate ESC
- CASE ELSE: NOREFRESH% = 1 ' Mouse pressed out of a selection
- END SELECT
- 'loop if lbutton is pressed with mouse out of scroll window
- DO: LOOP WHILE LBUTTON% = 1 AND MOUSEINWIND%(20) = 0
- CALL PRINTW("■■■■■■■■■", 6, 100)
- END IF
- '----------------------------------------------------------------------------
- ' RK% = 50 IF THE + OR INSERT (MARK) KEY CAUSED THE EXIT.
- ' RK% = 55 IF THE - OR DELETE (UN-MARK) KEY CAUSED THE EXIT.
- ' KIND$ HOLDS THE CODED STRING FOR MARKED ITEMS ON EXIT.
- ' SET SCROLLMARK$ TO KIND$ FOR NEXT ENTRY INTO SCROLL WINDOW.
- ' NOTE: REQUIRES A FIELD IN THE DATABASE RESERVED FOR THE MARK FLAG.
-
- SELECT CASE RK%
- '( KIND$ RETURNED BY SCRLWIND -- REPRESENTS MARKED ITEMS )
-
- CASE 50, 55 '+/INSERT FOR MARK OR -/DELETE FOR UNMARK CAUSED EXIT
-
- IF ONLAST% = 1 THEN ' MOVE FILEPOINTER TO
- FILEPOINTER = FILEPOINTER - ENTRIES% + 1 ' 1ST RECORD IN SCROLL
- ONLAST% = 0 ' WINDOW.
- END IF
-
- IF KIND$ = "" THEN 'NOTHING MARKED
- RECORD.MARK = " ": SCROLLMARK$ = SPACE$(ENTRIES%)
- ELSE ' AT LEAST ONE ENTRY MARKED
- RECORD.MARK = MID$(KIND$, RTRN%, 1): SCROLLMARK$ = KIND$
- END IF
-
- PUT 1, FILEPOINTER + RTRN% - 1, RECORD.MARK ' PUT MARK FLAG IN CORRECT
- ' RECORD IN FILE.
- RTRN% = RTRN% + 1 ' ADVANCE TO NEXT RECORD.
- IF RTRN% > ENTRIES% THEN RK% = 19: GOTO DOWN ' ELSE ACT LIKE DOWN ARROW
- '---------------------------------------------------------------------------
- ' THE ESC KEY CAUSED THE EXIT FROM THE SCROLL WINDOW
-
- CASE 27
- CALL PRINTINFO(" Press Y to quit or N to continue. Press ENTER to accept..")
- ANS$ = "N"
- CALL GETANS("Quit (Y/N) ", "YN", ANS$, 100, 100, 112, 15, 11)
- IF ANS$ = "Y" THEN CLOSE : CLS : END
- NOREFRESH% = 1
- '---------------------------------------------------------------------------
- ' THE ENTER KEY CAUSED THE EXIT ---- AN ENTRY WAS SELECTED.
- ' USING MULTINPT THE RECORD COULB BE EDITED HERE.
-
- CASE 13
- IF ONLAST% = 1 THEN ' SET FILE POINTER TO THE
- FILEPOINTER = FILEPOINTER - ENTRIES% + 1 ' 1ST RECORD IN WINDOW.
- ONLAST% = 0
- END IF
- '( SELECTED RECORD = FILEPOINTER + RTRN% - 1 )
-
- CALL PRINTINFO(" Press any key to continue.......... ")
- CALL GETANS("Selection was record number:" + STR$(FILEPOINTER + RTRN% - 1), "", "", 8, 100, 15, 0, 11)
- NOREFRESH% = 1
- '---------------------------------------------------------------------------
- ' THE HOME KEY CAUSED THE EXIT
-
- CASE 30
- FC% = 1 ' START WITH 1ST CHARACTER IN 1ST COLUMN
- FILEPOINTER = 1 ' START AT RECORD 1
- RTRN% = 1 ' SCROLL BAR ON 1ST RECORD IN SCROLL WINDOW.
- GOSUB GETRECORDS ' FILL A$() WITH THE RECORDS
-
- '---------------------------------------------------------------------------
- ' THE END KEY CAUSED THE EXIT
-
- CASE 35
- FC% = 1 ' 1ST CHARACTER IN 1ST COLUMN
- FILEPOINTER = MAXENTRIES - ROWS% + 1 ' LAST "ROWS%" OF RECORDS
- IF FILEPOINTER < 1 THEN FILEPOINTER = 1 ' ADJUST IF < 1
- GOSUB GETRECORDS ' GET RECORDS TO FILL WINDOW
- RTRN% = ENTRIES% ' SCROLL BAR ON LAST RECORD
-
- '---------------------------------------------------------------------------
- ' THE F1 KEY ( FIND ) CAUSED THE EXIT
-
- CASE 1
- DO
- CALL DOSOUND
- RTRN$ = ""
- CALL PRINTINFO(" Input a record number. Press ENTER to accept or ESC to abort.")
- CALL INPTWIND(" FIND RECORD NUMBER ( 1 TO" + STR$(MAXENTRIES) + " ) ", "0", 100, 100, 3, 112, 112, RTRN$, RKEY%, 2, 111)
- REC = VAL(RTRN$)
- ' CHECK FOR PROPER RANGE FOR INPUT
- LOOP WHILE (REC < 1 OR REC > MAXENTRIES) AND RKEY% <> 27
-
- CALL RSTRINPT(1) ' RESTORE INPUT WINDOW.
- IF RKEY% = 27 THEN GOTO MAKESCRL ' ESC WAS PRESSED.
-
- GOTREC:
- IF ONLAST% = 1 THEN ' FILE POINTER TO
- FILEPOINTER = FILEPOINTER - ENTRIES% + 1 ' 1ST RECORD IN WINDOW.
- ONLAST% = 0
- END IF
-
- FC% = 1 ' 1ST CHARACTER IN 1ST COLUMN.
- OLDREC = FILEPOINTER ' SAVE THE OLD FILEPOINTER.
- FILEPOINTER = REC ' SET FILEPOINTER TO ENTERED
- ' RECORD.
-
- IF REC <= ROWS% THEN ' RECORD = 1 TO ROWS%
- RTRN% = REC ' SCROLL BAR ON ENTERED RECORD
- FILEPOINTER = 1 ' 1ST RECORD = 1ST WIND. ENTRY
- ELSEIF REC > MAXENTRIES - ROWS% THEN ' RECORD = MAXENTRIES - ROWS%
- RTRN% = ROWS% - (MAXENTRIES - REC) ' TO MAXENTRIES.
- FILEPOINTER = MAXENTRIES - ROWS% + 1 ' JUST LIKE "END".
- ELSEIF REC >= OLDREC AND REC <= OLDREC + ROWS% - 1 THEN
- FILEPOINTER = OLDREC ' RECORD IN PRESENT WINDOW
- RTRN% = (REC - OLDREC + 1)
- ELSE ' RECORD = ALL OTHERS.
- RTRN% = 1 ' SCROLL BAR ON 1ST WIND ENTRY.
- FILEPOINTER = REC ' ENTRERED RECORD 1ST IN WIND.
- END IF
- GOSUB GETRECORDS ' GO GET CORRECT RECORDS
-
- ' ---------------------------------------------------------------------------
- ' SCRLWIND EXIT WAS CAUSED BY ATTEMPT TO MOVE PAST THE END OF
- ' THE SCROLL WINDOW ( A$(ENTRIES%) ). PROGRAM ALSO MOVES HERE IF
- ' Mark (+) /Un-mark (-) WAS PRESSED ON THE LAST ENTRY IN THE SCROLL
- ' WINDOW.
-
- CASE 12, 19 ' SCROLLING PAST THE END OF
- ' LIST IN THE SCROLL WINDOW.
- DOWN:
-
- IF ONLAST% = 0 THEN ' IF FILE POINTER IS ON
- FILEPOINTER = FILEPOINTER + ENTRIES% - 1 ' FIRST ENTRY IN THE SCROLL
- ONLAST% = 1 ' WINDOW MOVE IT TO THE
- END IF ' LAST ENTRY.
-
- IF LI% = ENTRIES% AND FILEPOINTER + 1 > MAXENTRIES THEN ' END OF FILE?
- RTRN% = ENTRIES%
- CALL DOSOUND ' MAKE BEEP AND DO NOTHING
- NOREFRESH% = 1
- ELSE ' NOT END OF FILE
- IF ENTRIES% = ROWS% THEN
- FILEPOINTER = FILEPOINTER + 1 ' INCREMENT FILEPOINTER
- IF RK% = 12 THEN ' PAGE DOWN
- IF FILEPOINTER + ROWS% - 1 > MAXENTRIES THEN ' END OF FILE?
- FILEPOINTER = MAXENTRIES - ROWS% + 1 ' JUST LIKE "END"
- END IF
- GOSUB GETRECORDS ' PUT RECORDS IN A$()
- ELSE ' MUST BE DOWN ARROW.
- FOR X% = 1 TO ROWS% - 1 ' SHIFT SCROLL ENTRIES
- SWAP A$(X%), A$(X% + 1) ' UP ONE.
- NEXT
- GET 1, FILEPOINTER, RECORD ' GET NEW LAST ENTRY.
- A$(ENTRIES%) = RECORD.NAM + RECORD.ADD1 + RECORD.CITY + RECORD.STATE + RECORD.ZIP
-
- 'FIX STRING REPRESENTING "MARKED" ENTRIES
- SCROLLMARK$ = RIGHT$(SCROLLMARK$, ENTRIES% - 1) + RECORD.MARK
- END IF
- END IF
- END IF
- RTRN% = ENTRIES%
- '----------------------------------------------------------------------------
- ' SCRLWIND EXIT WAS CAUSED BY AN ATTEMPT TO MOVE BEFORE THE FIRST
- ' ENTRY ( A$(START) ) IN THE SCROLL WINDOW.
-
- CASE 11, 16 ' SCROLLING BEFORE START OF
- ' LIST IN SCROLL WINDOW
-
- IF ONLAST% = 1 THEN ' IF FILEPOINTER = LAST SCROLL
- FILEPOINTER = FILEPOINTER - ENTRIES% + 1 ' WINDOW ENTRY SET TO FIRST.
- ONLAST% = 0
- END IF
-
- IF LI% = 1 AND FILEPOINTER = 1 THEN ' FIRST RECORD IN FIRST ROW.
- CALL DOSOUND ' CAN'T MOVE UP.
- NOREFRESH% = 1
- ELSE
- IF ENTRIES% = ROWS% THEN
- IF RK% = 11 THEN ' MUST BE PAGE UP.
- FILEPOINTER = FILEPOINTER - ROWS% ' MOVE UP ONE PAGE OF "RECORDS"
- IF FILEPOINTER < 1 THEN FILEPOINTER = 1 ' BEFORE FIRST RECORD?
- GOSUB GETRECORDS ' PUT RECORDS IN A$()
- ELSE ' MUST BE UP ARROW.
- FILEPOINTER = FILEPOINTER - 1 ' MOVE POINTER UP ONE IN FILE.
- FOR X% = ROWS% TO 2 STEP -1 ' SHIFT RECORDS IF SCROLL LIST.
- SWAP A$(X%), A$(X% - 1)
- NEXT
- GET 1, FILEPOINTER, RECORD ' GET A NEW FIRST RECORD
- A$(1) = RECORD.NAM + RECORD.ADD1 + RECORD.CITY + RECORD.STATE + RECORD.ZIP
-
- 'FIX STRING REPRESENTING "MARKED" ENTRIES
- SCROLLMARK$ = RECORD.MARK + LEFT$(SCROLLMARK$, ENTRIES% - 1)
- END IF
- END IF
- END IF
- LIN% = 1: RTRN% = 1
-
- END SELECT
- GOTO MAKESCRL
-
- '---------------------------------------------------------------------------
- ' READ RECORDS FROM THE FILE. READ UNTIL MAXIMUM NUMBER OF ENTRIES
- ' IN THE SCROLL WINDOWS ( ROWS% ) IS REACHED, OR UNTIL THE END
- ' OF FILE ( MAXENTRIES% ) IS REACHED.
-
- GETRECORDS:
- SCROLLMARK$ = SPACE$(ROWS%) ' MAKE STRING TO REPRESENT "MARKED" ENTRIES.
- ENTRIES% = 0 ' ENTRIES IN SCROLL WINDOW.
- WHILE ENTRIES% < ROWS% AND FILEPOINTER <= MAXENTRIES
- ENTRIES% = ENTRIES% + 1 ' INCREMENT ENTRIES.
- GET 1, FILEPOINTER, RECORD ' GET RECORD FROM THE FILE
- FILEPOINTER = FILEPOINTER + 1 ' MOVE TO NEXT RECORD
-
- ' MAKE AN ENTRY IN THE SCROLL WINDOW
- A$(ENTRIES%) = RECORD.NAM + RECORD.ADD1 + RECORD.CITY + RECORD.STATE + RECORD.ZIP
-
- ' SET STRING REPRESENTING "MARKED" ENTRIES
- MID$(SCROLLMARK$, ENTRIES%, 1) = RECORD.MARK
- WEND
- FILEPOINTER = FILEPOINTER - 1 ' ADJUST TO LAST RECORD IN SCROLL WINDOW.
- ONLAST% = 1 ' SET FLAG TO SHOW FILE POINTER IS
- ' ON LAST RECORD IN SCROLL WINDOW.
- SCROLLMARK$ = LEFT$(SCROLLMARK$, ENTRIES%) ' MAKE IT THE CORRECT LENGTH
- ' REQUIRED WHEN ENTRIES% < ROWS%
- RETURN
- '----------------------------------------------------------------------------
-
-