2010-08-08 1 views
1

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

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

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

ответ

2

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

Сначала вы сопоставить 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 

Здесь DataWindow имеет столбец с именем значения. Я проверяю, нажата ли кнопка «-», если да, я сохраняю текущее значение и новое событие ue_filtervalue. Вывод() необходим, чтобы убедиться, что событие ue_filtervalue произойдет после оставшегося события datawindow.

Событие ue_filtervalue восстановит предыдущее значение без "-".

this.setitem(ad_row, "value", ad_value) 
this.SelectText(Len(String(ad_value)) + 1, Len(String(ad_value))) 
+0

Что делает функция выхода? –

+0

выход разрешает обработку события в очереди ожидания. Это необходимо для запуска другого события datawindow перед выполнением нашей фильтрации. – RealHowTo

+0

Я рекомендую назначить pbm_dwnkey _key_ для согласованности с элементами управления PB, которые имеют событие _key_. Вы также не хотите, чтобы в одном и том же событии имело разные имена в разных DataWindows. –

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^