DbGrid: Изменить значение редактируемого текста

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

DbGrid: Изменить значение редактируемого текста

Сообщение Vadimus » 19.10.2012 15:31:10

Дано: Обычный DBGrid.
Задача: В определенном (денежном) столбце при редактировании текста, при вводе '=' производить вычисление введного выражения.
Пример: пользователь вводит "10,5+39,50=", программа перехватывает ввод, производит калькуляцию, и заменяет текст на "50,00".
Проблема: не могу найти вводимый текст, только тот что уже в наборе данных.

Пока писал, придумал вариант: отслеживать ввод пользователя по DBGRid.OnKeyUp, отслеживать все его клики и т.п., калькулировать и результат писать сразу в датасет. Может есть вариант попроще, может кто делал подобное?

Добавлено спустя 37 минут 30 секунд:
Пока писал, придумал вариант: отслеживать ввод пользователя по DBGRid.OnKeyUp, отслеживать все его клики и т.п., калькулировать и результат писать сразу в датасет.


К сожалению, этот вариант пока не получается, перехватываю текст "10,5+39,50=", калькулирую, пишу в Table['Sum'], получаю ошибку EDatabaseError: "10,5+39,50=" is not a valid float. :(
Vadimus
новенький
 
Сообщения: 19
Зарегистрирован: 11.02.2011 16:56:16

Re: DbGrid: Изменить значение редактируемого текста

Сообщение Vadim » 19.10.2012 16:31:29

Vadimus
Попробуйте запяту поменять на точку. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: DbGrid: Изменить значение редактируемого текста

Сообщение Vapaamies » 19.10.2012 17:00:46

Vadimus писал(а):отслеживать ввод пользователя по DBGRid.OnKeyUp, отслеживать все его клики и т.п.

На самом деле намного правильней перекрыть событие OnSetText у поля (TCurrencyField или TFloatField) и вычислять там.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: DbGrid: Изменить значение редактируемого текста

Сообщение Vadimus » 19.10.2012 18:49:02

Vadim писал(а):Vadimus
Попробуйте запяту поменять на точку. ;)


Увы, это не поможет. :)

Vapaamies писал(а):На самом деле намного правильней перекрыть событие OnSetText у поля (TCurrencyField или TFloatField) и вычислять там.


Вот оно! Спасибо!!! Затык преодолён!

Добавлено спустя 33 минуты 55 секунд:
Vadimus писал(а):На самом деле намного правильней перекрыть событие OnSetText у поля (TCurrencyField или TFloatField) и вычислять там.


А вот блин, выявился нелепый глюк, делаю так в OnSetText:

Код: Выделить всё
(Sender as TField).AsCurrency:=Calculate(aText);


И DBGrid начинает вести себя как последний мерзавец - глючит, мешает вводить текст, ужас. Или я в обработчике сделал ересь, или лазарус (1.0) глючит. :(
Vadimus
новенький
 
Сообщения: 19
Зарегистрирован: 11.02.2011 16:56:16

Re: DbGrid: Изменить значение редактируемого текста

Сообщение Vapaamies » 19.10.2012 19:59:33

Это уже надо отладчиком смотреть. По логике вещей, OnSetText должен вызываться один раз -- в конце, когда пользователь переходит на другое поле, либо фиксирует запись, т. е. выходит из режима редактирования. А по описанному поведению создается впечатление, что событие вызывается на ввод каждого символа.

Честно говоря, даже не помню, как это должно быть в VCL, потому как такие штуки уже давно не пишу.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: DbGrid: Изменить значение редактируемого текста

Сообщение amateur » 19.10.2012 23:07:16

А Вы пытаетесь каждое значение (символ) проганять в процедуре, или Вам нужно при нажатии определенного символа выполнить расчет?

Если второй вариант, то сетка не должна глючить. Но Вы, по идее, используете первый. Благодаря непрерывному перерасчету у Вас и проц. должен взбеситься, а не только сетка. Хотя, все зависит от процедуры расчета...
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Re: DbGrid: Изменить значение редактируемого текста

Сообщение Vadim » 20.10.2012 05:52:01

Vadimus писал(а):(Sender as TField).AsCurrency

Sender - это уже TField, поэтому приводить его к TField не надо. Правильно будет так:
Код: Выделить всё
Sender.AsCurrency:=ВычисленноеВыражение;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: DbGrid: Изменить значение редактируемого текста

Сообщение Vadimus » 20.10.2012 05:53:59

Vapaamies писал(а):По логике вещей, OnSetText должен вызываться один раз -- в конце, когда пользователь переходит на другое поле, либо фиксирует запись,


Да, так и есть в самом конце редактирования OnSetTextВызывается, 1 раз.

amateur писал(а):А Вы пытаетесь каждое значение (символ) проганять в процедуре, или Вам нужно при нажатии определенного символа выполнить расчет?


Меня в принципе устроит любой вариант, лишь бы TDBGrid не надо было бы переписывать.

amateur писал(а):Если второй вариант, то сетка не должна глючить. Но Вы, по идее, используете первый. Благодаря непрерывному перерасчету у Вас и проц. должен взбеситься, а не только сетка. Хотя, все зависит от процедуры расчета...


OnSetText выполняется 1 раз, в конце редактирования поля, после этого начинаются глюки...

Vadim писал(а):Sender - это уже TField, поэтому приводить его к TField не надо.


Действительно, спасибо! :)

Добавлено спустя 46 минут 51 секунду:
Разобрался в глюке: он начинался с строки дебага "ShowMessage('Text = '+aText);" из OnSetText. Убрал, удивительно, но всё работает. Спасибо. :)

А вот теперь ещё вопрос, в DBGrid после установки Lazarus 1.0 перестала работать BACKSPACE. Все остальные клавиши работают, приходится идти стрелками и убирать ненужный символ клавишей Del...
Vadimus
новенький
 
Сообщения: 19
Зарегистрирован: 11.02.2011 16:56:16

Re: DbGrid: Изменить значение редактируемого текста

Сообщение Vapaamies » 20.10.2012 09:59:45

Наверняка фильтр стоит в OnKeyPress, чтобы только числа и арифметику вводить, а про VK_BACKSPACE забыли.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: DbGrid: Изменить значение редактируемого текста

Сообщение amateur » 20.10.2012 16:43:50

Меня в принципе устроит любой вариант, лишь бы TDBGrid не надо было бы переписывать.
:), а заодно тогда и лазарь, если чет не получается.

Кстати: а зачем Вам расчет в ячейке? Может проще калькулятор добавить и значение в ячейку вставить (как делают многие)?
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Re: DbGrid: Изменить значение редактируемого текста

Сообщение tema » 20.10.2012 20:49:45

А что мешает элементарно посмотреть DBGrid.Cells[j,i]? Это текстовое поле в котором содержится текст из данной ячейки.
tema
постоялец
 
Сообщения: 376
Зарегистрирован: 24.03.2011 20:19:27

Re: DbGrid: Изменить значение редактируемого текста

Сообщение Vadim » 21.10.2012 06:07:33

tema писал(а):DBGrid.Cells[j,i]

А Вы уверены, что у DBGrid это есть? ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: DbGrid: Изменить значение редактируемого текста

Сообщение Vadimus » 21.10.2012 06:12:41

Vapaamies писал(а):Наверняка фильтр стоит в OnKeyPress, чтобы только числа и арифметику вводить, а про VK_BACKSPACE забыли.


Нет, обработчик уже убрал. В других dbgrid то же самое, backspace не работает. До установки 1.0 всё везде работало.

amateur писал(а):а заодно тогда и лазарь, если чет не получается.


Во-во. :)

amateur писал(а):Кстати: а зачем Вам расчет в ячейке? Может проще калькулятор добавить и значение в ячейку вставить (как делают многие)?


Ну вот сейчас у меня так: открывается форма, вводишь 10+10, нажимаешь Enter чтобы завершить операцию, всё.
А с кнопкой калькулятора: открывается форма, мееедленнно берёшь мышку в руку, ищешь милипусенькую кнопку калькулятора, пытаешься тыкнуть в неё, затем вводишь 10, потом берешь в руки мышку и тыкаешь кнопку "+", потом набираешь 10, затем ищешь кнопку "равно", нажимаешь, получаешь результат, закрываешь калькулятор, нажимаешь enter, чтобы завершить операцию... :wink:

tema писал(а):А что мешает элементарно посмотреть DBGrid.Cells[j,i]? Это текстовое поле в котором содержится текст из данной ячейки.


В Lazarus такого нет.
Vadimus
новенький
 
Сообщения: 19
Зарегистрирован: 11.02.2011 16:56:16

Re: DbGrid: Изменить значение редактируемого текста

Сообщение tema » 21.10.2012 07:09:27

Vadim писал(а):
tema писал(а):DBGrid.Cells[j,i]

А Вы уверены, что у DBGrid это есть? ;)

Да вижу. В лазарусе с этим проблема. Это у дельфи можно сделать доступным.
tema
постоялец
 
Сообщения: 376
Зарегистрирован: 24.03.2011 20:19:27

Re: DbGrid: Изменить значение редактируемого текста

Сообщение amateur » 21.10.2012 10:58:50

А с кнопкой калькулятора: открывается форма, мееедленнно берёшь мышку..
это все от Вашей фантазии. Клавиши 1..9 + - не учили нажимать? Тот же эффект как и от миши... При фокусе ячейки отобразили диалог, нажали свое вычисление и ентер - значение в ячейке.

А за переписывать лазарус - сарказм...
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 230

Рейтинг@Mail.ru