我想让一个数据窗口字段只接受正数。我怎样才能做到这一点?
编辑
我知道我可以使用列规范的验证表达式系统来验证列。但是有什么可用的格式可以放入Format
属性中并完成吗?
我想让一个数据窗口字段只接受正数。我怎样才能做到这一点?
编辑
我知道我可以使用列规范的验证表达式系统来验证列。但是有什么可用的格式可以放入Format
属性中并完成吗?
不,简单的解决方案是验证规则,但真正过滤按下的键的更复杂的解决方案是可能的。
首先,将用户事件 ( ue_nonnegative ) 映射到数据窗口控件事件pbm_dwnkey。
double ld_value
long ll_row
if this.getcolumnname() = "value" then
if key = KeySubtract! or key = KeyDash! then
ll_row = this.GetRow()
ld_value = this.getitemnumber(ll_row, "value")
yield()
post event ue_filtervalue(ll_row, ld_value)
else
yield()
accepttext()
end if
end if
这里数据窗口有一个名为value的列。我检查是否按下了“-”,如果是,我保留当前值并发布一个新事件 ue_filtervalue。yield() 是必要的,以确保 ue_filtervalue 事件将在剩余的 datawindow 事件之后发生。
ue_filtervalue事件将恢复之前没有“-”的值。
this.setitem(ad_row, "value", ad_value)
this.SelectText( Len( String(ad_value)) + 1, Len( String(ad_value)) )
Philip Salgannik在 2004 年 4 月 27 日发布到 sybase.public.powerbuilder.datawindow 的帖子中展示了如何从 DataWindow 中截取密钥。这确实过滤了键,而不是撤消它们。
为 PeekMessage 声明一个外部函数(对于旧 PB 使用 PeekMessageA):
function boolean PeekMessage( Ref blob lpMsg, long hWnd, UINT uMsgFilterMin, UINT uMsgFilterMax, UINT wRemoveMsg ) Library "USER32.dll" alias for "PeekMessageW"
//WM_KEYFIRST = 0x0100 // 256
//WM_KEYLAST = 0x0108 // 264
//PM_REMOVE = 1
映射 pbm_dwnkey 事件并根据您的理念命名key
或命名它。ue_key
将此代码添加到事件中:
if 0 = keyflags and (key = KeyDash! or key = KeySubtract!) then
choose case ls_col
case "col_1", "col_2" // ... we have many columns in the list
PeekMessage( Msg, 0, 256, 264, 1 ) // see the declaration for values. this removes the message.
message.processed=TRUE
message.returnvalue=1
return
case else
// nothing else
end choose
end if
我尝试了几次以使其正确格式化,但没有成功。
我不确定设置 message.processed 和 message.returnvalue 有什么效果。它通常不会来自此事件。我在使用代码时保留了它们,因为我没有时间进行实验。
如果您使用以它开头的编辑掩码,+
则只会接受正值。加号显示,您可能会觉得不受欢迎。