![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
chikistbuch |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 15.3.2008 Репутация: нет Всего: 1 |
Всем привет. Изменение данных в ячейках DBGrid'а делаю через обычный TEdit, чтобы контролировать что вводит пользователь. ChangeCell Вызывается при двойном нажатии на ячейку DBGrid'а. События описанные в Edit.OnKeyPress, Edit.OnExit хорошо работают, а вот Edit.OnChange не обрабатывается. Т.е. всё что написано в EditChange попросту не выполняется. Чё за нах??
На всякий случай:
|
||||||||
|
|||||||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Тут только отладчик скажет в чем же дело. Есть подозрения, что typ все-такие не равен 'real', но это только догадки. Возможно событие не назначено конкретному компоненту, как вариант.
Создай тестовый проект с воспроизводящейся этой ошибкой и выложи весь проект сюда, посмотрим. -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
chikistbuch |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 15.3.2008 Репутация: нет Всего: 1 |
До этого даже не доходит. Т.е. если я ставлю BREAK (BREAKPOINT), то при запуске проги на нём не происходит остановка выполнения кода: ![]() А события описанные:
Выполняются. хз |
|||
|
||||
БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
OnChange не вызывается из-за назначения Parent'ом грида.
С причиной не разбирался. Если назначить Parent'ом форму (Self), то OnChange нормально вызывается. В данном случае не вижу препятствий сделать именно так, нужно будет только пересчитать координаты. |
|||
|
||||
chikistbuch |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 15.3.2008 Репутация: нет Всего: 1 |
Нифига, всё равно не обрабатывается OnChange! |
||||
|
|||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Для начала почитай про owner и parent. что это и с чем едят, различия и т.д.
|
|||
|
||||
chikistbuch |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 15.3.2008 Репутация: нет Всего: 1 |
Akella, спасибо! Почитал вот эту статью и вроде бы как понял, что "компонент-родитель должен уметь принимать и обрабатывать сообщения от системы Windows". Походу DBGrid не отлавливает OnChange вот и ничего не получалось. Вот работающий код:
В принципе БелАмор говорил это же, только я его не понял ))) Это сообщение отредактировал(а) chikistbuch - 20.10.2013, 17:42 |
||||
|
|||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
||||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Очень интересный подход, особенно если учесть, что Sender - это TDBGrid. Почему бы просто не указать там Form1 или Self, тем более что вся эта индийская конструкция все-равно вернет именно это?
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
Насколько я понял, у автора грид лежит на панели и он хотел указать родителем именно панель. Процитированный вариант работать будет, однако в нём заложена логическая ошибка, хотя и не приводящая к фактической. Думаю, стоит этот момент разобрать хотя бы кратко. 1. Как уже сказали, Sender здесь ссылается на грид (объект типа TDBGrid). 2. Ошибки компиляции в этом месте не возникает потому, что приведение типа производится жёсткое, без проверки реального типа объекта, а компилятору в случае жёсткого приведения по-барабану что к чему приводить и каковы будут последствия. 3. Во время выполнения программы ошибки в этом месте не возникает потому, что и TPanel, и TDBGrid наследуют свойство Parent от их дальнего общего предка TControl. Обращение к необщему свойству привело бы к ошибке. Приведение с проверкой Edit.Parent:=(Sender as TPanel).Parent также привело бы к ошибке. Правильным вариантом было бы приведение либо к TDBGrid, либо к любому его предку вплоть до TControl. 4. Если Sender в процедуре используется многократно, то логично завести локальную переменную нужного типа (здесь - TDBGrid или предка), один раз присвоить ей значение (причём лучше с проверкой типа, через as) и вместо TDBGrid(Sender).Parent спокойно писать g.Parent 5. Edit:=TEdit.Create(Form1); - это опять-же, грубейшая логическая ошибка, в частном случае не приводящая к фактической. TForm1 - класс. Экземпляров класса (объектов) в общем случае может быть много. Form1 - это переменная-указатель (4 или 8 байт), которая может указывать только на один экземпляр формы. А может и не указывать вообще никуда. А все формы класса TForm1 должы работать, сколько бы их ни было создано. И работать со своими данными. Короче, правильным вариантом записи было бы Edit:=TEdit.Create(Self); Разберитесь что такое Self. 6. Посмотрите статью: Жизнь и смерть в режиме run-time Ваша процедура с указанными исправлениями могла бы выгледеть примено так:
|
|||
|
||||
Zadnica |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 18.10.2013 Репутация: нет Всего: нет |
Модератор: Сообщение скрыто. |
|||
|
||||
chikistbuch |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 15.3.2008 Репутация: нет Всего: 1 |
БелАмор, вот это разжевал! И не поленился столько писать!! Зачёт и спасибо
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |