データウィンドウフィールドが正の数のみを受け入れるようにしたい。どうやってやるの?
編集
列仕様の検証式システムを使用して列を検証できることはわかっています。Format
しかし、私がプロパティに入れてそれで実行できるフォーマットはありますか?
データウィンドウフィールドが正の数のみを受け入れるようにしたい。どうやってやるの?
編集
列仕様の検証式システムを使用して列を検証できることはわかっています。Format
しかし、私がプロパティに入れてそれで実行できるフォーマットはありますか?
いいえ、単純な解決策は検証ルールですが、押されたキーを実際にフィルタリングするためのより複雑な解決策が可能です。
まず、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が投稿されます。残りのデータウィンドウイベントの後にue_filtervalueイベントが発生するようにするには、yield()が必要です。
ue_filtervalueイベントは、「-」なしで以前の値を復元します。
this.setitem(ad_row, "value", ad_value)
this.SelectText( Len( String(ad_value)) + 1, Len( String(ad_value)) )
それで始まるエディットマスクを使用する場合、+
正の値のみを受け入れます。プラス記号が表示されますが、これは望ましくない場合があります。
Philip Salgannikは、2004-04-27のsybase.public.powerbuilder.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の設定が効果があるかどうかはわかりません。通常、このイベントからではありません。実験する時間がなかったので、コードを使用するときにそれらを保持しました。