Использование чужого обрабртчика и передача Sender [Решено]

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

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

Использование чужого обрабртчика и передача Sender [Решено]

Сообщение RustemNur » 05.05.2011 11:54:06

Имею обработчик клика по панели (TPanel) на главной форме. В обработчике изменяются некоторые свойства самой панели, т.е. той, что передана параметром Sender.
Код: Выделить всё
TMainForm.MyPanelClick(Sender: TObject);
var
pnl: TPanel;

begin
pnl := TPanel(Sender);
pnl.Color := clRed;
showmessage(pnl.Name); //для отладки
end;

В некотором окне диалога имею такую же панель, клик на которой должен быть обработан совершенно аналогично, но уже для своего Sender.
Вызываю из "местного" обработчика "главнооконный"
Код: Выделить всё
TDialogForm.MyDialogPanelClick(Sender: TObject);
begin
MainForm.MyPanelClick(Sender);
end;

Запускаю приложение, кликаю на панели в главном окне - цвет панели меняется, выскакивает окно showmessage с именем панели MyPanel. Все гуд.
Кликаю на панели в окне диалога - цвет панели НЕ меняется, выскакивает окно showmessage с именем панели MyDialogPanel. Не все гуд.
Для меня это странно. На какой тогда объект указывает переменная pnl, мне совершенно непонятно. Зуб не дам, но, кажется, такой код (вроде бы) работал в Дельфи (сейчас не могу посмотреть).
Проблема решается добавлением одной строки, которая меня самого немного веселит.
Код: Выделить всё
begin
pnl := TPanel(Sender);
pnl := TPanel(screen.ActiveForm.FindComponent(pnl.Name)); //вот эта строка
pnl.Color := clRed;
showmessage(pnl.Name); //для отладки
end;


Если не трудно, поясните, пожалуйста, ситуацию.
Последний раз редактировалось RustemNur 06.05.2011 08:16:12, всего редактировалось 1 раз.
RustemNur
новенький
 
Сообщения: 61
Зарегистрирован: 20.02.2011 11:21:14
Откуда: Уфа

Re: Использование чужого обрабртчика и передача Sender

Сообщение Nik » 05.05.2011 12:56:20

Попробуйте отказаться от переменной pnl и обращаться к передаваемой панели непосредственно:

Код: Выделить всё
(Sender as TPanel).Color := clRed;
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Использование чужого обрабртчика и передача Sender

Сообщение kipar » 05.05.2011 13:59:15

Если у панели свойство ParentColor установлено в True (по умолчанию), то цвет она при изменении Color не поменяет. Проверил и в дельфи и в Лазарус, если установить ParentColor в False все работает.
kipar
новенький
 
Сообщения: 78
Зарегистрирован: 04.03.2010 12:15:54

Re: Использование чужого обрабртчика и передача Sender

Сообщение RustemNur » 05.05.2011 14:01:45

Nik писал(а):
Код: Выделить всё
(Sender as TPanel).Color := clRed;


Так у меня тоже не работает.

Сейчас проверил под виндузом - там все работает: и "по-вашему" и "по-нашему" и "по-всякому".
В винде у меня Лазарь 0.9.30
А в линухе 0.9.29 gtk2 (ubuntu 10.04 32bit)

Лазаря 0.9.30 в Линуксе смогу проверить только вечером дома (если время будет).


Мистика. Решил еще раз проверить в винде - и кирдык, уже не работает. Только со "смешной" строчкой. Т.е. стало кроссплатформено.

Добавлено спустя 7 минут 40 секунд:
2 kipar: Свойство Color приведено лишь для примера. Там чуть более сложный обработчик. Просто я хотел показать, что свойства читаются, они имеют верные значения (тот же Name, проверял и другие), без всяких AV они изменяются, но изменяются у какого-то другого объекта(?).
RustemNur
новенький
 
Сообщения: 61
Зарегистрирован: 20.02.2011 11:21:14
Откуда: Уфа

Re: Использование чужого обрабртчика и передача Sender

Сообщение kipar » 05.05.2011 14:41:54

Хм, тогда я у себя воспроизвести ошибку не смог, все работает. Lazarus 0.9.31, fpc 2.5.1 н-я ревизия.

Можно вывести Integer(Sender) в обоих процедурах и Integer(DialogForm.mydialogpanel), чтобы убедится, указывают ли они на один и тот же объект.
Если на один и тот же - может, панель просто не перерисовывается после обновления?
kipar
новенький
 
Сообщения: 78
Зарегистрирован: 04.03.2010 12:15:54

Re: Использование чужого обрабртчика и передача Sender

Сообщение RustemNur » 05.05.2011 15:33:38

Так, я извиняюсь за неточность :oops:
Вариант обработчика в окне диалога
Код: Выделить всё
TDialogForm.MyDialogPanelClick(Sender: TObject);
begin
MainForm.MyPanelClick(Sender);
end;

выглядит на самом деле несколько иначе (то был первоначальный вариант, и в таком варианте - да, все работает).
Код: Выделить всё
TDialogForm.MyDialogPanelClick(Sender: TObject);
begin
MainForm.MyPanelClick(MyDialogPanel);
end;

И вот здесь объекты MyDialogPanel и Sender в его собственном обработчике - разные.
RustemNur
новенький
 
Сообщения: 61
Зарегистрирован: 20.02.2011 11:21:14
Откуда: Уфа

Re: Использование чужого обрабртчика и передача Sender

Сообщение Odyssey » 05.05.2011 20:12:35

Я бы попробовал в TDialogForm.MyDialogPanelClick посмотреть Sender.ClassName, Sender.Name и т.п. (через консоль или ShowMessage). И если при клике на MyDialogPanel Sender <> MyDialogPanel -- можно идти в багтрекер.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Использование чужого обрабртчика и передача Sender [Решено]

Сообщение RustemNur » 06.05.2011 08:15:35

Нашел свою ошибку. В Лазаре проблемы нет.

Если в двух словах, то это подводные камни оператора with. На главной форме, к несчастью, нашелся контрол MyDialogPanel.

Спасибо всем помогавшим. Ваши ответы заставили меня найти свою ошибку.

ЗЫ: подумалось: случись подобная ситуация на Дельфи - никогда бы не стал грешить на компилятор, искал бы свою ошибку. :)
RustemNur
новенький
 
Сообщения: 61
Зарегистрирован: 20.02.2011 11:21:14
Откуда: Уфа


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru