| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 795 人关注过本帖
标题:关于GETFILE()函数多选问题,原来人家早给咱准备好了工具
只看楼主 加入收藏
井绳
Rank: 2
等 级:论坛游民
帖 子:97
专家分:69
注 册:2010-6-29
结帖率:87.5%
收藏
 问题点数:0 回复次数:7 
关于GETFILE()函数多选问题,原来人家早给咱准备好了工具
数次遇到GETFILE()函数查找文件时需要多选的问题
大家知道:VFP本身的GETFILE()函数是不具备多选功能的

也曾在本坛查找解决方案而不得

今日翻看VFP安装文件夹时无意中看到
原来其中的C:\Program Files\VFP9\Samples\Solution\中文夹中早有解决方案
就在GetFileX.scx中
偶然发现,不敢独享
有相同需要的同学可以借鉴
搜索更多相关主题的帖子: 解决方案 文件夹 中文 
2015-12-04 19:47
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10540
专家分:42927
注 册:2014-5-20
收藏(1)
得分:0 
GetFileX.scx主要引用了_system.vcx的_comdlg类,主要通过调用API GetOpenFileName()和GetSaveFileName()实现,两个函数唯一参数是OPENFILENAME结构,OPENFILENAME结构成员有些涉及到字符串指针,VFP处理字符串指针也涉及到内存分配、读写和释放,显得有点复杂。

调用GetOpenFileName()简单示例:
程序代码:
CLEAR
? GetOpenFiles()

FUNCTION GetOpenFiles()
    LOCAL hProcHeap, lpstrFile, stOPENFILENAME, nRet

    DECLARE LONG GetProcessHeap  IN Kernel32
    DECLARE LONG HeapAlloc       IN Kernel32 LONG, LONG, LONG
    DECLARE LONG HeapFree        IN Kernel32 LONG, LONG, LONG
    DECLARE LONG GetOpenFileName IN Comdlg32 STRING@

    hProcHeap = GetProcessHeap()
    lpstrFile = HeapAlloc(hProcHeap, 8, 80*260)

    stOPENFILENAME = BINTOC(76, "4RS");
                   + REPLICATE(0h00, 24);
                   + BINTOC(lpstrFile, "4RS");
                   + BINTOC(80*260, "4RS");
                   + REPLICATE(0h00, 16);
                   + BINTOC(0x81204, "4RS");
                   + REPLICATE(0h00, 20)

    nRet = GetOpenFileName(@stOPENFILENAME)

    LOCAL i, nOffset, cFile, aFile[1]
    cFile = ""
    IF nRet > 0
        nOffset = 0
        DO WHILE !(SYS(2600, lpstrFile + nOffset, 2) == 0h0000)
            nOffset = nOffset + 1
            IF nOffset > 65536    && 64 * 1024
                nOffset = 0
                EXIT
            ENDIF
        ENDDO
        cFile = SYS(2600, lpstrFile, nOffset)
        IF ALINES(aFile, cFile, 0h00) > 1
            cFile = ""
            FOR i = 2 TO ALEN(aFile)
                cFile = cFile + 0h0D0A + aFile[1] + "\" + aFile[i]
            ENDFOR
            cFile = SUBSTR(cFile, 3)
        ENDIF
    ENDIF
    HeapFree(hProcHeap, 1, lpstrFile)
    RETURN cFile
ENDFUNC


简单的可以创建 实例:
程序代码:
CLEAR
? GetFileX()

FUNCTION GetFileX()
    LOCAL of
    of = CREATEOBJECT(")
    *of = CREATEOBJECT("1")
    of.Flags       = 0x00080204    && 0x00080000 or 0x00000200 or 0x00000004
    of.Filter      = "All|*.*|jpg|*.jpg|TXT|*.txt|PRG|*.prg|报表|*.FRX"
    of.maxFileSize = 10000 
    of.InitDir     = "C:\TEMP"
    of.FileName    = "pp.jpg"
    of.ShowOpen()       && 显示“打开”对话框 
    *of.ShowSave()       && 显示“另存为”对话框 
    *of.ShowColor()      && 显示“颜色”对话框 
    *of.ShowFont()       && 显示“字体”对话框 
    *of.ShowPrinter()    && 显示“打印”或“打印选项”对话框 
    *of.ShowHelp()       && 调用 Windows 帮助引擎 
    RETURN of.FileName
ENDFUNC


[此贴子已经被作者于2015-12-4 22:09编辑过]

收到的鲜花
  • 井绳2015-12-06 14:36 送鲜花  5朵   附言:谢谢您的指教
2015-12-04 22:07
井绳
Rank: 2
等 级:论坛游民
帖 子:97
专家分:69
注 册:2010-6-29
收藏
得分:0 
回复 2楼 吹水佬
多谢版主指教
您的办法确实比VFP给的简单多了,还省去了带着类库(差点儿打出内裤)
2015-12-06 14:41
井绳
Rank: 2
等 级:论坛游民
帖 子:97
专家分:69
注 册:2010-6-29
收藏
得分:0 
回复 2楼 吹水佬
水佬:
试用您的代码,在运行到of = CREATEOBJECT(")时,总是要求安装VFP英文版,点取消按钮后提示说需要网络资源.请问是怎么回事,如何解决?
2015-12-07 15:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
根本不需要在GetFile()函数中实现多选。很多问题其实是不现实的需求带给自己的。在ListBox中多选,比强用这种复杂的操作法更方便,不光可以在同一个文件夹中多选,甚至可以跨文件夹、跨磁盘多选。

[此贴子已经被作者于2015-12-7 15:41编辑过]


授人以渔,不授人以鱼。
2015-12-07 15:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
界面是自己设计的,ListBox可以多选,Checkbox组也可以多选,Grid也可以多选,任何一种都可以在语言本身提供的范畴内提供更好的解决办法。如果vfp附送的那些工具包很好用很成熟,它就纳入到基本框架中了,不用这么偏门另送。

授人以渔,不授人以鱼。
2015-12-07 15:46
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10540
专家分:42927
注 册:2014-5-20
收藏
得分:0 
一般情况下就喜欢用ADIR()+去处理文件名相关问题。

API的GetOpenFileName()不只是获取文件名,返回的信息含有系统文件项目管理器的内容,如系统定义的文件项目(文档、下载、音乐和图片等)、快速访问文件夹、网络等,有些内容单凭VFP本来的函数和类并不能表现出来。

总之,一切从实际出发,能解决问题就是好办法。
2015-12-07 23:58
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10540
专家分:42927
注 册:2014-5-20
收藏
得分:0 
以下是引用井绳在2015-12-7 15:10:17的发言:

水佬:
试用您的代码,在运行到of = CREATEOBJECT(")时,总是要求安装VFP英文版,点取消按钮后提示说需要网络资源.请问是怎么回事,如何解决?

是Windows提供的,检查一下系统文件有无comdlg32.ocx(或comdlg32.dll)并注册。
2015-12-08 22:00
快速回复:关于GETFILE()函数多选问题,原来人家早给咱准备好了工具
数据加载中...
 
   



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

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