回 帖 发 新 帖 刷新版面

主题:求助!操作符操作数类型不匹配。

这里有一个主程序和一个密码登陆界面。运行时总是提示“操作符操作数类型不匹配。”请好心人耐心帮我看一下。不胜感激!

主程序是这样的:
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个回复)

沙发

public ly,qued  
do form 登陆界面
read events
if qued=1(挂起时显示的错误位置)
  do form 主界面
  read events
endif

板凳

public ly,qued  &&此时的 ly 和 qued 都是逻辑型变量,并且值为假。需要加一条赋值语句。
qued = 1

3 楼

3楼。我在public ly,qued下面加了
qued = 1
但是程序就自动运行到主界面。根本就没有显示登陆界面。
这是为什么呢?

4 楼

2楼。我按你的改了。确实出现了登陆界面。可是我输入正确结果后。它就没有运行下面的主界面。就白屏什么都没有。怎么办呢?

5 楼

public ly,qued  
qued = 1(这个会不会和下面那个qued=1重复了。然后就直接运行下面的了呢?)
do form 登陆界面
if qued=1
  do form 主界面
  read events
endif

6 楼

qued = 2
ly = 2
初始值设置一个判断值之外的数值。

7 楼

不多说,就事论事,最简单的方法是把登陆界面窗口作为“模式窗口”,即WindowType属性改为1-Modal。

若不采用上述最简方法,要采用1楼cbl518方式,则登录按钮click事件代码最后加一条 Clear Events。

8 楼

我回答的是关于“操作符操作数类型不匹配”的问题。

9 楼

在你的登录表单的 Unload 事件:
Clear Events

10 楼

登录表单要使用模式表单,要有返回值。
你的例子里类型不匹配是因为没有返回值,
(因为你的表单不是模式表单,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]

我来回复

您尚未登录,请登录后再回复。点此登录或注册