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

Вниз

Как проще всего определить когда мышь входит и выходит с TImage?   Найти похожие ветки 

 
Versus31 ©   (2002-11-22 12:17) [0]

Помогите новичку, пожалуйста. Нужно при входе мыши на TImage менять рисунок на другой, а при выходе - на прежний. Я сам придумал один способ, но знаю, что можно проще. Так как проще всего?


 
Игорь Шевченко ©   (2002-11-22 12:42) [1]

CM_MOUSEENTER, CM_MOUSELEAVE


 
Versus31 ©   (2002-11-23 08:46) [2]

А немного конкретней можно...? CM_MOUSEENTER, CM_MOUSELEAVE это что, события?


 
PaRL ©   (2002-11-23 10:10) [3]

Сообщения. Controls.pas.


 
Юрий Зотов ©   (2002-11-23 10:32) [4]

Пример TImage с событиями OnMouseEnter/Leave. По аналогии (просто изменив класс-предок) можно построить любой контрол с такими событиями.

TMyImage = class(TImage)
private
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
protected
procedure DoMouseEnter; dynamic;
procedure DoMouseLeave; dynamic;
published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;

procedure TMyImage.CMMouseEnter(var Msg: TMessage);
begin
inheried;
DoMouseEnter
end;

procedure TMyImage.CMMouseLeave(var Msg: TMessage);
begin
inherited;
DoMouseLeave
end;

procedure TMyImage.DoMouseEnter;
begin
if Assigned(FOnMouseEnter) then FOnMouseEnter(Self)
end;

procedure TMyImage.DoMouseLeave;
begin
if Assigned(FOnMouseLeave) then FOnMouseLeave(Self)
end;


 
Tano ©   (2002-11-23 10:44) [5]

Напиши класс - потомок TImage, в него добавь обработчики двух событий : Игорь Шевченко © (22.11.02 12:42).

type
TLiveImage = class(TImage)
procedure MEnterProc(var Message: TMessage); message CM_MOUSEENTER;
procedure MLeaveProc(var Message: TMessage); message CM_MOUSELEAVE;
end;


procedure TLiveImage.MEnterProc(var Message: TMessage);
begin
//твои действия при входе мыши в Image
end;

procedure TLiveImage.MLeaveProc(var Message: TMessage);
begin
//твои действия при выходе мыши из Image
end;


По-моему так. Вроде негде ошибиться (Писал по аналогии с другими примерами).
Тебе в таком случае прийдется самому создавать и уничтожать объект TLiveImage. Что-то вроде:


TForm1 = class(TForm)
private
{ Private declarations }
public
LiveImage :TLiveImage;
{ Public declarations }
end;

var
Form1 :TForm1;

procedure TForm1.OnCreate;
begin
LiveImage:=TLiveImage.Create(nil);
LiveImage.Parent:=Form1;
//...
end;

procedure TForm1.OnDestroy;
begin
LiveImage.Free;
//...
end;


Между прочим, раз уж ты сам создаешь объект, то при большов количестве картинок можно создать массив объектов, при этом одиноковый обработчик мыши всем достанется.
LiveImages :array[1..10] of TLiveImage;
LiveImages[i].обычные_методы_и_свойства_объекта

И еще: рекомендуется все действия с вручную создаваемыми компонентами заключать в try..finally


 
Tano ©   (2002-11-23 10:46) [6]

Пока я в off-line печатал, Господин Зотов меня опередил :-)


 
Tano ©   (2002-11-23 10:57) [7]

Удалено модератором


 
Versus31 ©   (2002-11-23 12:22) [8]

Большое Вам всем спасибо!


 
Tano ©   (2002-11-24 11:19) [9]

Удалено модератором


 
Versus31 ©   (2002-11-29 16:32) [10]

Народ, а как теперь обработать MouseDown и MouseUp на мой объект???


 
Skier ©   (2002-11-29 16:37) [11]

>Versus31
TImage.OnMouseDown
TImage.OnMouseUp ? :)


 
Versus31 ©   (2002-11-30 01:35) [12]

Короче привожу код:

type
TLiveImage = class(TImage)
procedure MEnterProc(var Message: TMessage); message CM_MOUSEENTER;
procedure MLeaveProc(var Message: TMessage); message CM_MOUSELEAVE;
end;

type
TForm1 = class(TForm)
Label1: TLabel;
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure LiveImageClick(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
LiveImage:TLiveImage;
end;

var
Form1: TForm1;
Mousein: boolean;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
LiveImage:=TLiveImage.Create(nil);
LiveImage.Parent:=Form1;
LiveImage.Picture.loadfromfile("c:/1.bmp");
Mousein:=false;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
LiveImage.Free;
end;

procedure TLiveImage.MEnterProc(var Message: TMessage);
begin
Mousein:=true;
Form1.Label1.caption:="In";
Form1.LiveImage.Picture.loadfromfile("c:/2.bmp");
end;

procedure TLiveImage.MLeaveProc(var Message: TMessage);
begin
Mousein:=false;
Form1.Label1.caption:="Out";
Form1.LiveImage.Picture.loadfromfile("c:/1.bmp");
end;

procedure TForm1.LiveImageClick(Sender: TObject);
begin
Form1.Close;
end;

end.

Почему procedure TForm1.LiveImageClick не обрабатывается? И как обработать MouseUp и MouseDown на LiveImage?


 
Versus31 ©   (2002-11-30 09:46) [13]

Ну ответьте кто-нибудь.


 
Юрий Зотов ©   (2002-11-30 10:03) [14]

> Почему procedure TForm1.LiveImageClick не обрабатывается?

Потому что обработчик не назначен событию.
LiveImage.OnClick := LiveImageClick;


> И как обработать MouseUp и MouseDown на LiveImage?
Точно так же, как и OnClick - написать и назначить обработчики.

Прочитайте вот эту статью - все подобные вопросы исчезнут навсегда:
http://www.delphikingdom.com/helloworld/runtime_comp.htm



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

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

Наверх




Память: 0.5 MB
Время: 0.012 c
7-28320
Евген
2002-10-07 13:10
2002.12.09
Включение / выключение монитора


3-27903
ruslanyd
2002-11-20 15:05
2002.12.09
Удаление записей


3-27867
kostik78ua
2002-11-21 10:29
2002.12.09
Сортировка


4-28343
NIVA
2002-10-25 08:20
2002.12.09
Язык по умолчанию


3-27890
бобёр
2002-11-21 12:49
2002.12.09
Синхронизация таблиц