Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.04.2012, 21:53
Аватар для Fantomas_RUS
Fantomas_RUS Fantomas_RUS вне форума
Прохожий
 
Регистрация: 12.10.2010
Сообщения: 47
Репутация: 11
Вопрос События в компоненте?

Суть такая: Создал компонент на основе TImage. Теперь хочу создать в нём событие, которое будет реагировать, когда курсор на него наводиться. Но как это сделать? Если бонально просто, в TImage нет сообытия OnMove. Как же его туда добавить? Просто по сообщениям из Windows пока ни изучил материал. Как это хоть делаеться?
Код:

Код:
type
  TMyEvent =  procedure(Sender: TObject) of object;
  TButonImage = class (TImage)
  private
    Events: TApplicationEvents;
    fIndex: Integer;
    fOnMouseMove: TMyEvent;
    procedure DoOnMouseMove(Sender:TObject);
    procedure SetIndex(Index:Integer);
    procedure SetPicture(Name:string);

  published
    property Index: Integer read fIndex write SetIndex;
    property OnMouseMove: TMyEvent read fOnMouseMove;
  public
    constructor Create(Aowner: TComponent);
end;

implementation

uses Unit1;
{ ButonImage }

constructor TButonImage.Create(Aowner: TComponent);
begin
  inherited Create(Aowner);
  Parent:=TWinControl(Aowner);
  Self.Height:=100;
  Self.Width:=100;
SetIndex(0);
Self.Perform(WM_MOUSEMOVE,0,0);
end;

procedure TButonImage.DoOnMouseMove(Sender: TObject);
begin
  if Sender = Self then
    if Assigned(fOnMouseMove) then fOnMouseMove(Self)
    else
      begin
      SetIndex(0);
      end;
end;

procedure TButonImage.SetIndex(Index: Integer);
begin
fIndex:=Index;
case fIndex of
  -1: SetPicture('11.png');
   0: SetPicture('12.png');
   1: SetPicture('13.png');
end;
end;

procedure TButonImage.SetPicture(Name: string);
begin
Self.Picture.LoadFromFile(Name);
end;

end.
Ответить с цитированием
  #2  
Старый 06.04.2012, 21:59
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Fantomas_RUS
... Если бонально просто, в TImage нет сообытия OnMove...
Ух ты, и куда оно делось? Хоть в исходники ExtCtrls.pas загляни.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 06.04.2012, 22:08
Аватар для Fantomas_RUS
Fantomas_RUS Fantomas_RUS вне форума
Прохожий
 
Регистрация: 12.10.2010
Сообщения: 47
Репутация: 11
По умолчанию

Цитата:
Сообщение от angvelem
Ух ты, и куда оно делось? Хоть в исходники ExtCtrls.pas загляни.
Спасибо. Тогда такой вопрос, извеняюсь за свою не компетентность, события OnMove в TImage его нет, тогда как его взять и добавить из ExtCtrls?
Ответить с цитированием
  #4  
Старый 06.04.2012, 22:15
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Какое событие OnMove? В TImage имеется событие OnMouseMove.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 06.04.2012, 22:54
Аватар для Fantomas_RUS
Fantomas_RUS Fantomas_RUS вне форума
Прохожий
 
Регистрация: 12.10.2010
Сообщения: 47
Репутация: 11
Вопрос

Цитата:
Сообщение от angvelem
Какое событие OnMove? В TImage имеется событие OnMouseMove.
Вот что у меня выдаёт на ввод OnM.....

Так что я не так набираю?
Изображения
Тип файла: jpg Untitled-1.jpg (96.3 Кбайт, 8 просмотров)
Ответить с цитированием
  #6  
Старый 06.04.2012, 23:03
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Я так понимаю, нужно полностью самостоятельно обработать событие OnMouseMove. Можно сделать так:
Код:
  TButonImage = class (TImage)
...
  protected
    procedure MouseMove(Sender : TObject; Shift : TShiftState; X, Y : Integer);
...
  end;
...
constructor TButonImage.Create(Aowner: TComponent);
begin
...
  OnMouseMove := MouseMove;
end;

procedure TButonImage.MouseMove(Sender : TObject; Shift : TShiftState; X, Y : Integer);
begin
...
end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Fantomas_RUS (06.04.2012)
  #7  
Старый 06.04.2012, 23:15
Аватар для Fantomas_RUS
Fantomas_RUS Fantomas_RUS вне форума
Прохожий
 
Регистрация: 12.10.2010
Сообщения: 47
Репутация: 11
По умолчанию

Подскажи пожалуйста, я так понял, можно таким способом любые события ввести в мой компонент, какие есть в Delphi?
Ответить с цитированием
  #8  
Старый 06.04.2012, 23:27
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Я привёл пример для события, которое уже существует. Если требуется такое, которого нет у "родителя", его нужно будет полностью описывать самому.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #9  
Старый 08.04.2012, 09:03
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Восклицание

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TExImage = class(TImage)
  private
    FOnMouseEnter: TNotifyEvent;
    FOnMouseLeave: TNotifyEvent;
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  published
    property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
    property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure MouseEnter(Sender: TObject);
    procedure MouseLeave(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TExImage }

procedure TExImage.CMMouseEnter(var Message: TMessage);
begin
  if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;

procedure TExImage.CMMouseLeave(var Message: TMessage);
begin
  if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TExImage.Create(Self) do
  begin
    Parent:=Self;
    Left:=10;
    Top:=10;
    Width:=100;
    Height:=100;
    Canvas.Brush.Color:=clBtnHighlight;
    Canvas.FillRect(ClientRect);
    OnMouseEnter:=MouseEnter;
    OnMouseLeave:=MouseLeave;
  end;
end;

procedure TForm1.MouseEnter(Sender: TObject);
begin
  TExImage(Sender).Canvas.Brush.Color:=clBtnFace;
  TExImage(Sender).Canvas.FillRect(ClientRect);
end;

procedure TForm1.MouseLeave(Sender: TObject);
begin
  TExImage(Sender).Canvas.Brush.Color:=clBtnHighlight;
  TExImage(Sender).Canvas.FillRect(ClientRect);
end;

end.
http://data.cod.ru/147629
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:31.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter