Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.053 c
15-1182117601
Kostafey
2007-06-18 02:00
2007.07.15
С днем рождения ! 17 июня


3-1176715361
Laymer
2007-04-16 13:22
2007.07.15
Картинка и Blob поле


15-1181904165
Piter
2007-06-15 14:42
2007.07.15
Мощность мотоциклов


2-1182524043
nord489
2007-06-22 18:54
2007.07.15
Работа с датой


15-1182132141
linzaolog
2007-06-18 06:02
2007.07.15
бесплатная программа - аналог StyleXp





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский