Leemi
Mon Aug 29 08:58:07 CDT 2005
Hi Rob:
To add a to Anders' post, he is an alternative method to use that bypasses
the usage of general fields.
Visual FoxPro is at the mercy of external applications for the display of
items embedded in general fields. This would be true no matter what type of
file it is (Excel Worksheet, bitmap, jpg, etc). Going forward, your app
needs to have a more encapsulated way of dealing with this. Following is
just such a method.
REPORT
---------------
By using the MEMO BINARY field type and a UDF(), we can store .JPG files in
a table field yet when the report runs have them read from DISK. Here's how:
(1) Create a table or cursor with a structure like this (plus any added
fields as necessary)
FileName C (150)
MemBin MEMO(BINARY)
The command would be CREATE TABLE GENDBF (FileName c(150), MemoBin M
NOCPTRANS)
(2) Append .JPGs file into the MEMO(Binary) field using FILETOSTR() and set
the filename field accordingly. For instance:
INSERT INTO CURSORNAME VALUES("ToothBrush.JPG", FILETOSTR(<PathToFile>))
(3) The FoxPro report will still need an OLEBOUND control on it to print
pictures, but instead of pointing the OLEBOUND to a general field, point it
FILE and use this as the expression:
MYUDF(FileName, MemoBin)
Where MyUDF is in some program made available via SET PROC and reads thusly:
PROCEDURE MYUDF(lpFileName, lpMemoBinFld)
LOCAL lcTemp as String
lcTemp = ADDBS(SYS(2023)) + "JPGTEMP\"
IF !DIRECTORY(lcTemp)
MD (lcTemp)
ENDIF
SET SAFETY OFF
STRTOFILE(lpMemoBinFld, lcTemp + lpFileName)
SET SAFETY ON
RETURN lcTemp + lpFileName
(4) Finally, preview/print the report. You may also want to fire some lines
like this to clean up afterward:
ERASE ADDBS(SYS(2023)) + "JPGTEMP\*.jpg"
RD ADDBS(SYS(2023)) + "JPGTEMP"
The .PRG uses the code above and the .JPGs that come with W2K, so it should
run on that OS with no problem.
----------------------------------------------------------------------------
---
FORM
----------
Let's assume we have the table created earlier:
FileName C (150)
MemBin MEMO(BINARY)
This form will display images from it:
PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.Show
RETURN
**************************************************
DEFINE CLASS form1 AS form
Top = 71
Left = 48
Height = 310
Width = 504
Caption = "Fox Image Demo"
Name = "Form1"
ADD OBJECT image1 AS image WITH ;
Height = 296, ;
Left = 3, ;
Top = 8, ;
Width = 381, ;
Name = "Image1"
ADD OBJECT cmdPrevious AS commandbutton WITH ;
Top = 27, ;
Left = 422, ;
Height = 27, ;
Width = 24, ;
Caption = "<", ;
Name = "cmdPrevious"
ADD OBJECT cmdNext AS commandbutton WITH ;
Top = 27, ;
Left = 446, ;
Height = 27, ;
Width = 24, ;
Caption = ">", ;
Name = "cmdNext"
ADD OBJECT cmdQuit AS commandbutton WITH ;
Top = 72, ;
Left = 405, ;
Height = 27, ;
Width = 84, ;
Caption = "Quit", ;
Name = "cmdQuit"
PROCEDURE getimage
LPARAMETERS lpFileName, lpMemoBinFld
LOCAL lcTemp AS STRING
lcTemp = ADDBS(SYS(2023)) + "JPGTEMP\"
IF !DIRECTORY(lcTemp)
MD (lcTemp)
ENDIF
SET SAFETY OFF
STRTOFILE(lpMemoBinFld, lcTemp + lpFileName)
SET SAFETY ON
RETURN lcTemp + lpFileName
ENDPROC
PROCEDURE Destroy
USE IN SELECT("PICTURES")
ERASE ADDBS(SYS(2023)) + "JPGTEMP\*.jpg"
RD ADDBS(SYS(2023)) + "JPGTEMP"
ENDPROC
PROCEDURE Load
CD JUSTPATH(SUBSTR(SYS(16),AT(' ',SYS(16),2)))
USE PICTURES
ENDPROC
PROCEDURE Init
THISFORM.Image1.Picture = ;
THIS.GetImage(Pictures.FileName, Pictures.MemBin)
ENDPROC
PROCEDURE cmdPrevious.Click
IF RECNO() <> 1
SKIP -1
THISFORM.Image1.Picture = ;
THISFORM.GetImage(Pictures.FileName, Pictures.MemBin)
THISFORM.REFRESH
ENDIF
ENDPROC
PROCEDURE cmdNext.Click
IF RECCOUNT() <> RECNO() AND !EOF()
SKIP
THISFORM.Image1.Picture = ;
THISFORM.GetImage(Pictures.FileName, Pictures.MemBin)
THISFORM.REFRESH
ENDIF
ENDPROC
PROCEDURE cmdQuit.Click
THISFORM.RELEASE
ENDPROC
ENDDEFINE
**************************************************
I hope this helps.
This posting is provided "AS IS" with no warranties, and confers no rights.
Sincerely,
Microsoft FoxPro Technical Support
Lee Mitchell
*-- VFP9 HAS ARRIVED!! --*
Read about all the new features of VFP9 here:
http://msdn.microsoft.com/vfoxpro/
*--Purchase VFP 9.0 here:
http://www.microsoft.com/PRODUCTS/info/product.aspx?view=22&pcid=54787e64-52
69-4500-8bf2-3f06689f4ab3&type=ovr
Keep an eye on the product lifecycle for Visual FoxPro here:
http://support.microsoft.com/gp/lifeselectindex
- VFP5 Mainstream Support retired June 30th, 2003
- VFP6 Mainstream Support retired Sept. 30th, 2003
>General fields assume the client will have a copy of the same application
to
>display the bitmap, Excel sheet or whatever it is you put into the General
>field as was used on the machine that inserted the record. That's why
>General fields have been abandoned as impractical.
>-Anders
>Den 05-08-28 13.14, i artikeln 5383BDC7B0321@DBMonster.com, skrev "Rob N
via
>DBMonster.com" <forum@DBMonster.com>:
> We have one machine in the office running XP that displays the following
> error code when a bitmap is included in the field... OLE error 0x80040154
> class not registered. The machine will not display the bmp files in visual
> foxpro 8. the other 6 machines in the office do not have this problem. The
> app is accessed from a networked server. Could this problem be
> related to activex control? and if so which ocx file controls displaying
bmp
> files in a field? ROB
>