Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

Какая то беда с Windows.SetTimer   Найти похожие ветки 

 
Style ©   (2004-05-14 15:34) [0]

procedure TimeProc;
begin
 //todo
 ShowMessage("Ops")
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 SetTimer(0,0,1000,@TimeProc);
end;

Delphi 5, WinNT 4 SP6
После каждого выхода из TimerProc у меня Acces Vialation :(

В 98 Exeшник работает нормально?

Дома в Delphi7 под XP тоже все работает.

Что делать??


 
MBo ©   (2004-05-14 15:37) [1]

stdcall


 
Style ©   (2004-05-14 15:41) [2]


> procedure TimeProc; stdcall;
> begin
>  //todo
>  ShowMessage("Ops")
> end;


не помогает :(


 
MBo ©   (2004-05-14 15:58) [3]

В хелпе же описан прототип
procedure TimeProc(hwnd, uMsg, idEvent, dwTime:DWord);stdcall;


 
Style ©   (2004-05-14 16:07) [4]


> MBo ©   (14.05.04 15:58) [3]


Ой, спасибо. Что-то я уже совсем торможу Ж8-[]


 
Digitman ©   (2004-05-14 16:09) [5]


> MBo ©   (14.05.04 15:58) [3]


это называется "слышал звон, да не заню где он"

классика форума ...


 
Style ©   (2004-05-14 16:52) [6]

TTimerProc= procedure (hWindow: hwnd; Msg, idEvent, dwTime: integer) of object; stdcall;

 TClientLink = class(TComponent)
 private
   FTimerID: integer;
   FTimerEnabled: boolean;
   FTimerInterval: integer;

   procedure SetTimerInterval(const Value: integer);
   procedure DoTimer(hWindow: hwnd; Msg, idEvent, dwTime: integer); stdcall;
   { Private declarations }
 protected
   { Protected declarations }
 public

   constructor Create(AOwner: TComponent); override;
   { Public declarations }
 published
   property TimerInterval: integer read
      FTimerInterval write SetTimerInterval;
   { Published declarations }
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents("NMK", [TClientLink]);
end;

{ TClientLink }

constructor TClientLink.Create(AOwner: TComponent);
var
 FProc: TTimerProc;
begin
 FProc := DoTimer;
 inherited Create(AOwner);
 FTimerEnabled := true;
 FTimerInterval := 1000;
 FTimerID := SetTimer(0,0, FTimerInterval, @FProc);
end;

procedure TClientLink.DoTimer(hWindow: hwnd; Msg, idEvent,
 dwTime: integer); stdcall;
begin
ShowMessage("Ops");
end;

procedure TClientLink.SetTimerInterval(const Value: integer);
begin
 FTimerInterval := Value;
 KillTimer(0,FTimerID);
end;


Тоже AV. :(
А как мне это сделать внутри класса? или только глобальную процедуру можно использовать?


 
MBo ©   (2004-05-14 17:08) [7]

нет, методом класса быть не может.

А что мешает VCL-ный TTimer подключить?


 
Style ©   (2004-05-14 18:24) [8]


> нет, методом класса быть не может.

Попробую догадаться, это потому что у метода в параметрах первые 4 байта - указатель на сам объект или класс?

Это я так подумал потому, что когда наоборот присваиваешь методу(событию) глобальную процедуру, то перед параметрами этой прцедуры достаточно добавить пустой Pointer;

@ClientWriteProc := @OnSocketWrite;
Server.OnClientWrite := ClientWriteProc;

procedure OnSocketWrite(Dummy:pointer; Sender: TObject; Socket: TCustomWinSocket);


> А что мешает VCL-ный TTimer подключить?


Просто хотелось как лучше, получилось как всегда :o)
Пожалуй проще TTimer добавить.


 
panov ©   (2004-05-14 19:33) [9]

Для класса я обычно делаю так:

TMyProc=procedure(<>params>);

TMyClass=class
 <params>
 FOnMyProc: TMyProc;

 procedure FOnMyEvent;
 
 property OnMyEvent: TMyProc read FOnMyProc write FOnMyProc;
//либо передается ссылка на процедуру в конструкторе.
end;

TMyClass.FOnMyEvent;
begin
 if Assigned(FOnMyProc) then FOnMyProc(<params>);
end;



Страницы: 1 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.028 c
4-1080283710
Kalishenko Stas
2004-03-26 09:48
2004.05.30
FindFirstChangeNotification для Novell


3-1084201056
Exe
2004-05-10 18:57
2004.05.30
ПРограмно добавить псевдоним к BDE


9-1075144796
Antichrist
2004-01-26 22:19
2004.05.30
освещение объектов в <b>двухмерной</b> графике


1-1084781602
Vadim X
2004-05-17 12:13
2004.05.30
Как сбросить кэш?


11-1074440717
puky
2004-01-18 18:45
2004.05.30
Multimonitor support