Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как в Image добавить MouseEnter и MouseLeave? 
V
    Опции темы
Elfebet
Дата 13.7.2006, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 2
Всего: 14



в факе вычитал что это делается элементарно. ну да вот
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
  private
    procedure CMMouseEnter(var msg:TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CMMouseEnter(var msg:TMessage);
begin
inherited;
{действия на вход мыши в область компонента}
end;

procedure TForm1.CMMouseLeave(var msg: TMessage);
begin
inherited;
{действия на покидание мыши области компонента}
end;

end.


но как мне присвоить enter и leave для Image1 которая на форме. уже час ковыряюсь, но все без результатно. помогите плиз. 


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Alexeis
Дата 13.7.2006, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Надо писать наследника TImage и добавить к нему указанные методы 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 13.7.2006, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Не. Для имаги не получится - это наследник от TGraphicControl.
Оно не ловит сообщений. 
PM MAIL   Вверх
Elfebet
Дата 13.7.2006, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 2
Всего: 14



ну вот я создал наследника
Код

unit ImgHover;

interface

uses
  Messages, Classes, Controls, ExtCtrls;

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

procedure Register;

implementation

procedure Register;
begin 
  RegisterComponents('Custom', [TImgHover]);
end;

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

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

end.

и как мне его использовать в своем проекте(я имею ввиду TImgHover)? 


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Alexeis
Дата 13.7.2006, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Snowy
TImage - является также наследником TControl
у которого имеются 
цитата из VCL
Цитата

procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

эти сообщения ему отправляет окно владелец, так что все должно работать!

Добавлено @ 09:51 
Цитата(Elfebet @  13.7.2006,  09:43 Найти цитируемый пост)
и как мне его использовать в своем проекте(я имею ввиду TImgHover)

Я сижу вы хотите его поместить на палитру, тогда добавляйте в пакет и он появится на панели компотентов.(а вообще можно просто невизуально создать экземпляр класса) 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Elfebet
Дата 13.7.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 2
Всего: 14



не мне ненадо его добавлять на палитру. мне нужно его использовать только в своем проекте, просто я не силен в классах. как мне вызывать этот TImgHover в своих проектах и работать с ним? 


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Alexeis
Дата 13.7.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Код

var
  image1 : TImgHover;
Begin
  image1 := TImgHover.create(form1);
  image1.parent := form1;
  image1.top := 10;
  image1.left := 10;
  image1.height := 200;
  image1.width := 300;
  image1.Canvas.LineTo(200,200);
 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 13.7.2006, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Тогда пробуем так:
Код
unit Unit1;

interface

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

type
  TImage = class(ExtCtrls.TImage)
  private    
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  end;

  TForm1 = class(TForm)
    Image1: TImage;
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TImage.CMMouseEnter(var msg:TMessage);
begin
inherited;
{действия на вход мыши в область компонента}
end;

procedure TImage.CMMouseLeave(var msg: TMessage);
begin
inherited;
{действия на покидание мыши области компонента}
end;

end.
 
PM MAIL   Вверх
Alexeis
Дата 13.7.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Sorry главного не показал
Код

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

type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure imageMouseEnter(Sender: TObject);
    procedure imageMouseLeave(Sender: TObject);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.imageMouseEnter(Sender: TObject);
begin

end;

procedure TForm1.imageMouseLeave(Sender: TObject);
begin

end;

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


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

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

procedure TForm1.btn1Click(Sender: TObject);
var
  image1 : TImgHover;
Begin
  image1 := TImgHover.create(form1);
  image1.parent := form1;
  image1.top := 10;
  image1.left := 10;
  image1.height := 200;
  image1.width := 300;
  image1.Canvas.LineTo(200,200);
  image1.OnMouseLeave := imageMouseEnter;
  image1.OnMouseEnter := imageMouseEnter;

end;
  

Это сообщение отредактировал(а) alexeis1 - 13.7.2006, 10:03


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
XVII
Дата 13.9.2007, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.9.2007

Репутация: нет
Всего: нет



Подскажите пожалуйста как сделать OnMouseLeave для TPanel1?  smile 
PM MAIL   Вверх
Snowy
Дата 13.9.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Аналогично. Только заменить в коде TImage на TPanel.
PM MAIL   Вверх
XVII
Дата 13.9.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.9.2007

Репутация: нет
Всего: нет



Цитата(Snowy @ 13.7.2006,  10:00)
Тогда пробуем так:
Код
unit Unit1;

interface

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

type
  TImage = class(ExtCtrls.TImage)
  private    
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  end;

  TForm1 = class(TForm)
    Image1: TImage;
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TImage.CMMouseEnter(var msg:TMessage);
begin
inherited;
{действия на вход мыши в область компонента}
end;

procedure TImage.CMMouseLeave(var msg: TMessage);
begin
inherited;
{действия на покидание мыши области компонента}
end;

end.

Когда я делаю так то пишет: For loop control variable must be simple variable.
PM MAIL   Вверх
Alexeis
Дата 13.9.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(XVII @  13.9.2007,  11:51 Найти цитируемый пост)
Когда я делаю так то пишет: For loop control variable must be simple variable. 


  Этот ворнинг тут не по делу он говорит о некорректном использовании переменной цикла, но тут цикла нет smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 13.9.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Так ожибка не в этом коде, а в том, который ты добавляешь.
Вот пример с панелью:
Код
unit Unit1;

interface

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

type
  TPanel = class(ExtCtrls.TPanel)
  private    
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  end;

  TForm1 = class(TForm)
    Panel1: TPanel;
  end;

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TPanel.CMMouseEnter(var Message: TMessage);
begin
  Color := clSkyBlue;
end;

procedure TPanel.CMMouseLeave(var Message: TMessage);
begin
  Color := clBtnFace;
end;

end.

PM MAIL   Вверх
XVII
Дата 16.9.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.9.2007

Репутация: нет
Всего: нет



Очень странно, в отдельности и ваш и мой код работают  а вот когда вместе то нет.

Выделяет красным эту строку:

procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;

и пишет:

[Warning] Unit1.pas(74): For loop control variable must be simple local variable
[Warning] Unit1.pas(74): For loop control variable must be simple local variable
[Error] Unit1.pas(11): Unsatisfied forward or external declaration: 'TPanel.CMMouseEnter'
[Error] Unit1.pas(12): Unsatisfied forward or external declaration: 'TPanel.CMMouseLeave'

Вот мой код:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, jpeg, Buttons;
type
  TForm1 = class(TForm)
    Image2: TImage;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel5: TPanel;
    Panel7: TPanel;
    Timer1: TTimer;
    Timer2: TTimer;
    Panel9: TPanel;
    Panel4: TPanel;
    Panel6: TPanel;
    Panel8: TPanel;
    Panel10: TPanel;
    SpeedButton1: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure Timer2Timer(Sender: TObject);
  private
  id1: Integer;
  procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
    { Private declarations }
  public
    { Public declarations }
  end;
CONST HEX : ARRAY['A'..'F'] OF INTEGER = (10,11,12,13,14,15);
var
  Form1: TForm1;
  str, str1: String;
  Int, Int1, i: integer;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
var
  p: TPoint;
  i:integer;
begin
if Msg.HotKey = id1 then
Begin
if GetCursorPos(p)=true then SetCursorPos(500,350);
Application.Restore;
Application.BringToFront;
Form1.Show;
ShowWindow(Application.Handle, sw_Hide);
for i:=0 to 200 do Alphablendvalue:=i;
Form1.Timer2.Enabled:=false;
Form1.Timer2.Enabled:=true;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
const
MOD_ALT = 1;
VK_Q = 81;
begin
str:='808080';
Int := 0;
FOR i := 1 TO Length(str) DO
IF str[i] < 'A' THEN
Int := Int * 16 + ORD(str[i]) - 48
ELSE
Int := Int * 16 + HEX[str[i]];
str1:='00D7FF';
Int1 := 0;
FOR i := 1 TO Length(str) DO
IF str1[i] < 'A' THEN
Int1:= Int1 * 16 + ORD(str1[i]) - 48
ELSE
Int1:= Int1 * 16 + HEX[str1[i]];
id1 := GlobalAddAtom('Hotkey1');
RegisterHotKey(Handle, id1, MOD_ALT, VK_Q);
Form1.Panel1.Color:=int;
Form1.Panel2.Color:=int;
Form1.Panel3.Color:=int;
Form1.Panel4.Color:=int;
Form1.Panel5.Color:=int;
Form1.Panel6.Color:=int;
Form1.Panel7.Color:=int;
Form1.Panel8.Color:=int;
Form1.Panel9.Color:=int;
Form1.Panel10.Color:=int;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(Handle, id1);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.Hide;
form2.Timer2.enabled:=true;
Form1.Timer1.Enabled:=false;
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var i:integer;
begin
if key = #27 then
begin
for i:=200 downto 0 do Form1.Alphablendvalue:=i;
Form1.Timer2.Enabled:=false;
Form1.Hide;
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
var i:integer;
begin
for i:=200 downto 0 do Form1.Alphablendvalue:=i;
Form1.Hide;
Form1.Timer2.Enabled:=false;
end;
end.


Это сообщение отредактировал(а) XVII - 16.9.2007, 14:04
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0934 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.