Идея взята у Владимира Соколова. Реализация моя, пользоваться могут все :)
При введении части слова в поле справочника заполнять его сразу же без вызова диалога, если найдено только одно значение. Например, в поле Страна ввели "Укр", и при нажатии Enter, сразу бы заполнилось "Украина" (Экономится 2 никому не нужных нажатия клавиши). (с) Владимир Соколов.
Конечно же, полноценная реализация требует изменения в ядре tscrm. В Open Source Террасофт пока еще не подался, поэтому ищем обходные варианты.
В scr_SelectData переписываем
var LookupControlCoCLassGUID = '{0D859F8D-17A3-430A-B237-ACD31C474D26}';
function wnd_SelectDataExOnShow(Window) {
OpenSelectDataDataset();
var CoClassGUID = Self.Attributes('NotifyObject').CoClassGUID;
if (((CoClassGUID == LookupDataControlCoCLassGUID) ||
(CoClassGUID == LookupControlCoCLassGUID)) &&
dlData.Dataset.PageRecordsCount == 1){
Timer.IsEnabled = true;
} else {
LocateByKeyValue();
UpdateEditStatus();
SetFocusToEdit();
}
}
В wnd_SelectData добавляем компонент Timer. IsEnabled = false, Interval=10. Тут со значением 10, возможно, нужно поексперементировать. Я поставил 10 наобум,работает нормально. На OnTimer вешаем
btnOkOnClick(btnOk);
Timer.IsEnabled = false;
}
Буду рад услышать комментарии\пожелания\советы.
Зачем таймер?
Можно после нажатия клавиши, делать поиск в справочнике, если запись одна - подставлять значение в поле
"Попов Александр" написал:Зачем таймер?
Таймер нужен просто что-бы закрыть окно. В OnShow это делать нельзя - ругается.
"Попов Александр" написал:
Можно после нажатия клавиши, делать поиск в справочнике, если запись одна - подставлять значение в поле
Не совсем понял что Вы имеете ввиду. В каком скрипте, по какому событию? Как быть с тем, что из ядра(?) у окна wnd_SelectData вызывается Show?
А что происходит в случае если "Укр" выдаст два значения Украина и Украинистан :), к примеру? Или если не будет записей соответствующих введённым начальным символам?
---
Конфигурация:
TSCRM 3.3.1.59
Firebird 2.0 (v.2.0.3.12981)
ClientOS: Vista Home Premium
ServerOS: Windows 2003 Server
Будет то же самое что и сейчас происходит. Селектдата будет отображаться либо с гридом в котором боле одной записи, либо с пустым гридом.
"Швец Александр" написал:А что происходит в случае если "Укр" выдаст два значения Украина и Украинистан :), к примеру? Или если не будет записей соответствующих введённым начальным символам?
Если два значения, то будет работать как обычно, если ни одного тоже, откроется пустое окно.
"Underscore a.k.a. _" написал:Self.Attributes('NotifyObject').CoClassGUID
Вот это бы в переменную предварительно занести для лучшей читабельности.
Согласен, просто в первой версии я упустил недатаконтролы, а потом просто скопипейстил.
В первоначальном коде исправил одну неприятную вещь: когда значение в справочном поле выбрано и я хочу, например, посмотреть карточку выбранной записи через окно выбора значения из справочника, то я это не смогу сделать, поскольку окно выбора значения из справочника будет сразу закрываться (запись одна в справочнике по указанному тексту).
Чтобы значение подставлялось автоматически только тогда, когда в поле не выбрано значение (ID равен NULL), добавил еще одну проверку:
Для LookupDataControl
IsEmptyGUID(Self.Attributes('NotifyObject').DataField.Value)
Для LookupControl
IsEmptyGUID(Self.Attributes('NotifyObject').Value)
В итоге код получился следующий:
var LookupDataControlCoCLassGUID = '{837F2428-271C-4013-BB17-521466E17BC3}'; var LookupControlCoCLassGUID = '{0D859F8D-17A3-430A-B237-ACD31C474D26}'; function wnd_SelectDataExOnShow(Window) { OpenSelectDataDataset(); if ((((Self.Attributes('NotifyObject').CoClassGUID == LookupDataControlCoCLassGUID) && IsEmptyGUID(Self.Attributes('NotifyObject').DataField.Value)) || ((Self.Attributes('NotifyObject').CoClassGUID == LookupControlCoCLassGUID) && IsEmptyGUID(Self.Attributes('NotifyObject').Value))) && (dlData.Dataset.PageRecordsCount == 1)) { Timer.IsEnabled = true; } else { LocateByKeyValue(); UpdateEditStatus(); SetFocusToEdit(); } }