PDS(7.1) Procedures: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
{| align="right" style="max-width:25%;"
|  __TOC__
|}
QB64 was created to be compatible with Quick Basic 4.5 only as it was the most popular version. The following sub-procedures have been created to do things that were available in PDS versions of Quick Basic 7.0 and 7.1.
QB64 was created to be compatible with Quick Basic 4.5 only as it was the most popular version. The following sub-procedures have been created to do things that were available in PDS versions of Quick Basic 7.0 and 7.1.


Line 5: Line 8:


=== MKC$ ===
=== MKC$ ===
PDS could use the CURRENCY variable type and had the MKC$ function to convert those values to '''8 byte''' [[ASCII]] string values. QB64 can convert [[_FLOAT]] currency amounts to strings using [[_MK$]] with [[_INTEGER64]] values:
:* PDS could use the CURRENCY variable type and had the MKC$ function to convert those values to '''8 byte''' [[ASCII]] string values.
:* QB64 can convert [[_FLOAT]] currency amounts to strings using [[_MK$]] with [[_INTEGER64]] values:
{{CodeStart}}
{{CodeStart}}
{{Cl|SCREEN}} 12
{{Cl|SCREEN}} 12
{{Cl|DIM}} value {{Cl|AS}} {{Cl|_FLOAT}}
{{Cl|DIM}} value {{Cl|AS}} {{Cl|_FLOAT}}
value = 12345678901234.6789 '   any currency value with up to 4 decimal point places
value = 12345678901234.6789 'any currency value with up to 4 decimal point places
 
{{Cl|_PRINTSTRING}} (1, 50), "[" + MKC$(value) + "]" ' show ASCII string value


{{Cl|_PRINTSTRING}} (1, 50), "[" + MKC$(value) + "]" 'show ASCII string value
{{Cl|END}}
{{Cl|END}}


{{Cl|FUNCTION}} MKC$ (CurrVal {{Cl|AS}} {{Cl|_FLOAT}}) 'converts currency amount to PDS or VB currency string
'-----------------------------------------------
'converts currency amount to PDS currency string
'-----------------------------------------------
{{Cl|FUNCTION}} MKC$ (CurrVal {{Cl|AS}} {{Cl|_FLOAT}})
     {{Cl|DIM}} CVal {{Cl|AS}} {{Cl|_INTEGER64}}
     {{Cl|DIM}} CVal {{Cl|AS}} {{Cl|_INTEGER64}}
     CVal = CurrVal * 10000 '        multiply float value by 10 thousand
     CVal = CurrVal * 10000
     MKC = {{Cl|_MK$}}({{Cl|_INTEGER64}}, CVal)
     MKC = {{Cl|_MK$}}({{Cl|_INTEGER64}}, CVal)
{{Cl|END FUNCTION}}
{{Cl|END FUNCTION}}
{{CodeEnd}}
{{CodeEnd}}
: ''Note:'' The [[_FLOAT]] currency amount must be multiplied by 10000 before it is converted to the [[ASCII]] string value.
;Note:The [[_FLOAT]] currency amount must be multiplied by 10000 before it is converted to the [[ASCII]] string value.


=== CVC ===
=== CVC ===
PDS also had the CVC function to convert MKC$ currency string values back to currency amounts. QB64 can use [[_CV]] with [[_INTEGER64]] to convert those '''8 byte''' values back to [[_FLOAT]] currency values. The procedure gets the currency string from a file:
:* PDS also had the CVC function to convert MKC$ currency string values back to currency amounts.
:* QB64 can use [[_CV]] with [[_INTEGER64]] to convert those '''8 byte''' values back to [[_FLOAT]] currency values.
:** In this example the procedure gets the currency string from a file.
{{CodeStart}}
{{CodeStart}}
{{Cl|SCREEN}} 12
{{Cl|SCREEN}} 12
{{Cl|DIM}} currency {{Cl|AS}} {{Cl|STRING}} * 8
{{Cl|DIM}} currency {{Cl|AS}} {{Cl|STRING}} * 8
{{Cl|OPEN}} "Currency.bin" {{Cl|FOR (file statement)|FOR}} {{Cl|BINARY}} {{Cl|AS}} #1 'binary file with MKC$ values created by PDS or VB
{{Cl|OPEN}} "Currency.bin" {{Cl|FOR (file statement)|FOR}} {{Cl|BINARY}} {{Cl|AS}} #1 'binary file with MKC$ values created by PDS
{{Cl|GET}} #1, , currency
{{Cl|GET}} #1, , currency
{{Cl|CLOSE}} #1
{{Cl|CLOSE}} #1


{{Cl|_PRINTSTRING}} (1, 10), "[" + currency + "]" 'show ASCII string value from file
{{Cl|_PRINTSTRING}} (1, 10), "[" + currency + "]" 'show ASCII string value from file
{{Cl|_PRINTSTRING}} (1, 30), {{Cl|STR$}}(CVC##(currency))
{{Cl|_PRINTSTRING}} (1, 30), {{Cl|STR$}}(CVC##(currency))
{{Cl|END}}
{{Cl|END}}


{{Cl|FUNCTION}} CVC## (CurrStr {{Cl|AS}} {{Cl|STRING}}) 'converts currency string to a {{Cl|_FLOAT}} currency amount
'-----------------------------------------------------------
'converts currency string to a {{Cl|_FLOAT}} currency amount
'-----------------------------------------------------------
{{Cl|FUNCTION}} CVC## (CurrStr {{Cl|AS}} {{Cl|STRING}})
     {{Cl|DIM}} CV {{Cl|AS}} {{Cl|_INTEGER64}}
     {{Cl|DIM}} CV {{Cl|AS}} {{Cl|_INTEGER64}}
     CV = {{Cl|_CV}}({{Cl|_INTEGER64}}, CurrStr)
     CV = {{Cl|_CV}}({{Cl|_INTEGER64}}, CurrStr)
     CVC = CV / 10000 '                  divide by 10 thousand
     CVC = CV / 10000
{{Cl|END FUNCTION}}
{{Cl|END FUNCTION}}
{{CodeEnd}}
{{CodeEnd}}
: ''Note:'' The [[_FLOAT]] currency amount must be divided by 10000 to create up to 4 decimal point places.
;Note:The [[_FLOAT]] currency amount must be divided by 10000 to create up to 4 decimal point places.


=== PUT ===
=== PUT ===
Currency values can be [[PUT]] directly into [[BINARY]] or [[RANDOM]] files using an [[_INTEGER64]] variable value.
:* Currency values can be [[PUT]] directly into [[BINARY]] or [[RANDOM]] files using an [[_INTEGER64]] variable value.
 
:** Remember to multiply the currency value by 10000 before putting to file.
{{CodeStart}}
{{CodeStart}}
{{Cl|DIM}} curr {{Cl|AS}} {{Cl|_INTEGER64}}, currency {{Cl|AS}} {{Cl|_FLOAT}}
{{Cl|DIM}} curr {{Cl|AS}} {{Cl|_INTEGER64}}, currency {{Cl|AS}} {{Cl|_FLOAT}}


currency = 9876.543
currency = 9876.543
curr = currency * 10000 ' multiply currency value by 10000
curr = currency * 10000 'multiply currency value


{{Cl|OPEN}} "currency.bin" {{Cl|FOR (file statement)|FOR}} {{Cl|BINARY}} {{Cl|AS}} #1 ' a binary file to hold PDS currency values
{{Cl|OPEN}} "currency.bin" {{Cl|FOR (file statement)|FOR}} {{Cl|BINARY}} {{Cl|AS}} #1 'a binary file to hold PDS currency values
{{Cl|PUT}} #1, , curr
{{Cl|PUT}} #1, , curr
{{Cl|CLOSE}} #1
{{Cl|CLOSE}} #1
{{Cl|END}}
{{Cl|END}}
{{CodeEnd}}
{{CodeEnd}}


=== GET ===
=== GET ===
When currency values are [[PUT]] directly into a [[BINARY]] or [[RANDOM]] file, [[_INTEGER64]] can [[GET]] them directly. Then divide by 10 ^ 4:
:* When currency values are [[PUT]] directly into a [[BINARY]] or [[RANDOM]] file, [[_INTEGER64]] can [[GET]] them directly.
:** Remember to divide the currency value by 10000 after getting from file.
{{CodeStart}}
{{CodeStart}}
{{Cl|DIM}} curr {{Cl|AS}} {{Cl|_INTEGER64}}, currency {{Cl|AS}} {{Cl|_FLOAT}}
{{Cl|DIM}} curr {{Cl|AS}} {{Cl|_INTEGER64}}, currency {{Cl|AS}} {{Cl|_FLOAT}}
{{Cl|OPEN}} "currency.bin" {{Cl|FOR (file statement)|FOR}} {{Cl|BINARY}} {{Cl|AS}} #1 ' any binary file holding PDS currency values
{{Cl|OPEN}} "currency.bin" {{Cl|FOR (file statement)|FOR}} {{Cl|BINARY}} {{Cl|AS}} #1 'any binary file holding PDS currency values
{{Cl|GET}} #1, , curr
{{Cl|GET}} #1, , curr
{{Cl|CLOSE}} #1
{{Cl|CLOSE}} #1
Line 73: Line 82:


{{Cl|PRINT}} currency
{{Cl|PRINT}} currency
{{Cl|END}}
{{Cl|END}}
{{CodeEnd}}
{{CodeEnd}}
: ''Note:'' The currency value can be any [[SINGLE]], [[DOUBLE]] or [[_FLOAT]] floating decimal point value that will hold the range of values.
;Note:The currency value can be any [[SINGLE]], [[DOUBLE]] or [[_FLOAT]] floating decimal point value that will hold the range of values.
 


<p style="text-align: center">([[#toc|Return to Table of Contents]])</p>
<p style="text-align: center">([[#top|Return to Table of Contents]])</p>




== DIR$ ==
== DIR$ ==
''Not to be confused with QB64's [[_DIR$]] function.''
;Attention:Not to be confused with QB64's [[_DIR$]] function.


This PDS(7.1) '''derived DIR$ function''' returns a filename or a list when more than one exist. The file spec can use a path and/or wildcards.
:* This PDS(7.1) '''derived DIR$ function''' returns a filename or a list when more than one exist.
:* The file specification (''spec$'') can use a path and/or wildcards.
{{CodeStart}}
{{CodeStart}}
{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} 2
{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} 2
Line 100: Line 108:
     {{Cl|END IF}}
     {{Cl|END IF}}
{{Cl|NEXT}}
{{Cl|NEXT}}
{{Cl|END}}
{{Cl|END}}


Line 127: Line 134:
     DIR$ = DirList$(Index%)
     DIR$ = DirList$(Index%)
{{Cl|END FUNCTION}}
{{Cl|END FUNCTION}}
{{CodeEnd}} {{small|Code by Ted Weissgerber}}
{{CodeEnd}}
:''Explanation:'' The function will verify that a file exists (even if it is empty) by returning it's name or it returns an empty string if no file exists. It can return a list of file names by using an empty string parameter("") after sending a wildcard spec to get the first file name. The number of file names found is returned by using the SHARED variable, '''DIRCount%'''. Unlike the PDS DIR$ function, '''it MUST use an empty string parameter until QB64 supports optional parameters!''' The function does NOT delete empty files.
{{small|Code by Ted Weissgerber}}
 
{{PreStart}}
 
'''Explanation'''
<p style="text-align: center">([[#toc|Return to Table of Contents]])</p>
  The function will verify that a file exists (even if it is
 
  empty) by returning it's name or it returns an empty string
  if no file exists. It can return a list of file names by using
  an empty string parameter("") after sending a wildcard spec to
  get the first file name. The number of file names found is
  returned by using the SHARED variable, '''DIRCount%'''. Unlike
  the PDS DIR$ function, '''it MUST use an empty string parameter
  until QB64 supports optional parameters!''' The function does
  NOT delete empty files.
{{PreEnd}}


{{PageSeeAlso}}
<p style="text-align: center">([[#top|Return to Table of Contents]])</p>
* [[VB Procedures]]




{{PageNavigation}}
{{PageNavigation}}

Revision as of 18:04, 29 January 2023

QB64 was created to be compatible with Quick Basic 4.5 only as it was the most popular version. The following sub-procedures have been created to do things that were available in PDS versions of Quick Basic 7.0 and 7.1.


CURRENCY

MKC$

  • PDS could use the CURRENCY variable type and had the MKC$ function to convert those values to 8 byte ASCII string values.
  • QB64 can convert _FLOAT currency amounts to strings using _MK$ with _INTEGER64 values:
SCREEN 12
DIM value AS _FLOAT
value = 12345678901234.6789 'any currency value with up to 4 decimal point places

_PRINTSTRING (1, 50), "[" + MKC$(value) + "]" 'show ASCII string value
END

'-----------------------------------------------
'converts currency amount to PDS currency string
'-----------------------------------------------
FUNCTION MKC$ (CurrVal AS _FLOAT)
    DIM CVal AS _INTEGER64
    CVal = CurrVal * 10000
    MKC = _MK$(_INTEGER64, CVal)
END FUNCTION
Note
The _FLOAT currency amount must be multiplied by 10000 before it is converted to the ASCII string value.

CVC

  • PDS also had the CVC function to convert MKC$ currency string values back to currency amounts.
  • QB64 can use _CV with _INTEGER64 to convert those 8 byte values back to _FLOAT currency values.
    • In this example the procedure gets the currency string from a file.
SCREEN 12
DIM currency AS STRING * 8
OPEN "Currency.bin" FOR BINARY AS #1 'binary file with MKC$ values created by PDS
GET #1, , currency
CLOSE #1

_PRINTSTRING (1, 10), "[" + currency + "]" 'show ASCII string value from file
_PRINTSTRING (1, 30), STR$(CVC##(currency))
END

'-----------------------------------------------------------
'converts currency string to a _FLOAT currency amount
'-----------------------------------------------------------
FUNCTION CVC## (CurrStr AS STRING)
    DIM CV AS _INTEGER64
    CV = _CV(_INTEGER64, CurrStr)
    CVC = CV / 10000
END FUNCTION
Note
The _FLOAT currency amount must be divided by 10000 to create up to 4 decimal point places.

PUT

  • Currency values can be PUT directly into BINARY or RANDOM files using an _INTEGER64 variable value.
    • Remember to multiply the currency value by 10000 before putting to file.
DIM curr AS _INTEGER64, currency AS _FLOAT

currency = 9876.543
curr = currency * 10000 'multiply currency value

OPEN "currency.bin" FOR BINARY AS #1 'a binary file to hold PDS currency values
PUT #1, , curr
CLOSE #1
END

GET

  • When currency values are PUT directly into a BINARY or RANDOM file, _INTEGER64 can GET them directly.
    • Remember to divide the currency value by 10000 after getting from file.
DIM curr AS _INTEGER64, currency AS _FLOAT
OPEN "currency.bin" FOR BINARY AS #1 'any binary file holding PDS currency values
GET #1, , curr
CLOSE #1

currency = curr / 10000 ' use any floating decimal point type within currency range

PRINT currency
END
Note
The currency value can be any SINGLE, DOUBLE or _FLOAT floating decimal point value that will hold the range of values.

(Return to Table of Contents)


DIR$

Attention
Not to be confused with QB64's _DIR$ function.
  • This PDS(7.1) derived DIR$ function returns a filename or a list when more than one exist.
  • The file specification (spec$) can use a path and/or wildcards.
FOR i = 1 TO 2
    PRINT
    LINE INPUT "Enter a file spec: ", spec$
    file$ = DIR$(spec$) 'use a file spec ONCE to find the last file name listed
    PRINT DIRCount%, file$, 'function can return the file count using SHARED variable
    IF DIRCount% > 1 THEN
        DO
            K$ = INPUT$(1)
            file$ = DIR$("") 'use an empty string parameter to return a list of files!
            PRINT file$,
        LOOP UNTIL LEN(file$) = 0 'file list ends with an empty string
    END IF
NEXT
END

FUNCTION DIR$ (spec$)
    CONST TmpFile$ = "DIR$INF0.INF", ListMAX% = 500 'change maximum to suit your needs
    SHARED DIRCount% 'returns file count if desired. MAY conflict with user's existing code
    STATIC Ready%, Index%, DirList$()
    IF NOT Ready% THEN REDIM DirList$(ListMAX%): Ready% = -1 'DIM array first use
    IF spec$ > "" THEN 'get file names when a spec is given
        SHELL _HIDE "DIR " + spec$ + " /b > " + TmpFile$
        Index% = 0: DirList$(Index%) = "": ff% = FREEFILE
        OPEN TmpFile$ FOR APPEND AS #ff%
        size& = LOF(ff%)
        CLOSE #ff%
        IF size& = 0 THEN KILL TmpFile$: EXIT FUNCTION
        OPEN TmpFile$ FOR INPUT AS #ff%
        DO WHILE NOT EOF(ff%) AND Index% < ListMAX%
            Index% = Index% + 1
            LINE INPUT #ff%, DirList$(Index%)
        LOOP
        DIRCount% = Index% 'SHARED variable can return the file count
        CLOSE #ff%
        KILL TmpFile$
    ELSE IF Index% > 0 THEN Index% = Index% - 1 'no spec sends next file name
    END IF
    DIR$ = DirList$(Index%)
END FUNCTION
Code by Ted Weissgerber
Explanation
  The function will verify that a file exists (even if it is
  empty) by returning it's name or it returns an empty string
  if no file exists. It can return a list of file names by using
  an empty string parameter("") after sending a wildcard spec to
  get the first file name. The number of file names found is
  returned by using the SHARED variable, DIRCount%. Unlike
  the PDS DIR$ function, it MUST use an empty string parameter
  until QB64 supports optional parameters! The function does
  NOT delete empty files.

(Return to Table of Contents)



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link