Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.08.2017, 18:29
Guaho Guaho вне форума
Прохожий
 
Регистрация: 27.08.2017
Сообщения: 20
Версия Delphi: Delphi7
Репутация: 10
По умолчанию Оперативное получение значения из ячейки грида

Всем привет!
Уже немало лет я занимаюсь разработкой баз данных (на любительском уровне, я - самоучка). И все эти годы шли поиски оптимального варианта интерфейса БД. Казалось бы, в вопросе, как вводить/редактировать данные, всё просто - либо прямо в гриде, либо на отдельной форме. Последний вариант, безусловно, удобен наибольшими возможностями. В то же время ввод данных прямо в гриде визуально очень изящен, и - главное - сильно сокращает код (то есть усилия и время работы программиста) по сравнению с вариантом с дополнительной формой.
Итак, исходные данные: ввод новых данных (Insert) прямо в гриде в поле, НЕ допускающее повторяющихся значений.
Задача: оперативный (при каждом OnKeyDown или KeyPress) контроль вводимых в ячейку грида данных с выдачей пользователю оповещения (не-модального, разумеется) о том, что такая запись уже есть в БД.
И вот тут я сталкиваюсь с проблемой - как получить вводимое текстовое значение из ячейки грида. Способы, предлагаемые в Инете (grid.SelectedField.AsString, или queryMyField.AsString), не подходят - вводимое значение становится доступным только после ухода из редактируемого поля и передаче фокуса ввода в соседнее поле. А так, чтобы при каждом нажатии на кнопки клавиатуры, - не выходит никак. Задумка такая: при переходе в режим вставки/редактирования активируется дополнительная панель под основным гридом, а там - дополнительный грид в режиме ReadOnly, данные в котором фильтруются при каждом изменении вводимого пользователем значения в основном гриде. Или - как вариант - можно менять цвет грида в момент, когда набранная пользователем комбинация символов совпадёт с уже имеющейся в БД в данном поле.
Вариант, когда оповещение выдаётся после того как значение в уникальном поле уже введено полностью, меня не устраивает. Это сделать несложно, только это не будет удобно (на мой придирчивый взгляд к идеологии интерфейса).
И вот собственно вопрос. Можно ли каким-то образом получить вводимый в ячейку грида текст, например, через свойство Canvas? Повторюсь, я самоучка, и в очень многих вопросах просто дуб дубом, в этом уж точно. Нигде не могу найти ответ на свой вопрос. Может кто подскажет, как быть? Использую грид EhLib 4.3.21.

Последний раз редактировалось Guaho, 27.08.2017 в 18:32.
Ответить с цитированием
  #2  
Старый 27.08.2017, 19:15
Аватар для NumLock
NumLock NumLock сейчас на форуме
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,391
Версия Delphi: 7, XE5
Репутация: 59585
По умолчанию

Что такое 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  
Старый 27.08.2017, 20:28
Guaho Guaho вне форума
Прохожий
 
Регистрация: 27.08.2017
Сообщения: 20
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Спасибо! Не ожидал, что так быстро получу точный ответ на этот сложный для меня вопрос! Так долго искал безрезультатно - и вот оно, счастье!
Да, такой подход показывает содержимое ячейки грида, но почему-то с некоторым ограничением: последнее действие не учитывается. Например, я набрал текст "Ы-ку", а прочитал только "Ы-к". Далее удалил "у" - получил "Ы-ку". В общем, какое-то непонятное запаздывание на 1 ход (код выполнялся в обработчике OnKeyPress). Пробовал "методом тыка" предварительные InplaceEditor.Refresh и InplaceEditor.Update - не помогло. Но решение я таки нашёл: взял таймер, установил Interval = 100 и повесил код на OnTimer. Всё, задача решена. Ещё раз - огромное спасибо за помощь!
P.S. А Ehlib - просто замечательный инструмент для баз данных. Очень навороченный грид и другие контролы, просто невероятное количество очень полезных возможностей! Если заинтересуетесь, то демо для оценки, что такое Ehlib, можно скачать тут: http://www.ehlib.com/ru/zagruzki
Ответить с цитированием
  #4  
Старый 27.08.2017, 21:33
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 6,952
Репутация: 49086
По умолчанию

Еще в некоторых библиотеках есть OnValidate или что-то подобное. тогда не надо отлавливать нажатие каждой клавиши, а можно проверять введенное значение по окончанию ввода. Такое есть, например, в DevExpress. Ну и уж если ты так восторгаешься EhLin'ом, глянь на DevExpress'овский cxGrid
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Guaho (27.08.2017)
  #5  
Старый 27.08.2017, 21:58
Guaho Guaho вне форума
Прохожий
 
Регистрация: 27.08.2017
Сообщения: 20
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Есть только Invalidate (кроме упомянутых Refresh и Update). Увы, не помогает. Только таймер спас отца русской демократии )))
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2017

ВКонтакте   Facebook   Twitter