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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Timer ведет себя каждый раз по разному 
V
    Опции темы
Sanek123
Дата 22.10.2011, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте.

У меня вопрос, точнее даже не вопрос , а просьба совета.

Ситуация такая: нужно при нажатии кнопки плавно вывести форму2, подержать 2-3 сек и также плавно спрятать.

При использовании Timer есть такие особенности: первый раз все выполняется на мази, во второй раз быстрее, в третий, четвертый - вовсе мигает. Понятно что таймер зависим и от загрузки ЦП и от загрузки приложения, да и сам работает с погрешностями.

При использовании DXTimer из Delphix - выполняется только первая процедура плавного появления.... и все... дальше DXTimer как будто умирает.

Вот вызов таймеров
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Label1.Caption:='Действие 1';
Form2.DXTimer2.Enabled:=false;
Form2.DXTimer1.Enabled:=true;
Form2.ShowModal;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Label1.Caption:='Действие 2';
Form2.DXTimer2.Enabled:=false;
Form2.DXTimer1.Enabled:=true;
Form2.ShowModal;
end;
 


а вот сами таймеры
Код

procedure TForm2.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
Form2.AlphaBlend:=true;
Form2.AlphaBlendValue:= Form2.AlphaBlendValue + 5;
if Form2.AlphaBlendValue = 250 then
begin
  sleep(1000);
  DXTimer2.Enabled:=true;
end;
end;

procedure TForm2.DXTimer2Timer(Sender: TObject; LagCount: Integer);
begin
DXTimer1.Enabled:=false;
Form2.AlphaBlend:=true;
Form2.AlphaBlendValue:= Form2.AlphaBlendValue - 5;
if Form2.AlphaBlendValue = 15 then
begin
Form2.Close;
end;
end;


интервал у таймеров 10мск, изначально у обоих enabled=false

подскажите что делать или другой вариант. Спасибо.
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
Akella
Дата 22.10.2011, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



всё не читал, но наверняка в цикле нужно использовать application.processmessages, а про sleep забыть
И вместо таймера сделать цикл. Зачем тебе таймер?
PM MAIL   Вверх
Sanek123
Дата 22.10.2011, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



application.processmessages я уже пробовал - эффекта ноль. а слип мне нужен для задержки иначе получается только появление и сразу исчезание.
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
Akella
Дата 22.10.2011, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



По кнопке Esc я когда-то давно так прятал форму, вроде было плавно.

Код

  if key = vk_Escape then begin
    i := 0;//fmPanel.Left;
    while i >= 0-fmPanel.Width do
    begin
      Application.ProcessMessages;
      fmPanel.Left := i;
      fmPanel.Repaint;
      Dec(i,15);
    end;
    key := 0;
    fmPanel.Close;
  end;//if key = vk_Escape then begin


Ширина формы 288 пикселей.
Форма должна была плавно появляться слева и также плавно исчезать влево (выезжать и заезжать).
PM MAIL   Вверх
Sanek123
Дата 22.10.2011, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Прошу прощения. Сам исправил ошибку. 

Оказалось DXTimer сразу убить нельзя, пришлось засунуть его вместе с OnClose формы.

Код

procedure TForm2.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
Form2.AlphaBlend:=true;
Form2.AlphaBlendValue:= Form2.AlphaBlendValue + 5;
if Form2.AlphaBlendValue = 255 then
begin
  sleep(800);
  DXTimer2.Enabled:=true;
end;
end;

procedure TForm2.DXTimer2Timer(Sender: TObject; LagCount: Integer);
begin

Form2.AlphaBlend:=true;
Form2.AlphaBlendValue:= Form2.AlphaBlendValue - 5;
if Form2.AlphaBlendValue = 5 then
begin
DXTimer1.Enabled:=false;
Form2.Close;

end;
end;


Добавлено через 5 минут и 35 секунд
Спасибо! Вопрос решен.
--------------------
Вас разыскивают бойцы 139-го порта...
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.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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