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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2012, 10:00   #1
Dennis777
Форумчанин
 
Регистрация: 06.11.2009
Сообщений: 203
По умолчанию On Mouse Leave не корректно работает

Ребята, очень нужна помощь! Есть имейдж, на который загружена картинка. На форме лежат 2 имейджа. По наведению на каждый срабатывает он маус мув - и подгружается другая картинка, по он маус лив - картинка сбрасывается на исходную.

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

Как это можно исправить? В чем может быть проблема?)

Код:
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Image1.Picture.LoadFromFile('заставка/2.jpg');
end;

procedure TForm1.Label1MouseLeave(Sender: TObject);
begin
Image1.Picture.LoadFromFile('заставка/1.jpg');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
doublebuffered:=true;
end;

procedure TForm1.Label2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Image1.Picture.LoadFromFile('заставка/3.jpg');
end;

procedure TForm1.Label2MouseLeave(Sender: TObject);
begin
Image1.Picture.LoadFromFile('заставка/1.jpg');
Интересный проект по изучению английского:
Английский в формате путешествия по США
Dennis777 вне форума Ответить с цитированием
Старый 24.10.2012, 13:25   #2
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Какую версию Delphi используете? Когда-то я программировал в Delphi 7 и сталкивался с этой проблемой. Информацию о том, почему так, нашел в книге Григорьева Антона "О чем не пишут в книгах по Delphi".

Дело в том, что в старых версиях Delphi (кажется, до 2006) действительно имеются проблемы с событиями MouseEnter и MouseLeave: при быстром движении курсора мыши ничего не происходит - всему виной стала их реализация в VCL.

Начиная с Delphi 2006 разработчики исправили проблему: теперь OnMouseLeave и OnMouseEnter работают как часы (сам пробовал в Delphi 2007, 2009, 2010).

Так что как вариант - переходите на Delphi 2006 и выше.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 24.10.2012, 14:31   #3
Dennis777
Форумчанин
 
Регистрация: 06.11.2009
Сообщений: 203
По умолчанию

вот у меня сейчас Delphi 7. Раньше как-то не замечал проблемы(
Блин, над будет попробывать по новее установить, но я такой консерватор)) у меня даже ворд 2003 стоит до сих пор)

Спасибо
Интересный проект по изучению английского:
Английский в формате путешествия по США
Dennis777 вне форума Ответить с цитированием
Старый 24.10.2012, 15:08   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
при быстром движении курсора мыши ничего не происходит - всему виной стала их реализация в VCL.
У ТС как раз происходит, но очень медленно.
Цитата:
То картинка сначала сменится на исходную(сработает он маус лив от первого лейбла), затем загрузится новая(он маус мув второго лейбла) и через долю секунды опять загружается предыдущая картинка.
Цитата:
Как это можно исправить? В чем может быть проблема?)
В обработке принимает участие медленная операция. LoadFromFile.

Загрузить все картинки один раз при создании формы
Код:
  TForm3 = class(TForm)
...
  private
    { Private declarations }
    R1, R2, R3: TPicture;
...
  end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  r1:=TPicture.Create;
  r1.LoadFromFile('1.jpg');
  r2:=TPicture.Create;
  r2.LoadFromFile('2.jpg');
  r3:=TPicture.Create;
  r3.LoadFromFile('3.jpg');
  self.Image1.Picture:=R1;
end;
А в событиях просто переключать картинки.
Код:
procedure TForm3.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  self.Image1.Picture:=R2;
end;

procedure TForm3.Label1MouseLeave(Sender: TObject);
begin
  self.Image1.Picture:=R1;
end;

procedure TForm3.Label2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  self.Image1.Picture:=R3;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 24.10.2012 в 15:14.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция работает не корректно! VintProg Общие вопросы Delphi 8 04.08.2011 14:54
Не корректно работает прерывание, почему? UkraineChaos Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 01.05.2011 14:11
Не совсем корректно работает программа alexchromets Помощь студентам 2 26.12.2010 19:45
Программа работает не корректно Neymexa Общие вопросы C/C++ 5 24.12.2008 19:17