5

The LA Fox Developer Newsletter
Inserting/Retrieving (Con’t from page 4)
cBuffer = && Empty buffer right now

IReading = FALSE && We didn’t read the file successfully
&& If the resource file exists
if ( FILE( cResourceFile))
&& If the file we want to store exists
IF ( FILE( cResource))
&& If we successfully read the file
IReading = CopyFileToVar( cResource,@cBuffer
IF ( IReading)
&& Insert the content in the DBF!
INSERT INTO ( cResourceFile)
VALUES ( UPPER( cKeyword)
UPPER( LEFT( cType,3)),;
cBuffer

IRetVaI = TRUE
USE
ENDIF
ENDIF
ENDIF

RETURN C IRetVaI

The Savebltmap() function becomes somewhat sImpler to code:

FUNCTION SaveBitmap( cResourceFile,cResource,cKeyword
RETURN ( SaveFile( cResourceFile,cResource,cKeyword, “BMP”

The miracle of such implementation is that it is now also easy
to codethe SaveWave() function:

FUNCTION SaveWave
RETURN ( SaveFile( cResourceFile,cResource,cKeyword, “WAV”

the SaveCursor() function

FUNCTION SaveCursor( cResourceFile,cResource,cKeyword
RETURN ( SaveFile( cResourceFile,cResource,cKeyword, “BMP”

the Savelcon() function

FUNCTION Savel con( cResourceFile,cResource,cKeyword
RETURN ( SaveFile( cResourceFile,cResource,cKeyword, “ICO”


or the SaveDBF() function

FUNCTION SaveDBF( cResourceFile,cResource,cKeyword
RETURN ( SaveFile( cResourceFile,cResource,cKeyword, “DBF”

Here we are: saving a DBF in a DBF And what if this DBF has
an associated memo file ? That peculiarity of DBF files makes it
imperative to slightly adapt the SaveFile() function.

Linked Content

Although dozens of algorithms can be Chosen here, the one I
have retained to handle all particular cases in the SaveFile()
function itself is as follows:
April 1999
FUNCTION SaveFile( cResourceFile,cResource,cKeyword,cType
LOCAL IRetVal && Logical return of the function
LOCAL cBuffer && Internal buffer
LOCAL IReadingBuf && Successful reading of the primary file?
LOCAL cLinked && Linked content
LOCAL cLinkedExt && Extension of the linked file
LOCAL cBaseFile && Filename without extension

IRetVal = FALSE && Function is not successful by default
cBuffer = ““ && Empty buffer right now
IReadingBuf = FALSE && We didn’t read the file successfully
cLinked = ““ && Linked content
cLinkedExt = “.“ && No linked extension by default

&& If the resource file exists
IF ( FILE( cResourceFile))
&& If the file we want to store exists
IF ( FILE( cResource))
&& If we successfully read the file
IReadingBuf = CopyFileToVar( cResource,@cBuffer)
IF ( IReadingBuf)
&& Handle special cases right here
cType = UPPER( LEFT( cType,3))
IF ( cType == “BMP” .OR. cType == “DBF”)
IF(cType”BMP”)
cLińkedExt =
ELSE
cLinkedExt = “.FPT”
ENDIF
ENDIF
&& Here, I’ll use FOCUS.FLL’s FIL_split() function Ill
cBaseFile = FIL_split( cResource,1 ) +;
FIL_split( cResource,2 ) +;
FIL_split( cResource,3)
&& If we found a Inked file
IF (
FILE( cBaseFile + cLinkedExt))
CopyFileToVar( cBaseFile + cLinkedExt,@cLinked)


INSERT INTO ( cResourceFile)
VALUES ( UPPER( cKeyword),.
clype
cBuffer
cLinked)
IRetVaI TRUE
USE
ENDIF
ENDIF
ENDIF

RETURN ( IRetVal)

As one can see, I have been using FOCUS.FLL to be able to
split a filename into its basic components: drive, directory, file,
extension.


FOCUS.FLL is a dynamic linked library that can be used in
Visual FoxPro 5.0 programs. It will be extended to be used from
Visual Basic and MS-Access programs. It contains more or
less 800 functions all divided into categories (each function is
actually prefixed by a 3 letters Category and an underscore, for
example STR_TiIlNullO, where STR stands for STRings).

FOCUS.FLL is used by more than 4000 developers in the world.
Many of them play an incredible role in fine-tuning the library by
reporting suggestions, anomalies, quirks, etc. FOCUS.FLL is
not new: it exists since 1994 and has known a number of
updates. It is available from CompuServe for 4 years now.
Page 5

5