Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: 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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.063 c
2-1138809656
maxim161
2006-02-01 19:00
2006.02.19
MonAPI


1-1137591246
pepper
2006-01-18 16:34
2006.02.19
Документы Word, Excel в Webbrowser


15-1138275294
dzmitry[li]
2006-01-26 14:34
2006.02.19
Pinnacle Studio Plus


15-1138597218
begin...end
2006-01-30 08:00
2006.02.19
С Днём рождения! 30 января


15-1138183309
GRIZME
2006-01-25 13:01
2006.02.19
ATI Radeon 9600 Pro