| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 839 人关注过本帖
标题:WEXIST()在WIN7中有问题
只看楼主 加入收藏
antony521
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:170
专家分:175
注 册:2009-8-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:17 
WEXIST()在WIN7中有问题
今天做个小程序用了liuxingang28的DoForm函数,WEXIST(W_Name)始终返回F值,窗口可以重复打开.我的使用环境WIN7,VFP9.0 SP2(7423).
是不是WEXIST在WIN7中不好使,你们用怎么样?
帮助中的例子返回值是正确的
DEFINE WINDOW wScreen1 FROM 10,10 TO 20,69
DEFINE WINDOW wScreen2 FROM 1,0 TO 19,79
CLEAR
? WEXIST('wScreen1')  && 显示 .T.
STORE 'wScreen2' TO gcWinName
? WEXIST('win_name')  && 显示 .F.
? WEXIST(gcWinName)  && 显示 .T.
RELEASE WINDOWS wScreen1, wScreen2
定义窗口的方法不一样.

我就是这样调用的doform("dept"),没加其它参数.
* 运行表单--------------------------------------------------------------------------------------------------
FUNCTION DoForm(tcForm,tcVar,tcPara) && tcForm(表单文件名),tcVar(表单变量),tcPara(参数)
    LOCAL W_Name,lErr,i
    = WaitWindow('正在启动程序,请稍候……')
    W_Name = 'frm' + tcForm          && 表单窗口名
    IF !WEXIST(W_Name)               && 窗口不存在时,运行表单
        FOR i = 1 TO 5               && 尝试运行表单 5 次,约 3 秒
            lErr = .f.
            TRY
                IF TYPE('tcVar') = 'C'
                    IF TYPE('tcPara') = 'C'
                        DO FORM (tcForm) NAME (tcVar) LINKED WITH tcPara
                    ELSE
                        DO FORM (tcForm) NAME (tcVar) LINKED
                    ENDIF
                ELSE
                    IF TYPE('tcPara') = 'C'
                        DO FORM (tcForm) WITH tcPara
                    ELSE
                        DO FORM (tcForm)
                    ENDIF
                ENDIF
            CATCH TO oErr WHEN oErr.ErrorNo = 2005
                lErr = .t.          && 因表被其他用户占用,导致无法打开表单时,再重试 4 次
            ENDTRY
            IF !lErr
                EXIT                && 正常打开时,退出
            ENDIF               

            = INKEY(0.5,'H')        && 等待 0.5 秒后,再重试
        NEXT i
        IF lErr
            MESSAGEBOX('数据库中的表正在被其他用户使用,请稍后重试!',16,'提示')
        ENDIF
    ELSE
        ACTIVATE WINDOW (W_Name) TOP    && 窗口存在时,激活窗口
        IF WMINIMUM(W_Name)             && 窗口最小化时,恢复窗口大小
            ZOOM WINDOW (W_Name) NORM
        ENDIF
    ENDIF
    WAIT CLEAR
ENDFUNC

[ 本帖最后由 antony521 于 2015-2-13 16:16 编辑 ]
2015-02-13 16:11
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27162
注 册:2012-2-5
收藏
得分:4 
WEXIST(WindowName)

WindowName:指的是自定义窗口的名称

对不常用的函数,在使用前一定要认真看帮助文件,掌握其正确用法。
可能是变量引用问题造成的,WEXIST(W_Name) 改为WEXIST("&W_Name")试试

示例

doform("Screen2")
function doform(tcForm,tcVar,tcPara)
DEFINE WINDOW wScreen1 FROM 10,10 TO 20,69
DEFINE WINDOW wScreen2 FROM 1,0 TO 19,79
CLEAR
? WEXIST('wScreen1')  && 显示 .T.
*STORE 'wScreen2' TO gcWinName
gcWinName="w"+tcform
? WEXIST('win_name')  && 显示 .F.
? WEXIST("&gcWinName")  && 显示 .T.
RELEASE WINDOWS wScreen1, wScreen2

[ 本帖最后由 sdta 于 2015-2-13 16:46 编辑 ]

坚守VFP最后的阵地
2015-02-13 16:33
antony521
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:170
专家分:175
注 册:2009-8-20
收藏
得分:0 
回复 2楼 sdta
WEXIST(W_Name) 改为WEXIST("&W_Name")
仍然可以重复打开窗口.

[ 本帖最后由 antony521 于 2015-2-13 16:51 编辑 ]
2015-02-13 16:47
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27162
注 册:2012-2-5
收藏
得分:0 
改过的代码帖上来看看

[ 本帖最后由 sdta 于 2015-2-13 16:55 编辑 ]

坚守VFP最后的阵地
2015-02-13 16:51
antony521
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:170
专家分:175
注 册:2009-8-20
收藏
得分:0 
回复 4楼 sdta
上传测试文档
DoFormTest.rar (9.68 KB)

WEXIST只能测DEFINE WINDOW定义的窗口,不能测do form的窗口?
liuxingang28的函数都是他测过的,不可能是函数内部的问题。
还是调用的方法有问题。

[ 本帖最后由 antony521 于 2015-2-14 16:21 编辑 ]
2015-02-14 15:39
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27162
注 册:2012-2-5
收藏
得分:0 
认真研究帮助文件吧,
前面的回帖认真看了吧
郁闷啊

坚守VFP最后的阵地
2015-02-14 18:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
弄複雜了吧

授人以渔,不授人以鱼。
2015-02-14 19:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
爲什麽總不會用自己可以把握的手段,而要依賴不知道怎麽運用和不那麽靠譜的手段呢?取窗口名,靠的是窗口標題欄那個字符串,你保證每次啓動窗體都是那個串嗎?自己可以把握的手段,是由窗體代碼直接在磁盤上寫一個標志,啓動時檢查是否有這個標志,有就是已經啓動過了,在正常關閉窗體時把這個標志抹掉即可,這樣就算以不同的名稱啓動窗體,由於用同一段代碼檢測,比用可變的標題欄文字判斷可靠得多,也是自己可以掌握和伸縮的。這個手段的缺陷,是窗體非正常結束(比如掉電)來不及刪除標志,結果下次啓動不了,但衹要考慮到這個問題,自然也有辦法應付。

[ 本帖最后由 TonyDeng 于 2015-2-14 20:46 编辑 ]

授人以渔,不授人以鱼。
2015-02-14 20:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
一個Form,是一個對象實例,是從一個類定義中構建出來的,它的名字通過.Name屬性或Do Form Name參數給出,同一個類定義,可以構建無數個具體的對象實例Form,每個都不同名字,你靠WindowName來判斷,怎麽能可靠呢?不同名字的化身,本質上是同一窗體,除了在這個類内部判斷自己是否重複構建實例之外,你還有什麽比它自己更可靠的手段?所以,那種回避窗體重複啓動的方法,本身就是怪招,遇到不奏效的時候,一點也不奇怪,這個是明白以上原理就可以預知的結果。

授人以渔,不授人以鱼。
2015-02-14 20:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在如C++或C#那樣的語言中,利用類靜態屬性(不用寫外部磁盤文件),是很容易解決這個問題的,但vfp不是很純粹的面向對象語言,它的類結構缺少C++/C#那樣的類靜態屬性和方法,所以要繞路利用外部存儲模仿類靜態數據。這的確是它的缺陷了,本來如能持續發展,支持這種東西并不難,可惜它是停止開發了。

授人以渔,不授人以鱼。
2015-02-14 21:07
快速回复:WEXIST()在WIN7中有问题
数据加载中...
 
   



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

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