vfp 怎么判断表单上的文本框不能为空 必填项 文本框很多

無法替代 2017-08-10 10:01:43
比如50个 名字无规律
一个一个判断是不是好傻的样子
...全文
1062 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
都市夜猫 2017-08-23
  • 打赏
  • 举报
回复
引用 13 楼 sdjnjdxc 的回复:
但是如果提示不能为空写在chkempty_assign中(用messagebox()),因为所有控件都执行setall,所以有多少空的,就提示多少次。不太好
你可以把 SetAll 理解为 Windows 的广播消息,只有拥有某属性的对象(相当于注册了某消息的接收者)才会收到此消息。 如果在控件的 assign 方法(相当于事件处理器)中给出提示不合适,可以将最后的处理权交给消息发送者,事件接收者只负责将自己的问题,记录在消息发送者提供的位置,它可以是一个表单变量,也可以是表单数组,更可以是一个表单方法(相当于回调函数)。例如,针对此贴检查为空的需求,可以有很多处理方法: *-- a. 控件,procedure chkempty_assign If Empty(This.Value) ii = 1 + Alen(Thisform.objs) Dimension Thisform.objs[ii] Thisform.objs[ii] = This Endif *-- b.表单,自己的方法 或 一检查按钮的 click Thisform.AddProperty('objs[1]') Thisform.SetAll('chkempty', 1) ** 接下来怎么处理,看需求是什么了 ** 反正执行都这里,objs 数组中已经记录了所有值为空的对象
xilaianzxsc 2017-08-23
  • 打赏
  • 举报
回复
你说:50个,且名字无规律,一个一个判断是不是好傻. 其实,你的源代码,别人又不去看. 别人不看,别人就不会认为你傻. 充其量,是自己认为自己傻. 自己认为自己傻,这又何苦呢....
xilaianzxsc 2017-08-23
  • 打赏
  • 举报
回复
我一般是这么做的. 当然,我的方法,比较笨 在保存按钮里面,写: if empty(thisform.text1.value) messagebox("此处不可为空",16,"出错") else if empty(thisform.text2.value) messagebox("此处不可为空",16,"出错") else if empty(thisform.text3.value) messagebox("此处不可为空",16,"出错") else .............把所有text全部列出来. 有多少个,列多少个. endif endif endif
sdjnjdxc 2017-08-23
  • 打赏
  • 举报
回复
原理明白了 第二段代码干什么用没明白
sdjnjdxc 2017-08-23
  • 打赏
  • 举报
回复
引用 18 楼 xilaianzxsc 的回复:
你说:50个,且名字无规律,一个一个判断是不是好傻. 其实,你的源代码,别人又不去看. 别人不看,别人就不会认为你傻. 充其量,是自己认为自己傻. 自己认为自己傻,这又何苦呢....
呵呵
sdjnjdxc 2017-08-22
  • 打赏
  • 举报
回复
LPARAMETERS vNewVal *To do: Modify this routine for the Assign method THIS.checkempty = m.vNewVal IF EMPTY(this.Value) =MESSAGEBOX("数据不能为空",0+48,"提示") this.SetFocus endif
sdjnjdxc 2017-08-22
  • 打赏
  • 举报
回复
引用 12 楼 dkfdtf 的回复:
原来不是要做输入为空的检查,白忙活儿了 要在保存前检查,一样也是用子类化 TextBox 最简单,例如: 子类中加一个属性 ChkEmtpy,带上 assign 方法,保存前 执行一次 Thisform.SetAll('chkempty', .T.),这样所有的子类都会执行它的 chkempty_assign 方法,只要在子类中的该方法上检查 This.value 值,为空则弹出提示并 This.SetFoucs() 即可 sdjnjdxc 的方法也不失为一种简单有效的方法。但有一缺点,就是要自己遍历所有的控件,这会有两个问题:首先,不一定所有基于 TextBox 的控件都会要求不能为空;其次,如果表单布局很复杂,各种容器类对象嵌套的话,遍历过程将很复杂,而使用 SetAll 方法,遍历过程便交给了 vfp 去实现,不需要担心有哪些种类的容器,嵌套了多少层,否则,遇到 pageframe 得遍历 pages,遇到 grid 得遍历 columns,其他要遍历 controls
谢谢版主 试了一下你的方法,很不错。但是如果提示不能为空写在chkempty_assign中(用messagebox()),因为所有控件都执行setall,所以有多少空的,就提示多少次。不太好
無法替代 2017-08-12
  • 打赏
  • 举报
回复
引用 10 楼 sdjnjdxc 的回复:
在保存时调用我的代码
谢谢 你这个方法可以
都市夜猫 2017-08-12
  • 打赏
  • 举报
回复
原来不是要做输入为空的检查,白忙活儿了 要在保存前检查,一样也是用子类化 TextBox 最简单,例如: 子类中加一个属性 ChkEmtpy,带上 assign 方法,保存前 执行一次 Thisform.SetAll('chkempty', .T.),这样所有的子类都会执行它的 chkempty_assign 方法,只要在子类中的该方法上检查 This.value 值,为空则弹出提示并 This.SetFoucs() 即可 sdjnjdxc 的方法也不失为一种简单有效的方法。但有一缺点,就是要自己遍历所有的控件,这会有两个问题:首先,不一定所有基于 TextBox 的控件都会要求不能为空;其次,如果表单布局很复杂,各种容器类对象嵌套的话,遍历过程将很复杂,而使用 SetAll 方法,遍历过程便交给了 vfp 去实现,不需要担心有哪些种类的容器,嵌套了多少层,否则,遇到 pageframe 得遍历 pages,遇到 grid 得遍历 columns,其他要遍历 controls
無法替代 2017-08-11
  • 打赏
  • 举报
回复
引用 8 楼 TopStop 的回复:
[quote=引用 6 楼 dkfdtf 的回复:] CSDN 越来越恶心了,帖子不能直接带附件,非得要作为资源上传再帖连接。以前还可以自己输入0积分,现在倒好,改成下拉框,积分没得0可选,要下载就得耗积分了 有分的话,就直接看示例吧:http://download.csdn.net/download/dkfdtf/9928042 下载解压后,打开 proj1.pjx,切换到 Code 标签,运行 test.prg 要分析的话,看 from1 中的4个 txt 控件,它们都是从 test 类库中拖到 from1 上的,就设置一个属性AllowEmpty,不需要写代码。不允许留空的功能,看类库中从 TextBox 派生的 txt 子类,代码在 GotFoucs / LostFoucs 方法中。
你好 这个应该是只有触发 LostFoucs事件才可以[/quote] 如果用户打开表单 直接点 保存 这样就不好控制了
無法替代 2017-08-11
  • 打赏
  • 举报
回复
引用 6 楼 dkfdtf 的回复:
CSDN 越来越恶心了,帖子不能直接带附件,非得要作为资源上传再帖连接。以前还可以自己输入0积分,现在倒好,改成下拉框,积分没得0可选,要下载就得耗积分了 有分的话,就直接看示例吧:http://download.csdn.net/download/dkfdtf/9928042 下载解压后,打开 proj1.pjx,切换到 Code 标签,运行 test.prg 要分析的话,看 from1 中的4个 txt 控件,它们都是从 test 类库中拖到 from1 上的,就设置一个属性AllowEmpty,不需要写代码。不允许留空的功能,看类库中从 TextBox 派生的 txt 子类,代码在 GotFoucs / LostFoucs 方法中。
你好 这个应该是只有触发 LostFoucs事件才可以
sdjnjdxc 2017-08-11
  • 打赏
  • 举报
回复
在保存时调用我的代码
都市夜猫 2017-08-10
  • 打赏
  • 举报
回复
子类化文本框控件啊,难道不用类库的吗?
作为一项原则,永远不要直接使用原生控件,都要子类化以后再使用,这样,一旦你想加任何功能,只要修改一次子类就好了。
sdjnjdxc 2017-08-10
  • 打赏
  • 举报
回复
建立一个循环,遍历所有控件
sdjnjdxc 2017-08-10
  • 打赏
  • 举报
回复
谢谢版主,下来学习
都市夜猫 2017-08-10
  • 打赏
  • 举报
回复
CSDN 越来越恶心了,帖子不能直接带附件,非得要作为资源上传再帖连接。以前还可以自己输入0积分,现在倒好,改成下拉框,积分没得0可选,要下载就得耗积分了 有分的话,就直接看示例吧:http://download.csdn.net/download/dkfdtf/9928042 下载解压后,打开 proj1.pjx,切换到 Code 标签,运行 test.prg 要分析的话,看 from1 中的4个 txt 控件,它们都是从 test 类库中拖到 from1 上的,就设置一个属性AllowEmpty,不需要写代码。不允许留空的功能,看类库中从 TextBox 派生的 txt 子类,代码在 GotFoucs / LostFoucs 方法中。
sdjnjdxc 2017-08-10
  • 打赏
  • 举报
回复
子类化: 在刚这个例子,在textbox的子类中,增加什么功能帮助检查是不是为空?谢谢
sdjnjdxc 2017-08-10
  • 打赏
  • 举报
回复
引用 2 楼 dkfdtf 的回复:
子类化文本框控件啊,难道不用类库的吗? 作为一项原则,永远不要直接使用原生控件,都要子类化以后再使用,这样,一旦你想加任何功能,只要修改一次子类就好了。
请版主举个例子吧,谢谢
sdjnjdxc 2017-08-10
  • 打赏
  • 举报
回复
FOR i=1 to thisform.ControlCount IF thisform.Controls(i).baseclass="Textbox" IF EMPTY(thisform.Controls(i).value ) =messagebox(thisform.Controls(i).name+"内容不能为空") ENDIF ENDIF endfor
看实例学VFP:更复杂的查询 时间:2009-02-12来源:编程入门网 作者:老马   在看实例学VFP:对表中记录进行定位与查找操作及看实例学VFP:用SELECT语句创建查询这两个例子中,我们可以在查询时可以从组合框中选定一个要查询的字段。本例对这种查询方式再做进一步改进,使之在查询时不仅可以从一个组合框中选取要查询的字段,还可以从另一个组合框中选定操作符(如<、=、>等),从而实现更复杂的查询。本例应用到了数据环境,并使用“数据1”数据库中的“人员信息表”作为数据环境的数据源,关于该数据库的情况已经在看实例学VFP:示例数据库一文中给出,这里不再详述。运行界面见本文末尾。   制作步骤如下:   一、新建表单,将其caption属性值设置为“更复杂的查询例子”,AutoCenter属性值设置为.T.,width属性值设置为520,height属性值设置为245,并保存为“更复杂的查询例子.scx”。   二、右击表单空白处,选“数据环境”命令,将“人员信息表”添加到数据环境中。在“数据环境设计器”中拖动“人员信息表”的标题栏到表单上,自动生成一个表格控件。由于是从数据环境中把“人员信息表”拖动过来由系统自动生成的,该表格控件的RecordSource属性及RecordSourceType属性已经由系统设置好了,不用管它,但name属性值系统给出的好长,为了书写代码的方便,我们把这个表格控件的name属性值修改为“grid1”。   三、在表格控件的下方添加一个Label控件,并把它的caption属性值设置为“查询条件”。   四、在label控件的右侧依次添加两个组合框控件、一个文本框控件及两个命令按钮command1和command2,并把这两个命令按钮的caption属性值依次设置为“查找”和“退出”。   五、适当调整各控件在表单上的位置,调整后的表单设计器如下图所示:   六、设置组合框控件的属性:   (一)组合框Combo1:RecordSourceType属性值设置为“8-结构”,RecordSource属性值设置为“人员信息表”。   (二)组合框Combo2:RecordSourceType属性值设置为“1-值”,RecordSource属性值设置为“,>,<,=,>=,<=,<>”。   七、添加事件代码:   (一)表单的unload事件代码:close data   (二)组合框Combo1的InteractiveChange事件代码: if alltrim(this.displayvalue)="出生日期" thisform.text1.value={} else thisform.text1.value='' endif   (三)“查找”按钮command1的click事件代码: if thisform.grid1.recordsource='临时人员信息表' thisform.grid1.recordsource='人员信息表' endif' private CXTJ if empty(thisform.combo1.displayvalue) or empty(thisform.combo2.displayvalue) ; or empty(thisform.text1.value) && 判断列表框和文本框是否为空 messagebox('请输入完整条件!',16,'系统提示') thisform.combo1.setfocus else do case case alltrim(thisform.Combo1.Displayvalue)='基本工资' CXTJ=alltrim(thisform.combo1.displayvalue); +' '+alltrim(thisform.combo2.displayvalue); +' '+alltrim(thisform.text1.value) case alltrim(thisform.Combo1.Displayvalue)='出生日期' CXTJ=alltrim(thisform.combo1.displayvalue); +' '+alltrim(thisform.combo2.displayvalue); +' ctod("'+dtoc(thisform.text1.value)+'")' otherwise CXTJ=alltrim(thisform.combo1.displayvalue); +' '+alltrim(thisform.combo2.displayvalue); +' "'+alltrim(thisform.text1.value)+'"' endcase Select * from 人员信息表 where &CXTJ. into cursor 临时人员信息表 thisform.grid1.recordsource='临时人员信息表' thisform.grid1.backcolor=rgb(200,224,248) endif   (四)“退出”按钮command2的click事件代码:thisform.release   八、运行“更复杂的查询例子.scx”,界面见下图:
11.1 系统需求分析 传统的学生成绩管理方法不仅浪效率低,而且由于管理不规范容易导致各种错误 的发生。因此实现一个智能化、系统化的公共计算机成绩管理系统是十分必要和不可缺 少的。它将大大减轻管理者的劳动强度,降低出错率,提高管理的效率。该系统可以实 现如下功能: 1. 数据需求 通过调查,总结出该应用程序对数据的需求大致有如下这些: (1) 学生信息 包括学号,姓名,性别,出生日期等 (2) 学生成绩信息 主要包括学号, 课程编号,平时成绩 (3) 课程信息 包括课程编号,课程名称 2. 功能需求 功能分析的任务是了解用户对数据的处理方法和输出格式。 (1) 基本数据录入 基本数据包括学生信息、管理员信息、学生成绩休息和课程信息等。要求系统能够 录入这些数据,并且可以进行修改。在数据录入和修改过程中应保持数据的参照完整性 。 (2) 学生和管理员信息的维护 要求能够根据需要对学生和管理员信息进行维护修改等。 (3) 打印输出 打印学生信息表。 11.2 系统设计 1. 程序总体结构设计 在开始程序设计之前,首先应该将程序的总体结构以层次图的形式表示出来,便于 对程序分层设计和实现。图1所示为公共计算机成绩管理系统的功能模块图。 图1公共计算机成绩管理系统功能模块 2. 数据库逻辑设计 进行数据库设计的依据有三个:第一是在进行系统调查时由成绩管理员提供的各种 处理数据;第二是功能设计结果;第三是数据库设计规范化理论。数据库设计是系统设 计的一基本工作,其效果的好坏,对后续设计、调试、使用、维护等工作关系极大, 因此,一定要高度重视这一部分工作。当然,我们不能简单地将数据库设计理解为在计 算机上用可视化的方法建立表的过程,其主要工作是建立一种完整、规范的数据模型以 支持整个应用系统对数据的要求。 根据对实际情况进行分析建立关系模型 1) 学生信息表(学号,姓名,性别,出生日期) 2) 学生成绩表(学号, 课程编号,平时成绩) 3 课程表(课程编号,课程名称) 11.3 创建目 Visual Foxpro推荐在目管理器中开发应用程序,因为目管理器会为开发工作带来很多方便 。在目管理器中创建一个目后,应用程序就具备了一个开发框架,然后在这个框架 中,再利用目管理器所提供的强大功能,按照需求来实现应用程序的设计。 用户可以启动Visual Foxpro,选择【文件】"【新建】命令,在打开的对话框中,选择"目"单选按钮,然后 单击"新建文件"按钮,接着在"创建"对话框中,输入目文件名并确定目路径(本例 使用的路径为D:\公共计算机成绩管理系统),然后单击"保存"按钮,即可启动目管理 器。 一个完整的应用程序,即使规模不大,也会涉及到多种类型文件,如dbc数据库、d bf表以及菜单、表单、报表、位图等。为了以后的修改、维护工作方便进行,就需要把 这些文件放在不同的文件夹中便于管理维护。 11.4数据库的物理设计 a) 数据库名为公共计算机成绩管理.dbc b) 数据表 i. 学生信息表.dbf 学号/C/10,姓名/C/10,性别/L/1,出生日期/D/8,系科/C/30,备注/M/4,照片/G/4 ii. 学生成绩表. dbf学号/C/10, 课程编号/C/2,平时成绩/N/6/2 iii. 课程表 课程编号/C/2,课程名称/C/14 11.5界面设计 1) 创建启动表单 下面设计应用程序的封面,主要由一个表单来实现. 在目管理器中,打开"文档"选卡,选择"表单"选,单击"新建"按钮,在打开 的对话框中单击"新建表单"按钮,这时,将弹出一个表单设计器和表单Form1。 单击菜单后的"创建"按钮,即可在打开的菜单设计器窗口中创建该菜单的子菜单 。如果要设置命令 的快捷键,可以单击其后的选按钮,z然后在打开的对话框中,输入快捷键的名称。 最后单击确定按钮,返回到菜单设计器窗口,在"退出"菜单文本框中,输入qu it,然后单击 关闭按钮,将菜单保存为"主菜单.mnx"。运行该菜单,其效果如图所示。 接着,创建应用程序的主文件,将其保存为"主程序.prg" 。在代码编辑窗口中,输入以下代码: set talk off set date to ymd set cent on clear all c_p1=sys(16) c_p2=left(c_p1,rat('\',c_p1,1)-1) set defa to &c_p2 do form 表单1.scx read events quit 如图所示,在目管理器中,将"主程序.prg"设置为主文件,然后选中"主程序.prg"并 单击 "运行"按钮. 运行主程序后的效果 11.7表单设计         输入Click事件的代码。 form1的Click事件的代

2,728

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧