Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.04 c
3-1135080293
wild_arg
2005-12-20 15:04
2006.02.19
Спонтанные округления


2-1138823176
Flint-1983
2006-02-01 22:46
2006.02.19
QReport


15-1138317266
Виктор8
2006-01-27 02:14
2006.02.19
Delphi 2005


11-1120045154
SPeller
2005-06-29 15:39
2006.02.19
Где грабли?


15-1138205476
Kerk
2006-01-25 19:11
2006.02.19
Кластеризация





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский