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

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

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

Ответить
RustemNur
новенький
Сообщения: 61
Зарегистрирован: 20.02.2011 10:21:14
Откуда: Уфа

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

Сообщение RustemNur »

Имею обработчик клика по панели (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 раз.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

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

Сообщение Nik »

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

Код: Выделить всё

(Sender as TPanel).Color := clRed;
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

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

Сообщение kipar »

Если у панели свойство ParentColor установлено в True (по умолчанию), то цвет она при изменении Color не поменяет. Проверил и в дельфи и в Лазарус, если установить ParentColor в False все работает.
RustemNur
новенький
Сообщения: 61
Зарегистрирован: 20.02.2011 10:21:14
Откуда: Уфа

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

Сообщение RustemNur »

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 они изменяются, но изменяются у какого-то другого объекта(?).
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

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

Сообщение kipar »

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

Можно вывести Integer(Sender) в обоих процедурах и Integer(DialogForm.mydialogpanel), чтобы убедится, указывают ли они на один и тот же объект.
Если на один и тот же - может, панель просто не перерисовывается после обновления?
RustemNur
новенький
Сообщения: 61
Зарегистрирован: 20.02.2011 10:21:14
Откуда: Уфа

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

Сообщение RustemNur »

Так, я извиняюсь за неточность :oops:
Вариант обработчика в окне диалога

Код: Выделить всё

TDialogForm.MyDialogPanelClick(Sender: TObject);
begin
MainForm.MyPanelClick(Sender);
end;

выглядит на самом деле несколько иначе (то был первоначальный вариант, и в таком варианте - да, все работает).

Код: Выделить всё

TDialogForm.MyDialogPanelClick(Sender: TObject);
begin
MainForm.MyPanelClick(MyDialogPanel);
end;

И вот здесь объекты MyDialogPanel и Sender в его собственном обработчике - разные.
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

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

Сообщение Odyssey »

Я бы попробовал в TDialogForm.MyDialogPanelClick посмотреть Sender.ClassName, Sender.Name и т.п. (через консоль или ShowMessage). И если при клике на MyDialogPanel Sender <> MyDialogPanel -- можно идти в багтрекер.
RustemNur
новенький
Сообщения: 61
Зарегистрирован: 20.02.2011 10:21:14
Откуда: Уфа

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

Сообщение RustemNur »

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

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

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

ЗЫ: подумалось: случись подобная ситуация на Дельфи - никогда бы не стал грешить на компилятор, искал бы свою ошибку. :)
Ответить