| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7705 人关注过本帖, 6 人收藏
标题:在VFP中显示图片的一个方法
取消只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏(6)
 问题点数:0 回复次数:16 
在VFP中显示图片的一个方法
附件为独立运行EXE程序,下载后将扩展名.zip删掉,有VFP9运行库即可。

test.exe.zip (2.79 MB)


程序代码:
#INCLUDE "Const.h"

CLEAR ALL
CLOSE DATABASES ALL
CLEAR 

SET SAFETY OFF 

goForm = CREATEOBJECT("C_Form")
goForm.Show
READ EVENTS

CLOSE DATABASES ALL
CLEAR ALL
RETURN 

*-----------------------------
* 建立图片数据库
*-----------------------------
FUNCTION CreateDBF() AS Boolean
    LOCAL laFiles[1,5]
    LOCAL lnIndex
    LOCAL lbSuccess
   
    lbSuccess = .F.
    IF ADIR(laFiles, "Pictures\*.*") > 0
        CREATE TABLE Pictures FREE (P01 C(20), P02 M)
        SELECT Pictures
        FOR lnIndex = 1 TO ALEN(laFiles,1)
            APPEND BLANK
            REPLACE P01 WITH PADL(lnIndex, 3, '0'), P02 WITH FILETOSTR("Pictures\" + laFiles[lnIndex,1])
        NEXT
        USE IN Pictures
        lbSuccess = .T.
    ELSE
        MESSAGEBOX("图片目录中没有文件", 64)
    ENDIF
   
    RETURN lbSuccess
   
ENDFUNC

*-----------------------------
* 主窗体
*-----------------------------
DEFINE CLASS C_Form AS my_Form
    Caption = "测试例程"
    ShowWindow = 2
   
    ADD OBJECT Grid1  AS Grid
    ADD OBJECT Image1 AS Image WITH Stretch = 1
   
    PROCEDURE Load
        USE Pictures EXCLUSIVE IN 0
    ENDPROC
   
    PROCEDURE Unload
        USE IN Pictures
    ENDPROC
   
    PROCEDURE Arrange
        WITH ThisForm.Grid1
            .Top = 5
            .Left = 5
            .Height = ThisForm.Height - .Top - 5
            .Width = 100
        ENDWITH
        WITH ThisForm.Image1
            .Top = 5
            .Left = ThisForm.Grid1.Left + ThisForm.Grid1.Width + 5
            .Height = ThisForm.Height - .Top - 5
            .Width = ThisForm.Width - .Left - 5
        ENDWITH
    ENDPROC
   
    PROCEDURE Grid1.Init
        WITH This
            .DeleteMark = .F.
            .RecordSourceType = 1
            .RecordSource = "Pictures"
            .ColumnCount = 1
            WITH .Columns(1)
                WITH .Header1
                    .Caption = "图片标题"
                    .FontBold = .T.
                    .Alignment = 2
                ENDWITH
                .ControlSource = "Pictures.P01"
                .Width = 80
            ENDWITH
        ENDWITH
    ENDPROC
   
    PROCEDURE Grid1.AfterRowColChange(tnColumn)
        WITH ThisForm.Image1
            .PictureVal = Pictures.P02
        ENDWITH
    ENDPROC
   
ENDDEFINE

*-----------------------------
* 自定义窗体类
* 备注:继承窗体必须存在Arrange方法
*-----------------------------
DEFINE CLASS my_Form AS Form
    MinWidth = 800
    MinHeight = 600
    AutoCenter = .T.
    KeyPreview = .T.

    PROCEDURE Activate
        ThisForm.Arrange
    ENDPROC
   
    PROCEDURE Resize
        ThisForm.Arrange
    ENDPROC
   
    PROCEDURE KeyPress(tnKeyCode, tnShiftAltCtrl)
        IF tnKeyCode == K_ESC
            RELEASE ThisForm
        ENDIF
    ENDPROC
   
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC 

ENDDEFINE



[ 本帖最后由 TonyDeng 于 2011-10-18 13:33 编辑 ]
搜索更多相关主题的帖子: 图片 扩展名 
2011-10-18 13:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
哦,顺便说一下,这种内嵌图片的方式,是受限于VFP数据表规模的,即数据库文件不能大于2GB。

一般来说,没必要把图片嵌在数据库中,比如上面的程序,P02不用设计为备注型字段,用普通字符型记录图片文件名就可以了(此时下面的Image控件用Picture属性而非PictureVal),这样就不会受2GB的限制(当然你的单个图片也不可能大于2GB)。备注型字段有两个缺陷,一是分出一个.FPT文件,二是如果经常增删改这个字段内容的话则.FPT文件大小会迅速膨胀。因此,这种内嵌式的设计,应该用于固定的、不会修改的图片——上面为了上传方便起见把数据库也连编到.EXE中了。

授人以渔,不授人以鱼。
2011-10-18 16:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 5楼 panpende
要用VFP9运行库的,安装过VFP9的机器就可以,不然要下载运行库。

授人以渔,不授人以鱼。
2011-10-19 09:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我说了这不是压缩文件,把.zip的扩展名删掉(改文件名就行了),那是没压缩的.EXE文件。

授人以渔,不授人以鱼。
2011-10-19 16:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 10楼 hellovfp
那个运行库总共才6M,很小的。

授人以渔,不授人以鱼。
2011-10-20 11:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
C++的基本运行库也要2M。

授人以渔,不授人以鱼。
2011-10-20 12:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实VFP9(不谈VFP6)很多功能都是直接调用API的,所以它的语言部分就在操作系统的运行库上,独特的运行库,是数据库引擎(几兆是免不了的)和一些专用的控件。在我看来,VFP9已经具备足够的可扩充机制,能应用于绝大多数的场合,基本上没有什么不可能做到的了,无论是信息、图像还是数字处理,甚至系统级的控制,它都有实现的手段。VFP做不到的,.NET也一样做不到,比如面向对象的数据库,SQL Server就没有。VFP如果要实现.NET那样细致的控制,关键是程序员自己写代码做出来,而非不可能——只要VFP提供与API的接口机制,原理上说就是没什么做不到的。

授人以渔,不授人以鱼。
2011-10-20 12:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
顺便说一下:我最近在学C#,发现它居然有跟VFP最相近的机制,如果不是VFP早在C#面世之前就存在了,还真怀疑VFP是用C#写出来的(恐怕是后者吸收了前者的思想)。难道微软搁置VFP是希望用C#取代它?

授人以渔,不授人以鱼。
2011-10-20 12:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
VFP9是使用GDI+图形接口处理图像的,这就是我这个程序可以处理最普遍的图形格式的原因(.JPG,.GIF,.PCX,.IMG,……都可以,不用OLE对象,所以不用通用字段储存图像信息,而是直接储存图像文件二进制数据)。GDIPlus.DLL,是Windows的标准配置库,它能做到的,即VFP也能做到。

授人以渔,不授人以鱼。
2011-10-20 13:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
Delphi当初是企图自创一套不依靠操作系统的运行库,所以它的运行库包裹了Windows本身的那几个内核库,才显得大,而VFP是直接使用Windows内核库的,故小。Delphi在Windows上慢,是迫不得已的,因为它自己的库再快,也扭不过操作系统的调度,一到系统底层,它就仍然要调用Windows的内核(操作系统总不会让你接管内核部分),因此是很尴尬的脱裤子放屁之举。

授人以渔,不授人以鱼。
2011-10-20 13:10
快速回复:在VFP中显示图片的一个方法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027401 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved