Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перекрытие свойств компонента [D7, WinXP]


Sphinx ©   (2004-08-28 01:42:00) 

Возник вот такой вопрос...к примеру (упростим задачу) есть что-то вроде TMoveLabel=class(TLabel)
у которого в событиях OnMouseEnter и OnMouseExit определено что будет производиться подчеркивание текста в Caption.

Можно как-нибудь создать экземпляр MoveLabel, но так чтобы эти события были бы дополнениями описаными в компоненте.

То есть в теле программы я пишу что нужно изменить цвет текста...а помимо цвета остается подчеркивание при наведении, хотя вне компонента оно не описано.

Надеюсь внятно объяснил...а то такой сумбур в голове...не дается вот эта задачка...что поделаешь - новичек :)


афвуд   (2004-08-31 11:28:00) [1]

:)

Ну сорри. Я писал компонентики для своей среды разработки приложений. Очень похожую на Дельфи и использующие её компоненты, с таким же редактором форм и т.д. Только свойства там были определённые мной. А все остальные могли управляться компонентами. Согласен - это лишь одиночный случай когда можно было применять метод [1].


Юрий Зотов   (2004-08-30 13:58:00) [2]

> афвуд   (30.08.04 12:29) [5]

> Всё верно, если это моя прога. А если пишу компонент, который
> работает именно цепляясь за некоторые обработчики других
> компонентов?

То не надо писать ТАКИЕ компоненты. НОРМАЛЬНЫЕ компоненты не должны использовать доступные юзеру события. Потому что работа компонента не должна зависеть от того, что там юзер перекрыл или не перекрыл. А при таком подходе, как у Вас, ничто не мешает юзеру перекрыть Ваши обработчики в run-time (то есть, в коде, а не в Инспекторе Объектов) - и настанет большой кирдык такому компоненту.

Так пишут ПРОГРАММЫ, а не компоненты.


афвуд   (2004-08-30 12:29:00) [3]


> А скажите, хоть раз там лежало что-то, отличное от nil?
> И если да, то каким образом оно умудрилось туда попасть?
> А если нет, то зачем его запоминать?


Всё верно, если это моя прога.
А если пишу компонент, который работает именно цепляясь за некоторые обработчики других компонентов? Тогда имхо и нужно смотреть а не перекрыл ли юзер(или другие компоненты такого же рода) их уже. А если перекрыл, то необходимо, чтобы всё работало также как юзер и ожидает, т.е. сделать так как описано в [1]. It's my IMHO :) .


Юрий Зотов   (2004-08-29 09:28:00) [4]

> Sphinx   (28.08.04 01:42)

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

Но в данном случае Вам и этого делать не нужно, а нужно использовать пример [3]. И уж тем более нельзя делать так, как Вы пишете:

> в событиях OnMouseEnter и OnMouseExit определено что будет
> производиться подчеркивание текста в Caption.

Компонент не имеет права использовать доступные юзеру обработчики событий. Потому что юзер может перекрыть их своими и компонент работать перестанет.

> афвуд   (28.08.04 11:27) [1]

> Я всегда когда перекрываю свойства-эвенты, то запоминаю, что
> лежит там до моего замещения.

А скажите, хоть раз там лежало что-то, отличное от nil? И если да, то каким образом оно умудрилось туда попасть? А если нет, то зачем его запоминать?


Алхимик   (2004-08-28 22:38:00) [5]

type
 TMoveLabel = class(TLabel)
 private
   { Private declarations }
   procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
   procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
 protected
   { Protected declarations }
 public
   { Public declarations }
 published
   { Published declarations }
 end;

...
procedure TMoveLabel.CMMouseEnter(var Message: TMessage);
begin
  inherited; // вызываем метод предка
  Font.Style := [fsUnderLine];
end;

procedure TMoveLabel.CMMouseLeave(var Message: TMessage);
begin
  inherited;
  Font.Style := [];
end;


Sphinx   (2004-08-28 21:32:00) [6]

> афвуд   (28.08.04 11:27) [1]

а ларчик просто открывался :) спасибо огромное.


афвуд   (2004-08-28 11:27:00) [7]

Я всегда когда перекрываю свойства-эвенты, то запоминаю, что лежит там до моего замещения. И всегда вызываю его после отработки моего метода. Описываешь в своём компоненте свойство OldMouseEnter:TNotifyEvent. Заполняешь его тем, что лежит в свойстве OnMouseEnter, компонента до твоего замещения. и в своём методе(чем ты перекрыл этот OnMouseEnter) вызываешь OldMouseEnter(Sender);


Наверх

Титульная страница Поиск, карта сайта Написать письмо