Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2008, 21:20   #1
san72
Форумчанин
 
Регистрация: 04.06.2008
Сообщений: 102
Вопрос Событие Delphi

У меня есть форма, на ней компонент Image, как можно отследить что мышка находится на нём или за его пределами? Отслеживать координаты курсора неподходит, очень хорошо если есть какое-то событие, но обрабатывать OnMouseMove в моём случае тоже неподойдёт, как мне решить такую проблему?
Keep it simple, stupid
san72 вне форума Ответить с цитированием
Старый 10.10.2008, 23:51   #2
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

ИМХО никак... А ты опиши ситуацию, может чего придумаем...
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 11.10.2008, 00:11   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ну почему никак... В программировании нет ничего невозможного.
Вот, например, как я в DFaq-е это дело организовал (как раз с картинками):
Код:
...
  private
    { Private declarations }
    procedure ImCloserWindowProc(var Msg: TMessage);
...
var imclose: integer;
...
{$R *.dfm}
var
  OldCloseWindowProc: TWndMethod;

function LoadJpegRes(const ID: string): TJpegImage;
var
  RS: TResourceStream;
begin
  Result := TJpegImage.Create;
  RS := TResourceStream.Create(HInstance, ID, RT_RCDATA);
  try
    RS.Seek(0, soBeginning);
    Result.LoadFromStream(RS);
  finally
    RS.Free;
  end;
end;

procedure Tfmain.FormCreate(Sender: TObject);
var r1,r2,r3,r4: THandle;
begin
...
OldCloseWindowProc:=ImCloser.WindowProc;
ImCloser.WindowProc:=ImCloserWindowProc;
ImCloser.Perform(CM_MOUSELEAVE,0,0);
...
end;

...

procedure Tfmain.ImCloserWindowProc(var Msg: TMessage);
begin
case msg.Msg of
CM_MOUSELEAVE:
begin
if imclose<>0 then
begin
MyJpeg := LoadJpegRes('CLOSEOFF');
ImCloser.Canvas.Draw(0, 0, MyJpeg);
imclose:=0;
end;
end;
CM_MOUSEENTER:
begin
if imclose<>1 then
begin
MyJpeg := LoadJpegRes('CLOSEON');
ImCloser.Canvas.Draw(0, 0, MyJpeg);
imclose:=1;
end;
end;
end;
OldCloseWindowProc(Msg);
end;
Это картинка, которая вместо крестика для закрытия программы, так называется - ImCloser. Когда мышка на нее попадает, происходит смена картинки из ресурса, когда уходит - обратная смена. Что-то вроде "неоновой подсветки", как недавно выразился один товарищ в поисках (зачем-то!?) "неонового" компонента...

Последний раз редактировалось mihali4; 11.10.2008 в 16:20.
mihali4 вне форума Ответить с цитированием
Старый 11.10.2008, 00:13   #4
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Мир не без умных людей..
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 11.10.2008, 01:15   #5
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Цитата:
Сообщение от san72 Посмотреть сообщение
Отслеживать координаты курсора неподходит:
Подходит:

Mouse.CursorPos.X-Form1.Left
Mouse.CursorPos.Y-Form1.Top

Как раз координата будет браться не от левого верхнего угла экрана, а от левого верхнего угла Формы.
Arkuz вне форума Ответить с цитированием
Старый 11.10.2008, 01:37   #6
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (Mouse.CursorPos.X-Form1.Left>=Image1.Left) and
   (Mouse.CursorPos.X-Form1.Left<Image1.Left+Image1.Width)
   then
     if (Mouse.CursorPos.Y-Form1.Left>=Image1.Top) and
        (Mouse.CursorPos.Y-Form1.Left<Image1.Top+Image1.Height)
        then
          Label8.Caption:='Мышь НА Image1'
        else
          Label8.Caption:='Мышь ВНЕ Image1';
end;
Arkuz вне форума Ответить с цитированием
Старый 11.10.2008, 01:49   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Такое и делать по таймеру???
Нонсенс...
А предыдущий ваш пост я уже видел, но в ответе на другой вопрос san72.
Ошиблись, видимо, дорогой товарищ?

Последний раз редактировалось mihali4; 11.10.2008 в 01:52.
mihali4 вне форума Ответить с цитированием
Старый 11.10.2008, 15:57   #8
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

mihali4, просто в силу своих знаний я предложил такое... Альтернатива выплыла лишь из-за того, что автор сказал, что никаким образом нельзя ему использовать OnMouseMove... Не рационально, но работает :-)
Arkuz вне форума Ответить с цитированием
Старый 11.10.2008, 20:12   #9
san72
Форумчанин
 
Регистрация: 04.06.2008
Сообщений: 102
По умолчанию

всем спасибо, я уже сам придумал как организовать всё, ну если неполучится то использую что нибудь из ваших советов )
Keep it simple, stupid
san72 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как проипсать событие? Sanek777 Общие вопросы Delphi 3 10.08.2008 14:48
Событие terminadoor Общие вопросы Delphi 13 17.07.2008 09:25
Событие maha Общие вопросы Delphi 6 18.06.2008 18:53
Событие один раз Михаил Юрьевич Общие вопросы Delphi 4 01.04.2008 20:40
событие BeforePost azat БД в Delphi 2 17.12.2007 15:34