导航
  • 主页
  • API 调用
  • 基础类
  • 控件与界面
  • 数据库相关
  • DataWindow
  • 项目管理
  • Web 应用
  • 脚本语言

这样屏蔽掉DW里系统自带的回车键下移一行的功能?

fallstone 2002-05-09 08:41:31
客户需要在DW里按回车键就往下移一列,也就是用回车代替TAB的功能。
我用的是GRID的DW,先增加好4行或者5行。此时如果不写代码按回车则下移一行,写了用回车代替TAB的代码(send(handle(this),256,9,0))则既下移一行又右移一列

现在的问题是:怎样把下移一行的系统自带功能去掉???
...全文
78 点赞 收藏 18
写回复
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobi1314 2002-05-14
下面这种方法应该可以的,我一直是用这种办法的。但是你在使用的时候要进行考虑有没有跟其他的事件有没有什么冲突才行。
你自定义一个event id 为pbm_dwnprocessenter的事件
然后在该事件中写以下代码:
send(handle(this),256,9,0)
return 1

回复
msf 2002-05-13
赞成海阔天空所说的。
回复
liuyxit 2002-05-13
學習﹗
回复
tiger201 2002-05-09
pbm_dwnprocessenter 中:

return 1
回复
liuyxit 2002-05-09
根据你的意思可變為如下代碼(已在用0:

//在rowfocuschanged事件中加:
if getrow()=rowcount() then insertrow(0)

//在dw自定义一个event id 为pbm_dwnprocessenter的事件
send(handle(this),256,9,0)
return 1
//這樣可以在光標到達最后一行時就增加一新行﹐回車只到下一列﹐且焦點到最后一列還能回到第一列。

回复
oceanaut 2002-05-09
1.首先在数据窗口中定义一个用户自定义事件,ue_keydown,Event ID:pbm_dwnkey
脚本为:
integer li_row
integer VK_TAB = 09
integer VK_SHIFT = 16

if key = KeyLeftArrow! then
keybd_event(VK_SHIFT,0,0,0) //按下shift
keybd_event(VK_TAB,0,0,0) //按下tab
keybd_event(VK_TAB,0,2,0) //释放tab
keybd_event(VK_SHIFT,0,2,0) //释放shift
return 1
end if

if key = KeyRightArrow! then
keybd_event(VK_TAB,0,0,0) //按下tab
keybd_event(VK_TAB,0,2,0) //释放tab
return 1
end if
2.定义第二个用户自定义事件,ue_pressenter,Event ID:pbm_dwnkey
脚本为:
If This.Accepttext()<0 then
return
end if

if This.getcolumn()=Long(This.Describe("Datawindow.Column.count")) then
if this.getrow()=This.Rowcount() then
This.insertrow(0)
This.scrolltorow(This.getrow()+1)
This.Setcolumn(1)
return
end if
end if
send(Handle(this),256,9,long(0,0))
This.SetActionCode(1)
This.settransobject(sqlca)
通过以上这样的方法即可实现您的要求。当然,你也可以创建一个用户对象,将这
个事件写在其中,可以在任何需要使用此功能的窗口中都可以实现。
如果您对以上回答有什么意见,请留言给我或者mail给我哦!
回复
oceanaut 2002-05-09
1.首先在数据窗口中定义一个用户自定义事件,ue_keydown,Event ID:pbm_dwnkey
脚本为:
integer li_row
integer VK_TAB = 09
integer VK_SHIFT = 16

if key = KeyLeftArrow! then
keybd_event(VK_SHIFT,0,0,0) //按下shift
keybd_event(VK_TAB,0,0,0) //按下tab
keybd_event(VK_TAB,0,2,0) //释放tab
keybd_event(VK_SHIFT,0,2,0) //释放shift
return 1
end if

if key = KeyRightArrow! then
keybd_event(VK_TAB,0,0,0) //按下tab
keybd_event(VK_TAB,0,2,0) //释放tab
return 1
end if
1.定义第二个用户自定义事件,ue_pressenter,Event ID:pbm_dwnkey
脚本为:
If This.Accepttext()<0 then
return
end if

if This.getcolumn()=Long(This.Describe("Datawindow.Column.count")) then
if this.getrow()=This.Rowcount() then
This.insertrow(0)
This.scrolltorow(This.getrow()+1)
This.Setcolumn(1)
return
end if
end if
send(Handle(this),256,9,long(0,0))
This.SetActionCode(1)
This.settransobject(sqlca)
通过以上这样的方法即可实现您的要求。当然,你也可以创建一个用户对象,将这
个事件写在其中,可以在任何需要使用此功能的窗口中都可以实现。
回复
supershb 2002-05-09
case KeyEnter!
Send( Handle(m_dw), 256, 9, keyflags )
CASE KeyTab!
m_dw.Post Function ScrollToRow(m_dw.GetRow())
if KeyFlags=1 then
m_dw.Post Function SetFocus()
end if

m_dw是数据窗口, 以上脚本放入KeyDown事件中,事件标志:pbm_dwnkey
回复
dfz_fan 2002-05-09
自定义一个event id 为pbm_dwnprocessenter的事件
然后在该事件中写上 return 1

试试
回复
kaisa_cheng888 2002-05-09
同意楼上
回复
swjtu95 2002-05-09
Send ( handle, message#, lowword, long )向窗口发送一个消息。
    handle:你想要发送窗口的句柄,可用handle()函数获得句柄。
    message#:无符号的整型变量。是你想发送消息的系统信息号,实现的功能,须查询sdk。
    lowword:long类型,指定与消息一起发送的word类参数值。如果messageno参数指定的消息不使用该参数,那么将这个参数的值设置为0
    long:长整型变量,你想发送消息的值。
Send()功能向窗口发送指定的消息并立即执行相应的事件处理程序。语法Send( handle, messageno, word, long )参数handle:long类型,指定窗口的系统句柄,将向该窗口发送消息messageno:UnsignedInteger类型,指定要发送的消息号word:long类型,指定与消息一起发送的word类参数值。如果messageno参数指定的消息不使用该参数,那么将这个参数的值设置为0long:long类型或string,指定与消息一起发送的long型参数值或字符串返回值Long。函数执行成功时返回Windows系统调用SendMessage()的返回值,发生错误时返回-1。如果任何参数的值为NULL,Send()函数返回NULL。用法Send()函数用于向窗口发送非PowerBuilder预定义事件的消息,这个窗口可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。Send()函数直接触发指定窗口相应的事件,执行事件处理程序后返回到调用应用中,这一点与Post()函数不同,Post()函数把发送的消息放置在指定窗口消息队列的尾部,然后返回到应用程序中,它并不等待相应事件事件处理程序的执行。因此,我们说Post()函数采用的是异步方式,Send()函数采用的是同步方式。Send()函数的参数handle指定接收消息的窗口句柄,对PowerBuilder窗口来说,使用Handle()函数可以得到该句柄。对其它应用程序的窗口来说,可以调用系统API函数查找窗口并得到相应窗口的句柄。实际上,Send()函数把它的各个参数直接传送给Windows的系统调用SendMessage()。在各种C++开发工具的WINDOWS.H文件中可以查到各消息编号。如果应用程序要发送PowerBuilder定义事件(包括预定义事件和用户定义事件),那么使用TriggerEvent()函数既简单有方便。当应用程序在long参数位置指定一个字符串时,Send()函数复制一个该字符串的副本,然后将副本的地址传送给指定窗口。示例1. 下面的代码向窗口w_date发送一个向下滚动一页的消息(消息号为277):Send(Handle(w_date), 277, 3, 0)示例2. 下面的两条语句均触发命令按钮cb_OK的Clicked事件:
Send(Handle(Parent), 273, 0, Handle(cb_OK))cb_OK.TriggerEvent(Clicked!)
Send(Handle(w_emp), 277, 2, 0):窗口w_wmp向上滚动一页
Send(Handle(dw_whatever), 274, 61472, 0):数据窗口最小化
Send(Handle(dw_whatever), 274, 61488, 0):数据窗口最大化
Send(Handle(dw_whatever), 274, 61728, 0):数据窗口复原

回复
kaikaihe 2002-05-09
send(handle(this),256,9,0)
return 1
回复
fallstone 2002-05-09
问你了啊,你不跟我 说:)

问题加了RETURN就正确了,但是为什么这样还不明白,有关SEND的机理不懂,有人帮我解释下么?

以上帮助的人分数会给的,如果有人解释的好,我再加分。
回复
nasy 2002-05-09
过来问我啊,呵呵~~
回复
lmby 2002-05-09
没明白。
return 1
回复
fallstone 2002-05-09
test
回复
anrong 2002-05-09
具体情况具体来确定以上方法!
回复
zmq223 2002-05-09
同意楼上的,其余的有副作用。
回复
发动态
发帖子
PowerBuilder
创建于2007-09-28

809

社区成员

PowerBuilder 相关问题讨论
申请成为版主
社区公告
暂无公告