Форум: "Основная";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
ВнизСоздание таймера Найти похожие ветки
← →
ZilonAtakuit (2006-01-20 07:22) [0]Доброго времени суток
Помогите разобраться
Создаю таймер:
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 08:11) [1]procedure TG.TimerProc - это процедурный метод дельфийского класса
procedure TimerProc - это регулярная процедура
SetTimer требует указания именно регулярной процедуры, о дельфийских же классах и их методах WinAPI-функции знать ничего не знают
← →
TUser © (2006-01-20 09:11) [2]
> Digitman © (20.01.06 08:11) [1]
У меня первый пример прекрасно работает. Разве что в TimerProc будет Self=nil, но тут это не страшно.
Может у автора спикер сломался?)
← →
TUser © (2006-01-20 09:12) [3]На всякий случай
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;
← →
Leonid Troyanovsky © (2006-01-20 09:20) [4]
> ZilonAtakuit (20.01.06 07:22)
> Создаю таймер:
http://groups.google.com/group/fido7.ru.delphi/msg/c038319929e8e63a
--
Regards, LVT.
← →
begin...end © (2006-01-20 09:23) [5]> TUser © (20.01.06 09:11) [2]
> У меня первый пример прекрасно работает. Разве что в TimerProc
> будет Self=nil, но тут это не страшно.
Не совсем так. Self не обязательно будет nil -- он будет равен тому, что должно быть на месте wnd. На месте wnd будет то, что должно быть на месте idEvent, и т.д.
Плюс к этому, стек балансируется "с избытком" -- ОС перед вызовом TimerProc помещает туда 4 параметра, а код метода сгенерирован так, чтобы в конце удалять из стека (stdcall) 5 параметров (т.к. есть ещё и неявный параметр Self). Это чревато.
Если убрать один параметр, то будет работать нормально (но параметры останутся "сдвинуты").
Но лучше сделать что-то вроде MakeObjectInstance...
← →
Digitman © (2006-01-20 13:12) [6]
> TUser © (20.01.06 09:11) [2]
> У меня первый пример прекрасно работает
Но ведет к катастрофе процесса.
См. [5]
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.08 c