Вниз
Скачать: CL | DM;

Создание таймера   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.043 c
2-1138663886
kizam
2006-01-31 02:31
2006.02.19
print screen


2-1138171812
Wolferio
2006-01-25 09:50
2006.02.19
DBGrid


15-1138259278
wal
2006-01-26 10:07
2006.02.19
Железячники, отзовитесь!!!


6-1131478836
Bruce
2005-11-08 22:40
2006.02.19
Задержка при отправке данных. Indy.


1-1137329594
SergP
2006-01-15 15:53
2006.02.19
Array ==> Tdataset




   Наверх