数据窗口字段:仅接受正数

时间:2010-08-08 07:17:10

标签: powerbuilder datawindow

我想让datawindow字段只接受正数。我怎么能这样做?

修改

我知道我可以使用列规范的验证表达系统来验证列。但有没有可用的格式我可以放入Format属性并完成它?

3 个答案:

答案 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事件,并根据您的哲学将其命名为keyue_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是否有效。它通常不会发生此事件。我在使用代码时保留了它们,因为我没有时间进行实验。