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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2018, 15:22   #1
exyl
Пользователь
 
Регистрация: 15.11.2014
Сообщений: 75
По умолчанию Динамическое создание TTimer и его уничтожение

Доброго времени суток. Около 4-х лет не занимался программированием (да и перед этим был самоучкой, у которого с теорией все достаточно плохо), а тут понадобилась мелочевка: в отдельном pas модуле есть такая функция по имитированию "человеческой" задержки перехода по ссылке

Код:
function DelayedLinkNavigation(const Delay_ms, DelayPercentLimit: integer; const Link: widestring; WebBrowser: TWebBrowser): boolean;
var
  Timer: TTimer;

  procedure TimerEvent(Sender: TObject);
    begin
      WebBrowser.Navigate(Link);
      (Sender as TTimer).Free;
    end;

begin
  Timer:=TTimer.Create(nil);
  Timer.Enabled:=false;
  Timer.Interval:=PercentRandomize(Delay_ms, DelayPercentLimit);
  Timer.OnTimer:=TimerEvent;
  Timer.Enabled:=true;
end;
т.е. создается таймер, задается задержка, после задержки происходит переход по линку, таймер уничтожается. Вроде просто, но, естессно, ругается на несовместимость типов в строке Timer.OnTimer:=TimerEvent; Отсюда вопрос: как пофиксить?
exyl вне форума Ответить с цитированием
Старый 29.01.2018, 16:03   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Там должна быть не просто процедура, а метод объекта.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.01.2018, 16:17   #3
exyl
Пользователь
 
Регистрация: 15.11.2014
Сообщений: 75
По умолчанию

Абсолютно точный, но настолько же бесполезный для меня ответ истинного программиста. Тогда пойду по цепочке вопросов: а как мне сделать из этой процедуры метод объекта? И как тогда туда передавать веббраузер и ссылку для перехода? Можно ли это сделать, не делая их глобальными переменными?
exyl вне форума Ответить с цитированием
Старый 29.01.2018, 16:52   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

простой но кривой
Код:
TmyTimer =class(TTimer)
private
procedure EventTimer(sender: TObject); //как мне сделать из этой процедуры метод объекта?
FWeb: TBrowser;// И как тогда туда передавать веббраузер
.... ; //и ссылку для перехода?
end;

procedure TmyTimer.EventTimer(sender: TObject);
begin
  Fweb..........;
end;

procedure ....
var
  t: TMytimer;
begin
  t:=Tmytimer.Create();
....
  t.Fweb:=...;
  t.ontimer:=t.EventTimer;  
  t.enable:=true;
  t.Free;// ни в коем случае, таймер еще не отработал
end;
и в результате потерянная память (таймер создали НО никто его не может уничтожить)

==================

EventTimer должна быть у объекта который сможет помнить про запущенный таймер до СРАБАТЫВАНИЯ.
Видимо это и должен быть WebBrowser или же ЕГО форма.
а в этом случае и DelayedLinkNvigation разумно сделать методом.
Код:
TmyWeb =...
private
  procedure EventTime(sender: TObject);
public
  procedure DelayedLinkNavigation(const Delay_ms, DelayPercentLimit: integer; const Link: widestring);
end;

TmyTimer=class(TTimer)
private
  Flink: WideString;
end;

procedure TmyWeb.DelayedLinkNavigation(const Delay_ms, DelayPercentLimit: integer; const Link: widestring);
var
  ft: TTMyTimer;
begin
  ft:=TMyTimer.Create(self);
  ...
  ft.OnTimer:=EventTime;
  ft.Flink:=link; 
  ft.Enable:=rue;//мы здесь НЕ ЖДЕМ срабатывания !!! это не Sleep!!!
//запустили и пошли дальше
end;

procedure TmyWeb.EventTime(sender: TObject);
begin
// а вот нас известили(event) что время прошло
  (sender as TTimer).Enable:=false;//остановили именно тот таймер что нам сообщил что ЕГО время прошло
 link:=(sender as TmyTimer).Flink;// и можем припомнить ссылку
 (sender as TMyTimer).Free;// и очистили память(уничтожили наш и только наш таймер)
.... //и что сделать со ссылкой в нашем браузере
end;
главное не забывать что Timer Event приходит тогда и только тогда когда все остальное выполнено.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.01.2018 в 17:02.
evg_m вне форума Ответить с цитированием
Старый 29.01.2018, 17:42   #5
exyl
Пользователь
 
Регистрация: 15.11.2014
Сообщений: 75
По умолчанию

Большое спасибо за безвозмездную трату времени на обстоятельный ответ, суть увидел, основное вспомнил.
exyl вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа на Pascal ABC. Создание и уничтожение процессов в ОС Usya100 Фриланс 0 18.12.2013 17:03
Объекты создание, уничтожение, действие gromdel Общие вопросы Delphi 9 25.04.2012 13:20
Создание и уничтожение объектов. Время жизни объектов C++/C# Anett// Помощь студентам 0 24.10.2011 23:26
Динамичесоке создание и уничтожение формы SERG1980 Общие вопросы Delphi 3 26.08.2009 10:05
Создание/уничтожение объектов nimf Общие вопросы Delphi 10 14.04.2008 10:54