Форум: "Потрепаться";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
ВнизКакая то беда с 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.032 c