webForumDet fria alternativet

TNotifyEvent

4 svar · 365 visningar · startad av the proclaimer

the proclaimerMedlem sedan aug. 200088 inlägg
#1

Hej!

Varför funkar inte denna kod???

Hur jag än gör så får jag inte TNotifyEvent (OnTimer) att funka.

Jag har gjort detta många gånger innan (men då med OnHint, OnAppDeactivate o.s.v.) och då har det funkat perfekt.

Har det möjligtvis något att göra med att jag inte har någon form till unit:en?

Någon som vet något bättre sätt än att använda TTimer?
(API funktionen Sleep låser ju bara processen)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

// Skalade koden lite för att göra den mer lättläst...

unit psclib;

interface

implementation

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

var MarqTimer : TTimer;

procedure Marquee;
begin
MarqTimer.Enabled := True;
MarqTimer.Interval := Delay;

end;

procedure DoMarq;
begin

end;

initialization
MarqTimer := TTimer.Create(nil);
MarqTimer.OnTimer := DoMarq;
end.

------------------
/Per Skoglund

jtMedlem sedan juni 2000350 inlägg
#2

Du kanske inte skickat all kod men som koden ser ut nu så borde du väl anropa proceduren Marquee så timern startar.

Istället för sleep kan du skriva något som liknar detta.

var
delay: Integer
begin
delay := GetTickCount + 1000;
repeat
Application.ProcessMessages;
until (GetTickCount > Delay);
end;

jtMedlem sedan juni 2000350 inlägg
#3

Svarade nog lite snabbt innan.
Jag fick något som liknar detta att fungera.

interface

implementation

uses
extctrls, Classes;

type
TDummyObj = class(TObject)
procedure OnTimer(Sender: TObject);
end;

var
DummyObj: TDummyObj;
MarqTimer : TTimer;

procedure TDummyObj.OnTimer(Sender: TObject);
begin

end;

initialization
MarqTimer := TTimer.Create(nil);
DummyObj := TDummyObj.Create;
MarqTimer.OnTimer := DummyObj.OnTimer;

end.

StarbergMedlem sedan juni 20001 inlägg
#4

Proclaimer:

Glöm jts råd. De exempel han skickade är inte bra.

Ditt problem har som sagt med TNotifyEvent att göra.

type TNotifyEvent = procedure (Sender: TObject) of object;

TNotifyEvent är en typ som är en referens till en procedur som tar emot parametern Sender som är av typen TObject.

Med en lättare förklaring så måste proceduren DoMarq se ut som följer:

Procedure DoMarq(Sender : TObject)
Begin
//Your code here
End;

Då skall det fungera!

- Micke

jtMedlem sedan juni 2000350 inlägg
#5

Har du testat att din metod funkar?
Jag tror inte detta kommer att funka som Proclaimer hade tänkt. Eftersom han vill ha all kod i en unit utan något formulär. Som du mycket riktigt skriver så är problemet TNotifyEvent men problemet är att TNotifyEvent är en method pointer (of Object) vilket inte är samma sak som en vanlig procedure. Därför skapade jag ett dummy object så procedure blev en method pointer.

Har du verkligen lyckats deklarera din "Procedure DoMarq(Sender : TObject)" så skulle jag gärna vilja se hur du gjorde för att MarqTimer.OnTimer := DoMarq;.

133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)