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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Dynamic timer creation, Почему? 
:(
    Опции темы
AlDev
Дата 4.6.2005, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

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



Люди, подскажите, pls, где глюк:
Код

//linear pendulum tween
unit phis;

interface
uses ExtCtrls, Forms;
type
  linear_pendulum = class
    private
      //...
      //timer:
      count_timer:TTimer;
      //...
      procedure change_values(Sender: TObject);
    public
      //...
      constructor Create(target_form:TForm);
      function start():Boolean;
end;
implementation
//constructor definition
  constructor linear_pendulum.Create(target_form:TForm);
  begin
    //...
    //create timer
    count_timer := TTimer.Create(target_form);
    count_timer.Enabled := false;
    count_timer.interval := 100;
    //...
  end;
//end constructor definition
  function linear_pendulum.start():Boolean;
  var
    errors_enabled:Boolean;
  begin
      errors_enabled := false;
     //...
      if (not (errors_enabled)) then
      begin
        count_timer.Enabled := true;
        count_timer.OnTimer := change_values;
      end;
      start := not(errors_enabled);
  end;
  procedure linear_pendulum.change_values(Sender: TObject);
  var
    w:Double;
  begin
    //...
  end;
//-----------------------------------------------------------
  //...
end.


Но таймер категорически отказывается работать. Почему?
PS:
отказывается работать = Ничего не происходит.
PM MAIL WWW ICQ YIM MSN   Вверх
<Spawn>
Дата 4.6.2005, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



А в событии change_values у тебя есть чего нибудь? приведи полный код.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
AlDev
Дата 4.6.2005, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

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



полный код:
Код

//linear pendulum tween
unit phis;

interface
uses ExtCtrls, Forms, Methods;
type
  linear_pendulum = class
    private
      ext_functions:my_methods;
      g_const:Double;
      p_length:Double;
      p_amplitude_x:Double;
      p_amplitude_y:Double;
      p_start_cant:Double;
      p_current_x_position:Double;
      p_current_y_position:Double;
      p_current_x_speed:Double;
      p_current_y_speed:Double;
      //timer:
      count_timer:TTimer;
      //is property seted?
      is_length_seted:Boolean;
      is_amplitude_x_seted:Boolean;
      is_amplitude_y_seted:Boolean;
      is_start_cant_seted:Boolean;
      is_timer_interval_seted:Boolean;
      procedure change_values(Sender:TObject);
      //properties getters and setters
      function getLength():Double;
      procedure setLength(v:Double);
      function getAmplitudeX():Double;
      procedure setAmplitudeX(v:Double);
      function getAmplitudeY():Double;
      procedure setAmplitudeY(v:Double);
      function getStartCant():Double;
      procedure setStartCant(v:Double);
      function getXPosition():Double;
      function getYPosition():Double;
      function getXSpeed():Double;
      function getYSpeed():Double;
      procedure setTimerStep(s:Integer);
      //end properties getters and setters def
    public
      property length:Double read GetLength write SetLength;
      property amplitude_x:Double read getAmplitudeX write setAmplitudeX;
      property amplitude_y:Double read getAmplitudeY write setAmplitudeY;
      property start_cant:Double read getStartCant write setStartCant;
      property x_position:Double read getXPosition;
      property y_position:Double read getYPosition;
      property x_speed:Double read getXSpeed;
      property y_speed:Double read getYSpeed;
      property time_step:Integer write setTimerStep;
      constructor Create(target_form:TForm);
      function start():Boolean;
end;
implementation
//constructor definition
  constructor linear_pendulum.Create(target_form:TForm);
  begin
    g_const := 9.8;
    //create timer
    count_timer := TTimer.Create(target_form);
    count_timer.Enabled := false;
    is_length_seted := false;
    is_amplitude_x_seted := false;
    is_amplitude_y_seted := false;
    is_start_cant_seted := false;
    is_timer_interval_seted := false;
  end;
//end constructor definition
  function linear_pendulum.start():Boolean;
  var
    errors_enabled:Boolean;
  begin
    errors_enabled := true;
    if ((is_length_seted=false)or(is_amplitude_x_seted=false)or(is_amplitude_y_seted=false)or(is_start_cant_seted=false)or(is_timer_interval_seted=false)) then
    begin
      errors_enabled := false;
      count_timer.Enabled := true;
      count_timer.OnTimer := change_values;
    end;
    start := errors_enabled;
  end;
  procedure linear_pendulum.change_values(Sender: TObject);
  var
    w:Double;
  begin
    w := sqrt(p_length/g_const);
    p_current_x_position := p_amplitude_x*cos(ext_functions.grad2rad(w*count_timer.Tag + p_start_cant));
    p_current_y_position := p_amplitude_y*cos(ext_functions.grad2rad(w*count_timer.Tag + p_start_cant));
    p_current_x_speed := -p_amplitude_x*w*sin(ext_functions.grad2rad(w*count_timer.Tag + p_start_cant));
    p_current_y_speed := -p_amplitude_y*w*sin(ext_functions.grad2rad(w*count_timer.Tag + p_start_cant));
  end;
//-----------------------------------------------------------
//getters and setters part:
  function linear_pendulum.getLength():Double;
  begin
    getLength := p_length;
  end;
  procedure linear_pendulum.setLength(v:Double);
  begin
    p_length := v;
    is_length_seted := true;
  end;
  function linear_pendulum.getAmplitudeX():Double;
  begin
    getAmplitudeX := p_amplitude_x;
  end;
  procedure linear_pendulum.setAmplitudeX(v:Double);
  begin
    p_amplitude_x := v;
    is_amplitude_x_seted := true;
  end;
  function linear_pendulum.getAmplitudeY():Double;
  begin
    getAmplitudeY := p_amplitude_y;
  end;
  procedure linear_pendulum.setAmplitudeY(v:Double);
  begin
    p_amplitude_y := v;
    is_amplitude_y_seted := true;
  end;
  function linear_pendulum.getStartCant():Double;
  begin
    getStartCant := p_start_cant;
  end;
  procedure linear_pendulum.setStartCant(v:Double);
  begin
    p_start_cant := v;
    is_start_cant_seted := true;
  end;
  function linear_pendulum.getXPosition():Double;
  begin
    getXPosition := p_current_x_position;
  end;
  function linear_pendulum.getYPosition():Double;
  begin
    getYPosition := p_current_y_position;
  end;
  function linear_pendulum.getXSpeed():Double;
  begin
    getXSpeed := p_current_x_speed;
  end;
  function linear_pendulum.getYSpeed():Double;
  begin
    getYSpeed := p_current_y_speed;
  end;
  procedure linear_pendulum.setTimerStep(s:Integer);
  begin
    count_timer.Interval := s;
    is_timer_interval_seted := true;
  end;
//end getters and setters part
end.


methods:
Код

unit methods;

interface
uses QDialogs;
type
  my_methods = class
    function grad2rad(v:Double):Double;
  end;
  my_errors = class
    procedure show(err_message:String);
  end;
implementation
  function my_methods.grad2rad(v:Double):Double;
  begin
    grad2rad := v*PI/180;
  end;
  procedure my_errors.show(err_message:String);
  begin
    ShowMessage(err_message);
  end;
end.

PM MAIL WWW ICQ YIM MSN   Вверх
z-END
Дата 4.6.2005, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

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



слушай я так мельком взглянул, может имеет смысл поменять эти две строчки местами:
Код

      count_timer.Enabled := true;
      count_timer.OnTimer := change_values;



--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
AlDev
Дата 4.6.2005, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

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



бесполезно....
дело в том, что event не срабатывает. Пробую:
Код
count_timer.OnTimer := linear_pendulum.change_values;

Выдаёт, что типы не совместимы. А если без linear_pendulum, то просто ничего не происходит.
PM MAIL WWW ICQ YIM MSN   Вверх
<Spawn>
Дата 4.6.2005, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Alex Batsuev А что вообще должно происходить? В событии таймера производятся вычисления, но где ты смотришь результат? Ты пробовал делать дебаг? Поставь брякпоинт в событии и запусти код, если останов сработает, то значит не в событии дело, иначе ставь брякпоинт в коде верхнего уровня, допустим тут:

Код

      errors_enabled := false;
      count_timer.Enabled := true;
      count_timer.OnTimer := change_values;


Ты уверен, что сюда передается управление?


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Dynamic
Дата 4.6.2005, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот это нормально работает:
Код
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure ontimer(Sender: TObject);
  private
    tm: TTimer;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     tm := TTimer.Create(self);
     tm.OnTimer := ontimer;
     tm.Interval := 55;
     tm.Enabled := true;
end;

procedure TForm1.ontimer(Sender: TObject);
begin
     tm.Enabled := false;
     tm.Free;
     showmessage('Ok');
end;


Это сообщение отредактировал(а) p0s0l - 4.6.2005, 13:32


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
p0s0l
Дата 4.6.2005, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Просто вставил в Delphi твой код - всё работает, событие вызывается...
Как ты определяешь, что событие не вызывается ? Мож не так проверяешь smile ?
Сделай так:
Код
  procedure linear_pendulum.change_values(Sender: TObject);
  var
    w:Double;
  begin
    ShowMessage('всё работает!');
...
(или забываешь вызвать метод Start ?)...

Также заметил такую строчку:
Цитата
uses QDialogs;

Использовать Q*-юниты нужно лишь в случае, если у тебя CLX-приложение... Так, что убери на всякий случай везде буковки Q в uses'ах...


--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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