Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.06;
Скачать: CL | DM;

Вниз

Работа с таймером   Найти похожие ветки 

 
Bers01   (2004-01-26 11:23) [0]

Уважаемые Мастера!
Подскажите в чем проблема:
Создаю в RunTime компонент

procedure Create;
var Timer:TTimer;
begin
Timer:=TTimer.Create(nil);
Timer.Interval:=1000;
Timer.OnTimer:=MOnTimer;
Timer.Enabled:=True;
end;

procedure MOnTimer(Sender:TObject);
begin
...
end;


а таймер не запускается (события OnTimer не происходит) и как следствие не выполняется процедура MOnTimer.
Подскажите, кто знает, в чем дело?
С Уважением, Андрей.


 
Digitman ©   (2004-01-26 11:27) [1]

консоль ?


 
Bers01   (2004-01-26 11:34) [2]

что консоль?
всмысле приложение? Нет оконное. А это имеет значение?


 
TUser ©   (2004-01-26 11:46) [3]

В OnCreate писать не надо. Надо так
procedure OnT;
begin
form1.Memo1.Lines.Add("===")
end;

procedure TForm1.Button1Click(Sender: TObject);
var t:TTimer;
ne:TNotifyEvent;
begin
t:=TTimer.Create(Application);
@ne:=@OnT;
t.OnTimer:=ne;
t.Interval:=2000;
t.Enabled:=true;
end;


 
Zelius ©   (2004-01-26 11:48) [4]

А может таймер создается в другом потоке TThread?


 
alex_*** ©   (2004-01-26 11:50) [5]

а зачем внешний метод нужен? использование Form1 - потенциальный источник ошибок. Проще обработчик в свой же класс и сунуть и не надо будет мудрить с собаками.


 
alex_*** ©   (2004-01-26 11:55) [6]

кстати и в OnCreate работает. Дело у него в чем-то другом .

procedure TForm1.FormCreate(Sender: TObject);
begin
....
with TTimer.Create(Self) do
Begin
OnTimer := Self.OnTimer;
Interval := 1000;
Enabled := true;
end;


 
Digitman ©   (2004-01-26 12:00) [7]


> Bers01 (26.01.04 11:34) [2]
> А это имеет значение?


Имеет.

p.s.
В том виде, в котором ты привел, код даже скомпилирован быть не может. Надеюсь, на самом деле привел ты методы, а не обычные процедуры.


 
Bers01   (2004-01-26 12:01) [8]


> А может таймер создается в другом потоке TThread?

Нет повых потоков я не создаю все в одном.


> В OnCreate писать не надо.

А Create не onCreate Формы, а конструктор моего класса.
Попробовал Ваш вариант: результат тот-же что и был, только если процедуру procedure OnT; описывать отдельно, то при компиляции не ругается, а если внутри класса(что и нужно), то на строку @ne:=@OnT; говорит Variable recuired...
Может есть еще какие идеи?
С Уважением, Андрей.


 
Bers01   (2004-01-26 12:03) [9]


> Надеюсь, на самом деле привел ты методы, а не обычные процедуры.


Да разумеется это методы моего класса.


 
Digitman ©   (2004-01-26 12:05) [10]


> А Create не onCreate Формы, а конструктор моего класса.


это без разницы. лишь бы класс тот или иной фигурировал.

приведи фрагмент кода, где вызывается конструктор твоего объекта


 
alex_*** ©   (2004-01-26 12:11) [11]

а ты отладчиком вообще проходил? Адрес обработчика верный записал в timer?


 
Bers01   (2004-01-26 12:15) [12]

Вот примерно так (сокращенный текст модуля):
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, QExtCtrls;

type
TMC = Class(TObject)
T:TTimer;
constructor Create;
Destructor Destroy; override;
procedure onT(Sender: TObject);
end;

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
MC:TMC;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

constructor TMC.Create;
begin
T:=TTimer.Create(nil);
T.OnTimer:=onT;
T.Interval:=1000;
T.Enabled:=true;
end;

Destructor TMC.Destroy;
begin
T.Enabled:=False;
T.Free;
inherited destroy;
end;

procedure TMC.onT(Sender:TObject);
begin
ShowMessage("***");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MC:=TMC.Create;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
MC.Destroy;
end;

end.

С Уважением, Андрей.


 
Digitman ©   (2004-01-26 12:22) [13]

выбери для конструктора своего класса имя иное, нежели Create()
у тебя не отрабатывает твой конструктор, ибо вызывается метод-конструктор предка, а там никакими таймерами не пахнет


 
Анонимщик ©   (2004-01-26 12:23) [14]

а у меня этот код работает


 
Digitman ©   (2004-01-26 12:25) [15]

в догонку ..

в [11] тебе хороший намек, что делать, когда не понимаешь. что происходит : отладчик в руки - и вперед с песней !


 
Bers01   (2004-01-26 12:26) [16]

В том-то и дело что отрабатывает... это я в режиме отладки выяснил. И создается он, и интервал устанавливается, а запускаться нехочет...


 
Digitman ©   (2004-01-26 12:30) [17]


> Bers01 (26.01.04 12:26) [16]


если действительно вызывается ТВОЙ конструктор, ЭТОТ код просто обязан работать


 
alex_*** ©   (2004-01-26 12:31) [18]

[13] - ну ты чего-то загнул про Inherited конструктор, по-моему.


 
Verg ©   (2004-01-26 12:31) [19]

QExtCtrls

Не тот TTimer создаешь.
Q убери.


 
Digitman ©   (2004-01-26 12:38) [20]

точно ... проглядел ... QExtCtrls зачем здесь ?


 
Bers01   (2004-01-26 12:42) [21]


>[19]
> Не тот TTimer создаешь.
> Q убери.


ТОЧНО!!! ЗАРАБОТАЛО!!!
Спасибо всем принимавшим участие :)))


 
Verg ©   (2004-01-26 12:51) [22]

Это кстати, к разговору о семьнадцатых строках - как важно паказать как можно более полный код для точного диагноза.



Страницы: 1 вся ветка

Текущий архив: 2004.02.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
14-16738
Akvilon
2004-01-12 22:19
2004.02.06
На чем написана Delphi?


4-16786
closer
2003-12-02 16:15
2004.02.06
Закрытие таймера


1-16502
mvgfirst
2004-01-21 17:45
2004.02.06
Переопределить метод InternalPost компонента TCustomADODataSet


4-16809
volser
2003-11-29 13:25
2004.02.06
Потоки


11-16210
Vadim Petrov
2003-05-20 13:41
2004.02.06
New Synapse conversion for KOL