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 имеет какой-либо эффект. Обычно это не происходит из этого события. Я сохранил их, когда использовал код, потому что у меня не было времени экспериментировать.
Что делает функция выхода? –
выход разрешает обработку события в очереди ожидания. Это необходимо для запуска другого события datawindow перед выполнением нашей фильтрации. – RealHowTo
Я рекомендую назначить pbm_dwnkey _key_ для согласованности с элементами управления PB, которые имеют событие _key_. Вы также не хотите, чтобы в одном и том же событии имело разные имена в разных DataWindows. –