Поле окна данных: принимать только положительные числа - PullRequest
1 голос
/ 08 августа 2010

Я хочу, чтобы поле datawindow принимало только положительные числа.Как я могу это сделать?

Редактировать

Я знаю, что могу проверить столбец, используя систему выражений проверки спецификации столбца.Но есть ли какой-нибудь формат, который я могу поместить в свойство Format и покончить с этим?

Ответы [ 3 ]

2 голосов
/ 08 августа 2010

Нет, простое решение - это правило проверки, но возможно более сложное решение для реальной фильтрации нажатой клавиши.

Сначала вы сопоставляете userevent ( ue_nonnegative ) с элементом управления datawindow.событие 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

Здесь в окне данных есть столбец с именем значение .Я проверяю, нажата ли клавиша "-", если да, я сохраняю текущее значение, и публикуется новое событие 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)) )
1 голос
/ 30 июля 2011

Филипп Салганник показал, как перехватывать ключи из окна данных в сообщении 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 имеет какой-либо эффект. Обычно это не от этого события. Я сохранил их, когда использовал код, потому что у меня не было времени на эксперименты.

1 голос
/ 09 августа 2010

Если вы используете маску редактирования, которая начинается с +, она будет принимать только положительные значения. Отображается знак плюс, который может показаться вам нежелательным.

...