scrolltorow 的难题

jxc 2002-03-03 10:21:09
我在做一个数据窗口控件,其中一个功能是实现用拼音查找 dddw 中对应的汉字项目.

如: 输入 lt , 就自动滚到并加亮dddw 中"论坛" 一项, 而 text 控件的内容仍然为 lt

在pb7.0.1中用 scrolltorow 可以实现(需要写在用户自定义事件中,间接调用才行), 但在pb7.0.3 以上版本中, text 控件的内容自动变为"论坛", 这不是我想要的.

用 settext('lt') ,又失去了滚动和加亮的特性.

我觉得这是PB内部的查找机制影响的, 如何解决呢? 各位?
...全文
441 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxc 2002-03-28
  • 打赏
  • 举报
回复
你的鼠标敏感例程我见过,但还是多谢!
好想还差一点,不能解决。
jxc 2002-03-28
  • 打赏
  • 举报
回复
用过滤有缺点:
比如上次只查到一条数据, 这次查到10条数据且焦点没有改变,则只显示一条,很别扭!
jxc 2002-03-28
  • 打赏
  • 举报
回复
Thanks!!!
killerdanny 2002-03-23
  • 打赏
  • 举报
回复
在PB的数据窗口中,如何捕捉dropdowndw列的上下键事件


Posted by janjun on August 13, 1999 at 08:57:45:

In Reply to: 在PB的数据窗口中,如何捕捉dropdowndw列的上下键事件!

■ DDDW 事件概述

⒈所有对DDDW的操作都通过触发pbm_command事件完成
① 在PB的用户事件中,大多数事件对应的Windows 事件都有两个参数:lparam 和 wparam,而在PB5.0中,pbm_command没有参数,但可以通过message对象的两个属性取得Windows事件对应的Event ID,这两个属性就是: LongParm 和 WordParm。
LongParm 包含DDDW的Handle,用intLow()可取得其Handle
WordParm 包含对DDDW的操作,用intHigh()可取得其Event ID

② 在PB6.0(^)中,pbm_command带3个参数,其中hwndchild(long)与notificationcode(unsignedinteger)即DDDW的Handle和Event ID。

⒉DDDW 的Event ID 列表:
Event Event ID
-------------------------------
Clicked 1281
RowFocusChanged 2048
RightMouseButtonDown 2314
Left Button Up 2313
Retreive End 769
MouseMove 2311
...
至于问题中的上下滚动,倘为键盘,将导致行焦点改变(此外,还导致一个ID = 2049的事件):
RowFocusChanged 2048

倘为鼠标点击滚动条上下按钮:
PageUp/PageDown 2339

⒊根据上述列表,就可以在 pbm_command 事件中判断对DDDW做了何种操作:

DataWindowChild ldwc_Child

GetChild( "Column", ldwc_Child )

IF IntLow( Message.Longparm ) = Handle( ldwc_Child ) THEN
CHOOSE CASE IntHigh( Message.Wordparm )
CASE 2048 // RowFocusChanged on DDDW
CASE 1281 // Clicked
CASE 2314 // Right Mouse Button Clicked
CASE 2311 // MouseMove
END CHOOSE
END IF

* PB 6.0(^)可以直接使用其参数hwndchild、notificationcode代替其中的intLow(Message.LongParm)和intHigh(Message.WordParm)。

■ 一个简单例子 -- 自动选择DDDW

DataWindowChild ldwc_Child
String ls_Pointer
Long ll_Row, ll_Lparam, ll_Lparam

ll_Lparam = Message.LongParm
ll_Lparam = Message.WordParm

GetChild( "status", ldwc_Child ) // Replace the column name "status" as you needed

IF IntLow( ll_Lparam) = Handle( ldwc_Child ) THEN
CHOOSE CASE IntHigh( ll_Lparam )
CASE 2311 // MouseMove
// Get the object at pointer and parse out the Row #
ls_Pointer = ldwc_Child.GetObjectAtPointer()
ll_Row=Long( Mid( ls_Pointer, Pos( ls_Pointer, "~t" ) + 1 ))

// If the Row is different then highlight it
IF ldwc_Child.GetRow() <> ll_Row AND ll_Row > 0 THEN
ldwc_Child.ScrollToRow( ll_Row )
END IF
END CHOOSE
END IF

■ 相关文档

- 据说在《January 1995 PBDJ》(PowerBuilder Developer Journal)有揭露dddw这方面的内容, 遗憾的是很需要一些美元。
http://www.sys-con.com/pbdj/index2.html
- 第二个地方是 Steve Benfield的主页
http://www.stevebenfield.com/
本文上述分析和样例即主要根据Steve Benfield的应用实例而来。
- 另外Powersoft用户年会(Powersoft Conference) '97似乎也有相关的一些应用例子。
//////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////


还有一种就是把DDDW中的数据SHAREDATA到外边一个DW中,查找相关值然后再复职
回来。
csu7433rj 2002-03-23
  • 打赏
  • 举报
回复
这样行的:先把dddw的 allowediting ,always show list 选中,在editchanged 事件中写入:

String ls_filter

IF row < 1 THEN RETURN -1

ls_data=Upper(data)

IF ls_data <> '' AND NOT ISNULL(ls_data) THEN
ls_filter "(res_spell_code like '"+ls_data+"%') )

END IF
这种方法其实就是过滤的。
am2000 2002-03-23
  • 打赏
  • 举报
回复
gz
njscorpio 2002-03-23
  • 打赏
  • 举报
回复
用数据子窗口啊,不过加亮显示没有作过。过滤到是可以用子窗口实现
hovoy 2002-03-23
  • 打赏
  • 举报
回复
找找ldk他以前写过!
fzymr 2002-03-22
  • 打赏
  • 举报
回复
是在子数据窗口中scrolltorow的吗?即在
窗口的open事件中编程:
datawindowchild idwc_child //实例变量
dw_1.getchild("col_name",idwc_child)
idwc_child.settransobject(sqlca)
idwc_child.retrieve()

2,在editchanged事件中编程

.....
idwc_child.Scrolltorow(dw_1.findrow(....))


如果不行的话,可以考虑用过滤
我是用的过滤实现,不是通过findrow(),scrolltorow()来做的,效果尚可!

1,dddw的Allow Editing的属性选上

2,在editchanged事件中编程

String ls_data,ls_filter

//转换成大写,我数据库中存的编号统一为大写
ls_data = Trim(upper(data))

IF ls_data <> '' AND NOT ISNULL(ls_data) THEN
ls_filter = "(py_no like '"+ls_data+"%')"
ELSE
ls_filter = ''
END IF

//idwc_child为数据窗口中的dddw类型的字段的子数据窗口,在窗口的
//打开事件中通过getchild()得到

idwc_child.SetFilter(ls_filter)
idwc_child.Filter()


jxc 2002-03-22
  • 打赏
  • 举报
回复
看来这个问题只有sybase来解决了
dotnba 2002-03-14
  • 打赏
  • 举报
回复
Good Good Study
Day Day Up!
dotnba 2002-03-14
  • 打赏
  • 举报
回复
学习
jxc 2002-03-14
  • 打赏
  • 举报
回复
你们说得我都考虑到了, 是很难解决的问题啊, 大家动动手吧
coolnan 2002-03-04
  • 打赏
  • 举报
回复
最简单的办法就是将dddw的Allow Editing的属性选上,试试看,要是不行,就准备编程吧。
人生如梦 2002-03-04
  • 打赏
  • 举报
回复
编一个用户对象就可以解决了
256m 2002-03-04
  • 打赏
  • 举报
回复
请问:你输入it,考虑大小写没有?
matian 2002-03-04
  • 打赏
  • 举报
回复
对不起,等着高手吧
matian888 2002-03-04
  • 打赏
  • 举报
回复
UP

397

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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