Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.15;
Скачать: CL | DM;

Вниз

click по вложеным объектам   Найти похожие ветки 

 
_Asph ©   (2007-06-22 14:34) [0]

Делаю компонент на TWinControl лежит Img:Timage.
Как сделать чтобы Click срабатывал и по щелчку на Img?
Сейчас он срабатывает только по области не занятой вложенными объектами.
Вот сокращенный код.
Как вообще ловить клик по имиджу?

Tkvmec = class(TWinControl)
 private
    Fonclick: TNotifyEvent;
 protected
   procedure Click;override;

 published
   constructor Create(AOwner: TComponent); override;
   Img:Timage;
   property Onclick: TNotifyEvent read Fonclick write Fonclick;
end;


 
Инс   (2007-06-22 14:37) [1]

Да не нужно перекрывать Click, просто назначьте в конструкторе
Img.OnClick:=Self.OnClick;

PS: Поля в секции published - не хорошо


 
Однокамушкин   (2007-06-22 14:50) [2]


> Инс   (22.06.07 14:37) [1]
> Да не нужно перекрывать Click, просто назначьте в конструкторе
> Img.OnClick:=Self.OnClick;

И в результате этого при щелчке на Image программа получит Sender неизвестного ей компонента, да ещё почему-то имеющего тип TImage вместо Tkvmec... А вдруг пользователь компонента захочет реализовать какую-то логику с анализом Sender, типа назначения нескольким компонентам одного обработчика с анализом значения Tag? Лучше уж всё сразу делать по уму... Тем более что автору вопроса нужно, чтобы при нажатии на Image срабатывал Click, а не OnClick...

Tkvmec = class(TWinControl)
private
   Fonclick: TNotifyEvent;
   procedure ImageClick(Sender: TObject);
   Img:TImage; // !!!!!!! Не нужно помещать поля в published, для этого есть свойства
protected
  procedure Click;override;
  ...
end;

...
Img := TImage.Create;
Img.OnClick := ImageClick;
...

procedure Tkvmec.ImageClick(Sender: TObject);
begin
 Click;
end;


 
Инс   (2007-06-22 14:57) [3]


> Однокамушкин   (22.06.07 14:50) [2]


Ну, раз уже говорить про хороший стиль, то строить такие вот составные компоненты, а потом думать, как это все сделать одним целым - тоже не хорошо. Вместо того же TImage можно просто рисовать картинку в обработчике WM_PAINT и будет вам счастье...


 
_Asph ©   (2007-06-22 15:00) [4]

а можно

> procedure ImageClick(Sender: TObject);
>    Img:TImage; // !!!!!!! Не нужно помещать поля в published,
>  для этого есть свойства

перенести в секцию protected?
Иначе Img надо переписать как FImg.
В общем конечно не принципиально, но хочется понять.


 
Инс   (2007-06-22 15:01) [5]


> Иначе Img надо переписать как FImg.


Да нет, нужно объявить property Img: TImage read FImg;
Слышали термин "Инкапсуляция"?


 
Ega23 ©   (2007-06-22 15:04) [6]


> перенести в секцию protected?
> Иначе Img надо переписать как FImg.
> В общем конечно не принципиально, но хочется понять.


Назвать хоть буквой "Зю" можно. Не в этом дело.
Чем private отличается от protected, public и published?


 
_Asph ©   (2007-06-22 15:15) [7]


> Вместо того же TImage можно просто рисовать картинку в обработчике
> WM_PAINT и будет вам счастье...

Ну это пока для меня сложно.
Требуемые функции компонент выполняет)
Только вот с кликом (вообще с событиями), не могу до конца понять.
Все подсказки услышал. Спасибо.

у меня есть Fonclick: TNotifyEvent;
и  property Onclick: TNotifyEvent read Fonclick write Fonclick;
сделал по аналогии с умными книжками)))

На форме куда кладу компонент, у него появлятся Event.
А вот как его с кликом то связать.
Читаю, а догнать не могу.
Вот с имиджем за 5 минут помогли)))
а я вчера весь день проэксперементировал.


 
Ega23 ©   (2007-06-22 15:24) [8]


> На форме куда кладу компонент, у него появлятся Event.
> А вот как его с кликом то связать.
> Читаю, а догнать не могу.
> Вот с имиджем за 5 минут помогли)))
> а я вчера весь день проэксперементировал.


type
TMyForm=class(TForm)
  FOnMyClick : TNotifyEvent;
  ........
  procedure FormClick(Sender : TObject);

  property OnMyClick : TNotifyEvent read FOnMyClick write FOnMyClick;

  constructor Create(AOwner : TComponent);
end;

constructor  TMyForm.Create(AOwner : TComponent);
begin
 inherited Create(AOwner);
 Self.OnClick := FormClick;
end;

procedure TMyForm.FormClick(Sender : TObject);
begin
 if Assigned(FOnMyClick) then FOnMyClick(Sender);
end;


Что-то типа этого...



Страницы: 1 вся ветка

Текущий архив: 2007.07.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
15-1182227955
sergeyst
2007-06-19 08:39
2007.07.15
Есть абракадабра


15-1181582567
DillerXX
2007-06-11 21:22
2007.07.15
Вопрос к тем, кто программировал мобильники


6-1165907575
Rentgen
2006-12-12 10:12
2007.07.15
image/gif - Mozilla отображается, а в ослике нет.


2-1182245713
Alexys
2007-06-19 13:35
2007.07.15
Ввод действительных чисел.


2-1182516156
wezzz
2007-06-22 16:42
2007.07.15
Как получить имя каталога из имени файла?