Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизРабота с таймером Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.026 c