我想让datawindow字段只接受正数。我怎么能这样做?
修改
我知道我可以使用列规范的验证表达系统来验证列。但有没有可用的格式我可以放入Format
属性并完成它?
答案 0 :(得分:2)
不,简单的解决方案是验证规则,但可以使用更复杂的解决方案来真正过滤按下的键。
首先将userevent( 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()是确保在剩余的datawindow事件之后发生ue_filtervalue事件所必需的。
ue_filtervalue事件将恢复之前的值而不使用“ - ”。
this.setitem(ad_row, "value", ad_value)
this.SelectText( Len( String(ad_value)) + 1, Len( String(ad_value)) )
答案 1 :(得分:1)
如果您使用以+
开头的编辑掩码,则它只接受正值。加号显示,您可能会觉得不合适。
答案 2 :(得分:1)
菲利普·萨尔甘尼克(Philip Salgannik)在帖子中向intercept keys from a DataWindow展示了如何 sybase.public.powerbuilder.datawindow 2004-04-27。这实际上是过滤键,而不是撤消它们。
为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是否有效。它通常不会发生此事件。我在使用代码时保留了它们,因为我没有时间进行实验。