![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание таймера
ZilonAtakuit © (2006-01-20 07:22:00)Доброго времени суток
Помогите разобраться
Создаю таймер:
TG=class
private
procedure TimerProc(wnd: HWND; Msg: UINT; idEvent: UINT; Time: DWORD); stdcall;
.....
procedure TG.TimerProc(wnd: HWND; Msg: UINT; idEvent: UINT; Time: DWORD); stdcall;
begin
Beep;
end;
procedure Tg.Load;
begin
SetTimer(0, 0, 1000, @TG.TimerProc);
Все запускается, но таймер не работает
procedure TimerProc(wnd: HWND; Msg: UINT; idEvent: UINT; Time: DWORD); stdcall;
begin
Beep;
end;
procedure Tg.Load;
begin
SetTimer(0, 0, 1000, @TimerProc);
А так все работает
Digitman (2006-01-20 13:12:00) [1]
> TUser © (20.01.06 09:11) [2]
> У меня первый пример прекрасно работает
Но ведет к катастрофе процесса.
См. [5]
begin...end (2006-01-20 09:23:00) [2]> TUser © (20.01.06 09:11) [2]
> У меня первый пример прекрасно работает. Разве что в TimerProc
> будет Self=nil, но тут это не страшно.
Не совсем так. Self не обязательно будет nil -- он будет равен тому, что должно быть на месте wnd. На месте wnd будет то, что должно быть на месте idEvent, и т.д.
Плюс к этому, стек балансируется "с избытком" -- ОС перед вызовом TimerProc помещает туда 4 параметра, а код метода сгенерирован так, чтобы в конце удалять из стека (stdcall) 5 параметров (т.к. есть ещё и неявный параметр Self). Это чревато.
Если убрать один параметр, то будет работать нормально (но параметры останутся "сдвинуты").
Но лучше сделать что-то вроде MakeObjectInstance...
Leonid Troyanovsky (2006-01-20 09:20:00) [3]
> ZilonAtakuit (20.01.06 07:22)
> Создаю таймер:
http://groups.google.com/group/fido7.ru.delphi/msg/c038319929e8e63a
--
Regards, LVT.
TUser (2006-01-20 09:12:00) [4]На всякий случай
type
TG=class
private
procedure TimerProc(wnd: HWND; Msg: UINT; idEvent: UINT; Time: DWORD); stdcall;
procedure Load;
end;
procedure TG.TimerProc(wnd: HWND; Msg: UINT; idEvent: UINT; Time: DWORD); stdcall;
begin
Form1.Color:=clRed;
Free;
end;
procedure Tg.Load;
var P: pointer;
begin
SetTimer(0, 0, 1000, @TG.TimerProc);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with TG.Create do
Load;
end;
TUser (2006-01-20 09:11:00) [5]
> Digitman © (20.01.06 08:11) [1]
У меня первый пример прекрасно работает. Разве что в TimerProc будет Self=nil, но тут это не страшно.
Может у автора спикер сломался?)
Digitman (2006-01-20 08:11:00) [6]procedure TG.TimerProc - это процедурный метод дельфийского класса
procedure TimerProc - это регулярная процедура
SetTimer требует указания именно регулярной процедуры, о дельфийских же классах и их методах WinAPI-функции знать ничего не знают