| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2264 人关注过本帖
标题:请教keydown问题
只看楼主 加入收藏
wlly2007
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-1-18
收藏
 问题点数:0 回复次数:1 
请教keydown问题
  请教一下,在窗体里的数据窗口怎么定义keydown事件,使数据窗口通过回车跳到下一个字段。谢谢!!!
搜索更多相关主题的帖子: keydown 定义 窗口 数据 
2006-01-18 19:53
潇洒老乌龟
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:407
专家分:0
注 册:2005-12-13
收藏
得分:0 

数据窗口中回车键的完整编程

  下面的脚本在数据窗口的PBm_dwnprocessenter用户事件中编写,用来检查数据窗口中录入数据的各种情况,并执行相应的程序。
  1、当返回负值时
  肯定某列存在错误,这时既不处理Enter键也不处理Tab键。
  2、当返回非负值时
  如果是最后的行列则应该在按回车键时插入一行,并使光标定位到新行的第一列上。
  如果不是最后行列则应该发送Tab信息,屏蔽Enter键的处理。
  脚本如下:
  If This.AcceptText() < 0 Then //如果不能正确接受用户的输入信息
   Return 1 //则不进行按键处理,直接返回
  End If
  If This.GetColumn()=Long(dw_1.Object.DataWindow.Column.Count) Then //如果是最后一列
   If This.GetRow() = This.RowCount() Then //并且是在最后一行
    This.InsertRow(0) //则增加新行
    This.ScrollToRow(This.GetRow() + 1) //并且使之成为当前行
    This.SetColumn(1) //并将第一列设置为当前列
    Return 1 //然后返回
   End If
  End If
  Send(Handle(This),256,9,Long(0,0)) //发送处理Tab键的消息
  Return 1//忽略回车键的处理

关于用enter键代替Tab键的方法
  看到大家很多人都问如何用enter键代替tab键的方法,而大家的回答几乎都是一个,那就是在数据窗口上自定义一个事件ID为pbm_dwnprocessenter的事件,然后在事件上写上以下代码:
  send(handle(this),256,9,long(0,0))
  return 1
  其实,如果大家好好看看PB的帮助就会发现,这个pbm_dwnprocessenter事件,只响应一个回返值 return 0,对于return 1根本就不起作用!对于Grid类型的数据窗口,当有多行并且当前行不是最后一行时,就会出现按了回车键,系统会自动执行换行的操作,并不会因为加了一个return 1 而不执行PB的默认操作。经过大量的试验,我找到了一个并不完美的解决方法:
  1、在窗口上放一个按钮,设置按钮的default属性为true,设置visible属性为FALSE
  2、在这个按钮上执行模拟tab键的代码: send(handle(dw_1),256,9,long(0,0))
  这样就OK了,原理嘛就是,当按enter键后,系统不再执行默认的换行操作,而是触发了那个按钮的clicked事件,这样再模拟出一个tab键,就能完美的用enter执行tab的功能了。说这个方法不是完美的是因为如果你的窗口必须有一个按钮为default按钮完成其他的功能时就不好办了,但我想这样也是一个不错的方法。

另一种方法
  通常要实现Enter键跳转焦点都是通过模拟Tab键来完成,但是如果有列的高度较高时(可以输入两排以上的串),这种方法不能正常跳转。
  以下是实现Enter键跳转焦点的又一种方法:
/***************************************************************************
function: of_tab
access: public
description: 跳转焦点
argument: none
return value: integer
       1, 成功
       2, 焦点丢失
       -1, 失败
author: 左手无名指
date: 2004-05-14
***************************************************************************/
integer li_net = -1
long i, j, ll_tab, ll_coltab[], ll_col[]

if this.getrow() <= 0 or this.getcolumnname() = "" then return -1
ll_tab = long(this.describe(this.getcolumnname() +".tabsequence"))
if ll_tab <= 0 then return -1
for i = 1 to long(this.describe("datawindow.column.count"))
if ll_tab < long(this.describe("#"+ string(i) +".tabsequence")) then
ll_coltab[upperbound(ll_coltab)+1] = long(this.describe("#"+ string(i) +".tabsequence"))
ll_col[upperbound(ll_col)+1] = i
end if
next
if upperbound(ll_coltab) = 1 then
li_net = this.setcolumn(ll_col[1])
end if
for i = 1 to upperbound(ll_coltab) -1
// 排序
for j = i + 1 to upperbound(ll_coltab)
if ll_coltab[i] > ll_coltab[j] then
ll_tab = ll_coltab[i]
ll_coltab[i] = ll_coltab[j]
ll_coltab[j] = ll_tab
ll_tab = ll_col[i]
ll_col[i] = ll_col[j]
ll_col[j] = ll_tab
end if
next
li_net = this.setcolumn( ll_col[i])
if li_net = 1 then exit
next
if li_net = 1 then
long ll_x, ll_width, ll_pos, ll_maxpos

ll_x = long(this.describe("#"+ string(ll_col[i]) +".x"))
ll_width = long(this.describe("#"+ string(ll_col[i]) +".width"))
ll_maxpos= long(this.describe("DataWindow.HorizontalScrollMaximum"))
if (ll_x + ll_width) > this.width then
ll_pos = min(ll_maxpos, ll_width + ll_x - this.width +18)
end if
this.modify("DataWindow.HorizontalScrollPosition='"+ string(ll_pos) +"'")
return 1
else
return 2
end if


乌龟学堂http://www. 承接各种软件开发、系统集成、网络搭建。 QQ:124030710
2006-01-18 21:26
快速回复:请教keydown问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031627 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved