1

我想让一个数据窗口字段只接受正数。我怎样才能做到这一点?

编辑

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

4

3 回答 3

2

不,简单的解决方案是验证规则,但真正过滤按下的键的更复杂的解决方案是可能的。

首先,将用户事件 ( 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)) )
于 2010-08-08T17:41:57.080 回答
1

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 有什么效果。它通常不会来自此事件。我在使用代码时保留了它们,因为我没有时间进行实验。

于 2011-07-29T21:31:50.633 回答
1

如果您使用以它开头的编辑掩码,+则只会接受正值。加号显示,您可能会觉得不受欢迎。

于 2010-08-09T04:16:32.960 回答