|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Оперативное получение значения из ячейки грида
Всем привет!
Уже немало лет я занимаюсь разработкой баз данных (на любительском уровне, я - самоучка). И все эти годы шли поиски оптимального варианта интерфейса БД. Казалось бы, в вопросе, как вводить/редактировать данные, всё просто - либо прямо в гриде, либо на отдельной форме. Последний вариант, безусловно, удобен наибольшими возможностями. В то же время ввод данных прямо в гриде визуально очень изящен, и - главное - сильно сокращает код (то есть усилия и время работы программиста) по сравнению с вариантом с дополнительной формой. Итак, исходные данные: ввод новых данных (Insert) прямо в гриде в поле, НЕ допускающее повторяющихся значений. Задача: оперативный (при каждом OnKeyDown или KeyPress) контроль вводимых в ячейку грида данных с выдачей пользователю оповещения (не-модального, разумеется) о том, что такая запись уже есть в БД. И вот тут я сталкиваюсь с проблемой - как получить вводимое текстовое значение из ячейки грида. Способы, предлагаемые в Инете (grid.SelectedField.AsString, или queryMyField.AsString), не подходят - вводимое значение становится доступным только после ухода из редактируемого поля и передаче фокуса ввода в соседнее поле. А так, чтобы при каждом нажатии на кнопки клавиатуры, - не выходит никак. Задумка такая: при переходе в режим вставки/редактирования активируется дополнительная панель под основным гридом, а там - дополнительный грид в режиме ReadOnly, данные в котором фильтруются при каждом изменении вводимого пользователем значения в основном гриде. Или - как вариант - можно менять цвет грида в момент, когда набранная пользователем комбинация символов совпадёт с уже имеющейся в БД в данном поле. Вариант, когда оповещение выдаётся после того как значение в уникальном поле уже введено полностью, меня не устраивает. Это сделать несложно, только это не будет удобно (на мой придирчивый взгляд к идеологии интерфейса). И вот собственно вопрос. Можно ли каким-то образом получить вводимый в ячейку грида текст, например, через свойство Canvas? Повторюсь, я самоучка, и в очень многих вопросах просто дуб дубом, в этом уж точно. Нигде не могу найти ответ на свой вопрос. Может кто подскажет, как быть? Использую грид EhLib 4.3.21. Последний раз редактировалось Guaho, 27.08.2017 в 18:32. |
#2
|
||||
|
||||
Что такое EhLib я не знаю, а с классическим это можно сделать через хак:
Код:
type TDBGrid = class(DBGrids.TDBGrid) public property InplaceEditor; end; Код:
if DBGrid1.InplaceEditor<>nil then Caption:=DBGrid1.InplaceEditor.Text; Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Guaho (27.08.2017)
|
#3
|
||||
|
||||
Спасибо! Не ожидал, что так быстро получу точный ответ на этот сложный для меня вопрос! Так долго искал безрезультатно - и вот оно, счастье!
Да, такой подход показывает содержимое ячейки грида, но почему-то с некоторым ограничением: последнее действие не учитывается. Например, я набрал текст "Ы-ку", а прочитал только "Ы-к". Далее удалил "у" - получил "Ы-ку". В общем, какое-то непонятное запаздывание на 1 ход (код выполнялся в обработчике OnKeyPress). Пробовал "методом тыка" предварительные InplaceEditor.Refresh и InplaceEditor.Update - не помогло. Но решение я таки нашёл: взял таймер, установил Interval = 100 и повесил код на OnTimer. Всё, задача решена. Ещё раз - огромное спасибо за помощь! P.S. А Ehlib - просто замечательный инструмент для баз данных. Очень навороченный грид и другие контролы, просто невероятное количество очень полезных возможностей! Если заинтересуетесь, то демо для оценки, что такое Ehlib, можно скачать тут: http://www.ehlib.com/ru/zagruzki |
#4
|
|||
|
|||
Еще в некоторых библиотеках есть OnValidate или что-то подобное. тогда не надо отлавливать нажатие каждой клавиши, а можно проверять введенное значение по окончанию ввода. Такое есть, например, в DevExpress. Ну и уж если ты так восторгаешься EhLin'ом, глянь на DevExpress'овский cxGrid
|
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Guaho (27.08.2017)
|
#5
|
||||
|
||||
Есть только Invalidate (кроме упомянутых Refresh и Update). Увы, не помогает. Только таймер спас отца русской демократии )))
|