| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 569 人关注过本帖
标题:在表格BeforeRowColChange中写代码,造成表单卡死的现象?
取消只看楼主 加入收藏
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
结帖率:98.98%
收藏
已结贴  问题点数:10 回复次数:9 
在表格BeforeRowColChange中写代码,造成表单卡死的现象?
我在表格GRI的BeforeRowColChange 事件,写上以下代码,目的就是按回车或者输入完后自动调到下1行的,不是向有移动。因为我表格写的是数字

LPARAMETERS nColIndex
*IF THISFORM.OPT1.Value=1  &&修改该数据时,选择列操作
*  If (Lastkey()>=48 AND Lastkey()<=57) OR Lastkey()=13  &&最后按0~9或者回车后下移
*      Nodefault
*      Keyboard "{DNARROW}"
*  ENDIF
*ENDIF
同样的上面代码,数据从本地VFP表上取的数据,就不会卡死,
但从SQL2000上取数据,就会卡死。
出现卡死,有2个地方,1个就是进入表单的时候,就卡死,,如果进入表单的时候,不卡死,那就在查询数据的按钮的时候,卡死。
卡死的时候,要鼠标乱切换界面,动几下就好了。。。
我找这个问题,找了1天,最后,发现,把这段去掉,问题就不出现了,那肯定是这个问题了。
怎么处理啊?
2015-07-23 23:50
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
难道,搞个变量?在读取完数据后,变量=.t.
LPARAMETERS nColIndex
if 变量=.T.
IF THISFORM.OPT1.Value=1  &&修改该数据时,选择列操作
  If (Lastkey()>=48 AND Lastkey()<=57) OR Lastkey()=13  &&最后按0~9或者回车后下移
      Nodefault
      Keyboard "{DNARROW}"
  ENDIF
ENDIF
ENDIF
???这样做?
2015-07-23 23:52
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
改为这样,读数据的按钮,

WAIT WINDOW NOWAIT '正在读取本月数据......'
loaddata=.f.
..............
..............
THISFORM.Grid1.RECORDSOURCE=''
THISFORM.Grid1.COLUMNCOUNT = -1
THISFORM.Grid1.RECORDSOURCE=ALIAS()
loaddata=.t.
WAIT CLEAR
MESSAGEBOX([读取本月数据完成!  ],64,[OK])

这样,也可以了。。但问题出现原因是什么????

**BeforeRowColChange 事件
LPARAMETERS nColIndex
IF THISFORM.OPT1.Value=1 AND loaddata =.t. &&修改该数据时,选择列操作
  If (Lastkey()>=48 AND Lastkey()<=57) OR Lastkey()=13  &&最后按0~9或者回车后下移
      Nodefault
      Keyboard "{DNARROW}"
  ENDIF
ENDIF
2015-07-24 00:03
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
但是,我在读数据开始时,用变量
loaddata =.f.
数据读完后,
loaddata =.t.
在BeforeRowColChange 事件中,把这个条件加进去,就不卡了

**BeforeRowColChange
LPARAMETERS nColIndex
IF THISFORM.OPT1.Value=1 AND loaddata =.t. &&修改该数据时,选择列操作
  If (Lastkey()>=48 AND Lastkey()<=57) OR Lastkey()=13  &&最后按0~9或者回车后下移
      Nodefault
      Keyboard "{DNARROW}"
  ENDIF
ENDIF
2015-07-24 15:37
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
感觉,好像是表格GRID在填充数据时,是不是自动产生回车键,导致光标不挺的上下移动?

Lastkey()>=48 AND Lastkey()<=57) OR Lastkey()=13  &&最后按0~9或者回车后下移
2015-07-24 15:40
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
我晚上把Lastkey()=13去掉,看看,程序在我家里,不在单位
2015-07-24 15:41
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
如果,我加1个变量,在读完数据后,变量才T,相当于,我在读数据的过程中,这段代码不起作业了。所以不卡了?
以前卡,可能是多次,触发这个事件BeforeRowColChange?,但奇怪的是用VFP本地表的时候,不会卡的。也就是数据从VFP上读取来的,比如
USE DATA\D1.DBF SHARE IN 0
SELECT * FROM D1 WHHERE ,,,,
以前是这个取数据的,好像没卡过

但最近我换成SQL2000取数据,就出现了。
SQLEXEC(nhandle,'select * from dd1 where .....','sql_dq')
这样取数据做GRID的数据源时,就卡了。
2015-07-24 17:14
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
我刚刚查了,
我加了个计数器,触发BeforeRowColChange,就+1
结果,发现,计数器数值很大了。
**BeforeRowColChange 事件
LPARAMETERS nColIndex
JJJ=JJJ+1
IF THISFORM.OPT1.Value=1 &&AND loaddata =.t. &&修改该数据时,选择列操作
  If (Lastkey()>=48 AND Lastkey()<=57) OR Lastkey()=13  &&最后按0~9或者回车后下移
      Nodefault
      Keyboard "{DNARROW}"
  ENDIF
ENDIF
发现JJJ的值,有时候,100W多次。。。

但如果,
IF THISFORM.OPT1.Value=1 AND loaddata =.t.
这样,JJJ的值,就只有2,
估计是 Keyboard "{DNARROW}",造成的,假触发,死循环


[ 本帖最后由 mywisdom88 于 2015-7-24 22:21 编辑 ]
2015-07-24 22:16
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
但是,见鬼的,就是,
同样的,在VFP本地VFP上取数据,JJJ=0,,,
SELECT SDB
WAIT WINDOW NOWAIT '正在读取本月数据......'

SELECT 0 AS 选择, 编号,..............
     WHERE &cWHERE ;
     FROM SDB ORDER BY 编号 ASC INTO TABLE TEMP\SDB_DJ
INDEX ON 编号 TAG 编号
SELECT SDB_DJ
THISFORM.Grid1.RECORDSOURCE=''
THISFORM.Grid1.COLUMNCOUNT = -1
THISFORM.Grid1.RECORDSOURCE=ALIAS()
这样取本地VFP数据,JJJ=0,也就是说,我在取数的过程中,这个事件,没有给触发

但我在SQL2000中取数,
TEXT TO SQL_str NOSHOW TEXTMERGE PRETEXT 4
SELECT 0 AS 选择, 编号,..............
    FROM SDB
    WHERE <<WHERE>>
ENDTEXT
SQLEXEC(nhandle,sql_str,'sql_sdb')
这样取SQL2000的数据下来,却给触发了百万次。。
2015-07-24 22:32
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
改为你说的,在LOSTFOCUS中,彻底解决了问题。
计数器,没计数了JJJ=0了。
FOR J=4 TO 21
    BINDEVENT(thisform.grid1.Columns[J].text1,"LostFocus",thisform,"MyLostFocus") &&指令绑定VFP9.0才有
ENDFOR

**MyLostFocus
JJJ=JJJ+1
IF THISFORM.OPT1.Value=1  &&修改该数据时,选择列操作
  If (Lastkey()>=48 AND Lastkey()<=57) OR Lastkey()=13  &&最后按0~9或者回车后下移
      Nodefault
      Keyboard "{DNARROW}"
  ENDIF
ENDIF
2015-07-24 22:50
快速回复:在表格BeforeRowColChange中写代码,造成表单卡死的现象?
数据加载中...
 
   



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

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