控件的焦点转移

csdeveloper2010 2010-04-07 04:33:34
假设我现在有一个checkbox,一个button,和一个textbox。如何使用上下键(切记是上下键vbkeyup/vbkeydown)使得焦点在三者键顺序传递。即假设现在焦点在checkbox上,用keyup将焦点转移到textbox,用keydown转移到button,以此类推
...全文
88 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2010-04-08
  • 打赏
  • 举报
回复
Private Sub Check1_KeyDown(KeyCode As Integer, Shift As Integer)
If (KeyCode = vbKeyUp) Then Text1.SetFocus: Exit Sub
If (KeyCode = vbKeyDown) Then Command1.SetFocus: Exit Sub
End Sub

Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer)
If (KeyCode = vbKeyUp) Then Check1.SetFocus: Exit Sub
If (KeyCode = vbKeyDown) Then Text1.SetFocus: Exit Sub
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If (KeyCode = vbKeyUp) Then Command1.SetFocus: Exit Sub
If (KeyCode = vbKeyDown) Then Check1.SetFocus: Exit Sub
End Sub

  • 打赏
  • 举报
回复
把所有的tabstop=false
csdeveloper2010 2010-04-08
  • 打赏
  • 举报
回复
第一,不是tab不好用,而是希望能用上下键操作;所以我的目的是上下键,跟tab键无关。
第二,当焦点已经在button上的时候,按上下键根本不触发keydown事件;反而是焦点从其它控件移到button上的时候触发keydown事件,更奇怪的是还触发了两次,求解???
zst24 2010-04-07
  • 打赏
  • 举报
回复
第一问:楼主,怎样才能不让tab键不好用啊? 求思路!
第二问:焦点要在checkbox,button,textbox间移动,为啥从textbox移到button,又要从button移回textbox?
csdeveloper2010 2010-04-07
  • 打赏
  • 举报
回复
第一,需求不允许用tab键
第二,当焦点从textbox转移到button就触发了button的keydown事件(这不符合要求)。我现在是无法将焦点从button转移到textbox
chuifengde 2010-04-07
  • 打赏
  • 举报
回复
将控件的tabindex设为连续
然后在三者的keydown事件判断keycode为down时sendkeys "{tab}" up时sendkeys "+{tab}"
东方之珠 2010-04-07
  • 打赏
  • 举报
回复
用TAB键,或者上下箭头键是可以的,无须编程。但是,如果光标在文本框内,用箭头键不能转移焦点。
数据库数据关联输入拼音自动过滤控件,内含 Caption 属性编辑器。 只在 Delphi7 下测试通过,曾试图移植到 Delphi2009,但是 ChineseSpell.pas 单元出错,哪位高人修改后,请给我传一份,感激不尽。 (抱歉,关键部分没有源代码,但绝没有设置使用期限什么的) 本组件为方便最终用户输入数据而设计。在所有的数据库应用软件中,都必然有输入数据库表中关联字段数据的情况,而且是频繁的出现。比如:在企业ERP系统中,录入入库单时需要选择或输入已录入系统的某种货物,这时就需要解决如何使用户方便的录入这种货物。一般这种情况有两种解决办法,一种是用下拉列表框提供输入的选择,这种方法有很大的缺点:需要用户点击鼠标,弹出下拉框选择输入,比较麻烦;另外如果数据较多,用户选择数据的时间要超过了输入的时间,反而降低了输入速度;用户也不能通过多列数据信息来参照选择。还有一个更大的缺点是程序员编程非常烦琐,需要代码将数据库数据一一列入列表框,并且还需要附加关键字段数据,用代码处理选择的关键字段值。另一种是用一个按钮来调用另一个窗体,用另一个窗体来列出供选择输入的数据,用户选择了数据后返回。这种方法虽然可解决数据显示单一的问题,但是缺点也很明显,即程序员编程烦琐,用户输入也不方便,如果应用软件中多次需要输入关联数据,那么这些显示关联数据的窗体也会很多,大大增加了软件的复杂度,不利于维护和升级。这两种常规的解决办法如果处理不好,还会使用户频繁的在键盘和鼠标之间切换操作,非常麻烦,根本没有人性化可言。 而这个DataHint组件有众多优点: 1)即时显示:在需要时自动显示,在不需要时自动关闭,完全不用人工干预。 2)多列数据显示:支持多列数据显示,程序员甚至可以设置每一列的颜色和字体,以及整个数据显示框的外观,从而美化组件的外观。 3)即时拼音过滤:组件内部可以根据程序员的设置自动生成字段的拼音计算字段。普通用户都熟悉拼音,只要输入数据的汉语简拼或全拼,即时自动过滤出符合的记录,避免了不相干数据的干扰。用户还可以在过滤数据的基础上进一步通过键盘或鼠标选择余下的数据。它还不仅仅支持拼音过滤,程序员可以设置所有的字段都支持过滤,那么如果有序号类的字段,用户只需输入数字序号就可以直接过滤出选择数据,过滤出数据后只要按会车键就可以确认输入,大大简化了用户的操作。 4)统一键盘操作:整个输入过程完全不需要鼠标的辅助,用键盘就可以快速方便的完成操作。焦点进入、离开编辑框组件自动显示和关闭,不需要用户操作,输入关键字符自动过滤数据,敲会车键确认输入,按上下箭头键,进一步选择数据,完全不需要鼠标的参与。如果数据不多,用户也完全可以只用鼠标完成操作。 5)编辑控件与本组件分离:编辑控件与本组件是合作关系,这种关系的优点是两个对象的生存期互不相干。因此可以使用一个本组件对象,完成多个编辑框的输入。 6)编程方便:本组件设计功能强大,几乎将所有的编写代码的工作都转移到了对象监视器的操作中。程序员只要编辑SQL属性就可以自动将数据库中的数据提取到本组件。组件提供了一个设计字段的组件编辑器,设计列的属性编辑器,这两个编辑器是程序员非常熟悉的字段编辑器和DBGrid列编辑器。其中字段编辑器经过修改和加强,使得程序员可以设置过滤字段和拼音字段。程序员不需要写任何代码。
实现功能:模拟微软计算器界面,实现四则混合运算1.键盘输入(KeyUp事件)2.无焦点(按钮失去焦点)3.实现优先级运算。比如直接输入1-2*3=-5,而不是微软计算器的-34.使用操作工厂,使用接口5.实现菜单里的复制粘贴功能6.可视化文本框7.实现中间操作结果显示8.正则表达式验证输入是否为数字9.小数点个数校验10.使用发消息_Flag实现操作符状态的判定及转换部分注释预览:失去焦点: private void text_display_GotFocus(object sender, EventArgs e) { /* * 文本框的“获取焦点”事件发生时执行的方法。每次获得焦点时,就会执行此方法,使之马上失去焦点。 * * 当某控件的Enable属性变为False的时候,它的焦点转移到TabIndex属性值比它大1的控件上。 * 这时,如果有多个控件的TabIndex属性值同时比它大1,鼠标点击按钮或敲击键盘时候会发出“咚”的一声。 * 故在本程序中,将label_m控件的TabIndex设为1,其它的全部设为0,因此所有的控件在不可用时焦点都会转移到label_m上, * 因为label_m没有Click和KeyUp事件,所以不会出错。 * 这样就实现了全局无焦点的功能。 * */ text_display.Enabled = false; //先使文本框不可用,这时焦点转移到TabIndex比文本框大的下一个控件上 text_display.Enabled = true; //再使文本框可用,这时焦点不会返回。 }KeyUp事件: else if (e.KeyCode == Keys.NumPad1 || e.KeyCode == Keys.D1) { /* 当窗体的某个控件触发了其本身的KeyUp事件之后, * 将会调用keyUp()方法,并判断是哪个按键 * 如果是大键盘或者是小键盘的1时,便调用num_Click()方法。 * 参数是no_1和e。 * 在这里的no_1指的是按钮no_1,e是KeyUp事件 * no_1是按钮,参数格式正确;而e是KeyUp事件,也是事件的一种。KeyEventHandler当然也是EventHandler的一部分。 * 所以调用了之num_Click()后一切按照no_1按钮事件的操作执行 * 所以no_1按钮的这一句 * this.no_1.KeyUp += new System.Windows.Forms.KeyEventHandler(this.num_Click); * 可以不写 */ num_Click(no_1, e); }小数点点击的校验: private void dot_Click(object sender, EventArgs e) { if (!dotFlag) //没点击的情况下 { if (operFlag) //如果点击了运算符,就将文本换为"0.",并将小数点设为已点击 { text_display.Text = "0."; dotFlag = true; } else if (text_display.Text.Equals("0.")) //如果没有点击运算符,切当前文本是"0.",便保持现状但将小数点设为已点击 { dotFlag = true; } else if (text_display.Text.Equals("0") || text_display.Text.Equals("")) { text_display.Text = "0."; dotFlag = true; } else //其他情况直接添加并将小数点设为已点击 { text_display.Text = text_display.Text + "."; dotFlag = true; } } else //如果已点击则什么也不做 { } enterFlag = false; label_m.Focus(); //键盘按键之后焦点由下面的各个_GotFocus()方法控制;鼠标点击之后的焦点有这条语句控制,同样使焦点转移到label_m上。 }

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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