как реализовать таймер в юните [решено]

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

как реализовать таймер в юните [решено]

Сообщение minoshi » 21.10.2013 19:12:02

Доброго времени суток!

Обнаружил у себя огромный провал знаний :-/
Среда программирования MSEide.
Суть проблемы: в отдельный юнит выделен набор функций и процедур - своеобразное ядро программы - которые вызываются в основной программе по клику на кнопки. НУЖНО в этот юнит вписать таймер, который будет стартовать в процедуре pk_init. Задача таймера проста - считать время от начала выполнения процедуры pk_init и записывать значение в переменную pk_time. Время нужно считать именно в юните, основная программа может только запросить сколько времени прошло, тут без вариантов.

основная программа:
Код: Выделить всё
uses
   ..., pkernel;

procedure tmainfo.on_start_click(const sender: TObject);
begin
  pk_init;
end;

procedure tmainfo.on_get_time_click(const sender: TObject);
begin
  tlabel1.caption := inttostr(pk_time);
end;

Юнит:
Код: Выделить всё
unit pkernel;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}

interface
uses msestrings, classes, sysutils, msetimer;

var
  pk_time : integer;
 
  procedure on_timer(const sender : TObject);   // провал в знаниях здесь, как правильно прописать?
 
  procedure pk_init;
  procedure pk_close;

implementation

var
  ttimer1 : ttimer;

procedure on_timer(const sender : TObject);
begin
  inc(pk_time);
end;
 
procedure pk_init;
begin
  ttimer1 := ttimer.create(nil);
  ttimer.ontimer := @on_timer;
  pk_time := 0;
  ttimer1.enabled := true;
end;

procedure pk_close;
begin
  ttimer1.free;
end;

end.

Собственно провал в знаниях в том, как правильно прописать процедуру on_timer?
Последний раз редактировалось minoshi 22.10.2013 09:03:39, всего редактировалось 1 раз.
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Re: как реализовать таймер в юните

Сообщение debi12345 » 21.10.2013 21:14:21

Секция "initialization"?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: как реализовать таймер в юните

Сообщение SeZuka » 22.10.2013 08:14:18

Не знаю как в MSE, но обычно событийные процедуры должны быть объектными, то есть объявленными в объекте, о чем говорит описание их типа:
Код: Выделить всё
  TNotifyEvent = procedure(Sender: TObject) of object;

Сделайте так:
Код: Выделить всё
type
  TMyTimer = class(TTimer)
    procedure on_timer(sender : TObject);
  end;
...

procedure pk_init;
begin
  ttimer1 := TMyTimer.create(nil);
  ttimer1.ontimer := @ttimer1.on_timer;
  pk_time := 0;
  ttimer1.enabled := true;
end; 
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: как реализовать таймер в юните [решено]

Сообщение minoshi » 22.10.2013 09:04:17

то что надо!

Спасибо!
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Re: как реализовать таймер в юните [решено]

Сообщение zub » 22.10.2013 11:53:32

Также можно использовать TMethod, но у процедуры появится "пустой" параметр который бы отвечал отвечал за передачу @self при вызове метода
Код: Выделить всё
type
    tproc=procedure of object;
var
   tp:tproc;
procedure test(DummyData:pointer);
begin
end;
var
   tm:tmethod;
begin
  tm.Code:=@test;
  tm.Data:=nil;
  tmethod(tp):=tm;
  tp;
end.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

Рейтинг@Mail.ru