主题:求助!操作符操作数类型不匹配。
greyweeds70
[专家分:0] 发布于 2010-04-05 02:42:00
这里有一个主程序和一个密码登陆界面。运行时总是提示“操作符操作数类型不匹配。”请好心人耐心帮我看一下。不胜感激!
主程序是这样的:
set talk off
clear all
* ly用于控制登录时是管理员还是来宾账户。ly=1表示管理员,0表示来宾。登录时,输入密码正确则qued=1.否则为0.qued返回来的值是1则继续执行下面代码为0退出系统。
public ly,qued
do form 登陆界面
[u]if qued=1[/u](挂起时显示的错误位置)
do form 主界面
read events
endif
登陆界面里面:
表单初始化:
[b]form1的init:[/b]
public i
i=0
ly=1
[b]登录按钮click:[/b]
if ly=1
i=i+1
thisform.text1.setfocus
use mm
if thisform.text1.value=密码
thisform.release
release i
use
qued=1
else
if i<3
messagebox("密码错,请重新输入!",0+32,"密码")
thisform.text1.value=""
thisform.text1.setfocus
else
messagebox("密码错,禁止进入系统",0+16,"密码")
thisform.release
release i
qued=0
endif
endif
else
if ly=0
thisform.release
qued=1
endif
endif
[b]组合框init:[/b]
this.value="系统管理员"
[b]interactive:[/b]
if "Guest"=allt(this.value)
use zhug1
if 账户状态=0
messagebox("此账户已禁用,请与管理员联系。",0+16,"错误信息")
this.value="系统管理员"
ly=1
thisform.text1.setfocus
thisform.text1.visible=.t.
thisform.label1.visible=.f.
else
ly=0
thisform.text1.visible=.f.
thisform.label1.visible=.f.
thisform.commandgroup1.command1.visible=.t.
thisform.commandgroup1.command1.setfocus
endif
use
else
ly=1
thisform.label1.visible=.t.
thisform.commandgroup1.command1.visible=.t.
thisform.commandgroup2.command2.visible=.t.
thisform.text1.visible=.t.
thisform.text1.setfocus
endif
当我挂起的时候。它问题出现在qued=1。可是提示错误时我登陆表单才出来,还没来得及输密码,也就是说qued的值还没有返回。它就提前报错了。这应该怎么办??
回复列表 (共11个回复)
沙发
cbl518 [专家分:57140] 发布于 2010-04-05 10:57:00
public ly,qued
do form 登陆界面
read events
if qued=1(挂起时显示的错误位置)
do form 主界面
read events
endif
板凳
sywzs [专家分:5650] 发布于 2010-04-05 13:07:00
public ly,qued &&此时的 ly 和 qued 都是逻辑型变量,并且值为假。需要加一条赋值语句。
qued = 1
3 楼
greyweeds70 [专家分:0] 发布于 2010-04-05 13:20:00
3楼。我在public ly,qued下面加了
qued = 1
但是程序就自动运行到主界面。根本就没有显示登陆界面。
这是为什么呢?
4 楼
greyweeds70 [专家分:0] 发布于 2010-04-05 13:24:00
2楼。我按你的改了。确实出现了登陆界面。可是我输入正确结果后。它就没有运行下面的主界面。就白屏什么都没有。怎么办呢?
5 楼
greyweeds70 [专家分:0] 发布于 2010-04-05 13:34:00
public ly,qued
qued = 1(这个会不会和下面那个qued=1重复了。然后就直接运行下面的了呢?)
do form 登陆界面
if qued=1
do form 主界面
read events
endif
6 楼
sywzs [专家分:5650] 发布于 2010-04-05 14:32:00
qued = 2
ly = 2
初始值设置一个判断值之外的数值。
7 楼
Ilikefox [专家分:5770] 发布于 2010-04-05 15:36:00
不多说,就事论事,最简单的方法是把登陆界面窗口作为“模式窗口”,即WindowType属性改为1-Modal。
若不采用上述最简方法,要采用1楼cbl518方式,则登录按钮click事件代码最后加一条 Clear Events。
8 楼
sywzs [专家分:5650] 发布于 2010-04-05 15:47:00
我回答的是关于“操作符操作数类型不匹配”的问题。
9 楼
cbl518 [专家分:57140] 发布于 2010-04-05 18:35:00
在你的登录表单的 Unload 事件:
Clear Events
10 楼
moz [专家分:37620] 发布于 2010-04-05 22:54:00
登录表单要使用模式表单,要有返回值。
你的例子里类型不匹配是因为没有返回值,
(因为你的表单不是模式表单,VFP没等表单运行就直接在下一行出错暂停了。)
没有初始化的变量默认为逻辑型。(如果设置为模式表单,VFP就会在登录表单位置挂起,等确认密码之后自动运行下一行)
[quote]运行一个用表单设计器创建的、编译过的表单或表单集。
DO FORM FormName | ? [NAME VarName [LINKED]] [WITH cParameterList]
[TO VarName] [NOREAD] [NOSHOW]
参数
FormName
指定要运行的表单或表单集的名称。
?
显示运行(Do)对话框,从中选择要运行的表单或表单集。
NAME VarName [LINKED]
指定一个用来引用表单或表单集的内存变量或数组元素。如果指定的内存变量不存在,Microsoft Visual FoxPro 将自动创建它。如果指定一个数组元素,则在执行 DO FORM 之前,该数组必须存在。如果指定的内存变量或数组元素已经存在,则改写原有内容。如果省略 NAME 子句,则 Visual FoxPro 创建一个与表单或表单集文件同名的对象型内存变量。包含 LINKED 可用来连接表单到相关联的内存变量,当变量超出作用域时释放表单。如果没有包含 LINKED,即使没有与表单相关联的内存变量,表单仍可以是活动的。
WITH cParameterList
指定传递到表单或表单集的参数。运行表单集时,如果表单集的 WindowType 属性设置为 无模式(0) 或 模式(1),参数就传递给表单集的 Init 方法。如果表单集的 WindowType 属性设置为 读(2) 或 读模式(3) ,参数就传递给 Load 方法。
[color=0000ff]TO VarName
指定存放表单返回值的变量。如果变量不存在,Visual FoxPro 自动创建它。可在表单的 Unload 事件过程中使用 RETURN 命令来指定返回值。如果不包含返回值,则返回默认值真(.T.)。如果要使用 TO,表单的 WindowType 属性必须设置为1 (模式)。如果表单的 Init 事件过程返回了.F.,则防止开始表单实例,Unload 事件过程将不返回值到 VarName。 [/color][/quote]
我来回复