BCB 怎么利用 TabOrder属性的

koelum 2004-04-05 04:58:04
图形界面,按 TAB键 时,光标会根据框或按钮 属性TabOrder值从小到大循环跳动。
1. 请问BCB(or Windows?)怎么样实现以上功能的,通过哪个函数?
2. 当随意点击某个框或按钮时,请问BCB(or Windows?)怎么样知道目前光标的TabOrder属性的,从而使下次按 TAB键时,光标从目前开始直接往下跳?
...全文
207 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2004-04-10
  • 打赏
  • 举报
回复
请楼主再好好看看Help,看看我写的文字和代码好不好!!!VCL的属性,只针对VCL控件。
你的IPEdit不是VCL控件(或者由VCL控件派生的),ActiveControl 怎么可能指向它们呢?
看看我上面的代码,是如何处理IPEdit控件的?我上面的只是1个IPEdit,多个IPEdit,你
自己改改吧。别人给你提供思路,你自己要好好看看,看懂这中间的原理,然后达到举一反
三的效果。不能什么都靠别人吧,这是最后一答了。
koelum 2004-04-09
  • 打赏
  • 举报
回复
谢谢季老大底关注。
还是不行哦。
另外,我下载并测试了sncel写的IPedit编辑框,设置其Taborder属性。也有同样情况

即如下问题:
我点击IP编辑框后,光标停留在IP编辑框上,此时再按TAB键,光标此时应该从IP编辑框开始往下走。但是实际上光标却从点击IP编辑框以前的位置往下走。相当于响应TAB键的函数没有侦测到鼠标点击到IP编辑框上。
koelum 2004-04-09
  • 打赏
  • 举报
回复
不会吧?
这样的,我总共创建了4个IP编辑框,比如命名IPEdit1,IPEdit2,IPEdit3,IPEdit4,且已经设定IPEdit1.Taborder=0,IPEdit2.Taborder=1,IPEdit3.Taborder=2,IPEdit4.Taborder=3。

现在我的要求就是:鼠标点击任一IP编辑框后(焦点停在此编辑框上),按TAB键,下次光标停留在下一个Taborder比他大1的编辑框。

似乎是这样的,我点击IP编辑框IPEdit1时,虽然可以输入IP地址,但此时的ActiveControl却不是IPEdit1。
jishiping 2004-04-09
  • 打赏
  • 举报
回复
那就是你的IP编辑框的问题了。说来说去,说了半天,都不知道你究竟想要干什么了!IP
编辑框用鼠标都不能被激活,你干吗要问TAB键、问TabOrder啊?
koelum 2004-04-09
  • 打赏
  • 举报
回复
季老大,其实最主要底问题是当我鼠标点击IP编辑框组件时,IP编辑框并没有被激活。
jishiping 2004-04-09
  • 打赏
  • 举报
回复
因为你的IP编辑框不是VCL控件,所以你自己拦截TAB按键时,要自己设定激活哪个控件啊。
上面已经说了很多,本来就是很简单的,怎么还是搞不定啊?!假设你的IPEdit之前的控件
为Edit4,之后的控件为Edit5,那么你只需要这样写就可以了:
void __fastcall TForm1::FormShortCut(TWMKey &Msg, bool &Handled)
{
if (Msg.Msg==CN_KEYDOWN && Msg.CharCode==VK_TAB) {
bool ShiftDown = GetKeyState(VK_SHIFT)<0;
if (::GetFocus() == IPEditWnd) {
(ShiftDown?Edit4:Edit5)->SetFocus();
Handled = true;
}
else if((ActiveControl==Edit4 && !ShiftDown)
|| (ActiveControl==Edit5 && ShiftDown)) {
::SetFocus(IPEditWnd); Handled = true;
}
}
}
koelum 2004-04-08
  • 打赏
  • 举报
回复
季老大,那有什么办法解决阿,这星期要交货的阿,老大帮人帮到底阿。
jishiping 2004-04-08
  • 打赏
  • 举报
回复
你只是想要用程序激活下一个控件吧,直接用 SelectNext(ActiveControl, true, true);就可以了。
koelum 2004-04-08
  • 打赏
  • 举报
回复
怎么样查找比目前激活的控件的TabOrder大1的那个控件哦?
通过哪个API哦?
jishiping 2004-04-08
  • 打赏
  • 举报
回复
你试试Form的事件OnShortCut,在里面拦截TAB按键。
jishiping 2004-04-07
  • 打赏
  • 举报
回复
1、拦截键盘消息,当按键是TAB时,ActiveControl 就是当前激活的控件,取得它的属性
TabOrder,再查找所有同一层所有控件,找到比目前激活的控件的TabOrder大1的那个控件,
再激活这个控件就可以了。大概的原理就是这样,当然还有一些细节,你自己可以看源程序
啊。
2、上面已经说了,ActiveControl 就是当前激活的控件,API函数就是 GetFocus()
koelum 2004-04-07
  • 打赏
  • 举报
回复
不难吧,我描述得应该够清楚阿
jishiping 2004-04-07
  • 打赏
  • 举报
回复
"自己写的IP编辑框" 不是VCL控件吧。VCL拦截TAB按键,只对VCL控件做处理。
koelum 2004-04-07
  • 打赏
  • 举报
回复
我将Form的KeyPreview设为ture, OnKeyPress捕捉按TAB键时将ShowMessage, 在激活其他edit控件时,按Tab键都能ShowMessage。 但我用鼠标激活自己写的IP编辑框时,按TAB键居然不能秀出ShowMessage, 也就是说此时没有响应OnKeyPress, 是何缘故呢?
koelum 2004-04-06
  • 打赏
  • 举报
回复
怎么没人进来呢, 大家帮帮一下我阿,多谢
koelum 2004-04-05
  • 打赏
  • 举报
回复
谢谢楼上的,这个我都知道。

我写了个类,class TIPAddress : public TWinControl,用来产生IP编辑框。我设置IP编辑框的TabOrder属性后,按TAB键光标循环跳动,功能正常。

但我点击IP编辑框后,光标停留在IP编辑框上,此时再按TAB键,光标此时应该从IP编辑框开始往下走。但是实际上光标却从点击IP编辑框以前的位置往下走。相当于响应TAB键的函数没有侦测到鼠标点击到IP编辑框上。
顽皮小子 2004-04-05
  • 打赏
  • 举报
回复
在组件的父组件上右击鼠标,选中TabOrder命令,将你要排序的组件按顺序排列即可。
hongjq 2004-04-05
  • 打赏
  • 举报
回复
设置一个窗体上的所有可获得焦点的属性的TabOrder值就可以了,从0开始。要么就在要设置这个功能的窗体上右击鼠标,选择TabOrder命令在出来的对话框中调整控件顺序就可以了。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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