Вниз
Скачать: 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.023 c
7-1082529809
ZDDR
2004-04-21 10:43
2004.05.30
иконка екзехи


3-1084236623
pulp
2004-05-11 04:50
2004.05.30
Ошибка совметсного использования


9-1075584663
Millennium
2004-02-01 00:31
2004.05.30
диалоги в играх


7-1083182399
Mishenka
2004-04-28 23:59
2004.05.30
Очередь печати.


7-1082307832
kat
2004-04-18 21:03
2004.05.30
В чем кроме paramstr могут передаваться параметры.




   Наверх