Главная страница
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.049 c
7-1083125533
you
2004-04-28 08:12
2004.05.30
Как проверить наличие дискеты в дисководе


1-1084774129
serg!
2004-05-17 10:08
2004.05.30
поток


1-1084956873
Alex_x
2004-05-19 12:54
2004.05.30
Как получить количество минут с DateTime


14-1084085591
Инкогнито
2004-05-09 10:53
2004.05.30
Про день Победы и немного о праздниках


3-1083932811
Timon
2004-05-07 16:26
2004.05.30
Помогите, делаю ADOQuery1.Refresh; выдает ошибку "Insufficient "