Вниз
Скачать: 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 вся ветка

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



Память: 0.47 MB
Время: -0.953 c
6-1081639590
freak
2004-04-11 03:26
2004.05.30
Как обработать события когда срабатывает setsockopt()


6-1082019158
Ozone
2004-04-15 12:52
2004.05.30
TIdTCPServer


1-1084657848
tamroF
2004-05-16 01:50
2004.05.30
____________ проблема с DLL


1-1084558596
DIS
2004-05-14 22:16
2004.05.30
MsAgent


1-1084961468
saysu
2004-05-19 14:11
2004.05.30
Как в делфи писать на казахском языке?




   Наверх