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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2011, 12:18   #11
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Таймер нужен исключительно для удобства, пришло событие, включили таймер, он сделал свою работу и отключился. Почему не работает... не могу знать т.к. не вижу весь код, где-то ошибка. С обработкой событий MouseEnter и MouseLeave есть две неприятных мелочи, события наступают только в пределах клиентской области и когда курсор попадает на любой объект на форме, происходит событие MouseLeave.
Набросал другой вариант без описанных недостатков:
Код:
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    procedure Idle(Sender: TObject; var Done: boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

const
  a_min=80;
  a_max=240;
  a_step=4;

implementation

{$R *.dfm}

procedure TForm1.Idle(Sender: TObject; var Done: Boolean);
var
  p: TPoint;
  cb: boolean;
begin
  GetCursorPos(p);
  cb:=InRange(p.X, BoundsRect.Left, BoundsRect.Right) and
      InRange(p.Y, BoundsRect.Top, BoundsRect.Bottom);
  if (cb and (AlphaBlendValue=a_max)) or (not cb and (AlphaBlendValue=a_min)) then exit;
  with Timer1 do begin
    if cb then Tag:=1 else Tag:=-1;
    Enabled:=true;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AlphaBlend:=true;
  AlphaBlendValue:=a_min;
  Timer1.Interval:=1;
  Timer1.Enabled:=false;
  Application.OnIdle:=Idle;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  AlphaBlendValue:=EnsureRange(AlphaBlendValue+(Timer1.Tag*a_step), a_min, a_max);
  if (AlphaBlendValue=a_min) or (AlphaBlendValue=a_max) then Timer1.Enabled:=false;
end;
можно вместо OnIdle использовать второй таймер.
x128 вне форума Ответить с цитированием
Старый 13.03.2011, 12:35   #12
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
Сообщение от ArtGrek Посмотреть сообщение
на Д7 у меня не работает Leave, даже вариант asmodey1
Странно, у меня работает... именно на Д7...
Процедуры прописаны в private ?
asmodey1 вне форума Ответить с цитированием
Старый 13.03.2011, 14:10   #13
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

неа, в Д7 не катит, а в 2009 ваш тоже катик
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 14.03.2011, 20:21   #14
GreyScall
Пользователь
 
Аватар для GreyScall
 
Регистрация: 01.01.2011
Сообщений: 29
По умолчанию

Я бы не советовал пользоваться таймером... Есть же специальные функции - AnimateWindow() и TrackMouseEvent()...
Они чем-то не подходят? Или нужна поддержка более старых версий ОС?
RSDN: Как узнать, что мышь вышла за пределы окна?

А если у вас Layered-окно, то нужно просто подкорректировать альфа-канал...
Regards, GreyScall.
GreyScall вне форума Ответить с цитированием
Старый 15.03.2011, 08:45   #15
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

а разьве OnMouseEnter и OnMouseLeave не будут сбоить, когда мышь попадет на область с компонентом? К примеру, с кнопкой?
Когда-то давно я сталкивался с подобным, и, кажется, столкнулся с этим. Приходит OMouseEnter объекта кнопки, а у формы происходит OnMouseLeave....
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 15.03.2011, 10:17   #16
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Цитата:
Сообщение от GreyScall
Я бы не советовал пользоваться таймером...
Чем так таймер не угодил?
Цитата:
Есть же специальные функции - AnimateWindow() и TrackMouseEvent()...
AnimateWindow и TrackMouseEvent имеют ограничения которые в общем и обходятся "ручками" с таймером.
Цитата:
Сообщение от Johnson
а разьве OnMouseEnter и OnMouseLeave не будут сбоить
Последний пример как раз лишен этих недостатков.
x128 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
событие при наведении курсора на кнопку Droid JavaScript, Ajax 2 15.01.2011 22:02
Подсказка при наведении курсора мыши Syltan JavaScript, Ajax 2 23.04.2010 15:31
Смена картинки при наведении курсора Шсу HTML и CSS 1 26.10.2009 19:50
Выделение картинки при наведении курсора blazer-05 HTML и CSS 1 03.07.2009 10:43
увеличение излбражения при наведении курсора SKS HTML и CSS 4 08.03.2009 13:39