Hallo,
ich weiß einfach nicht mehr weiter. Die Folgenden beiden Programme sind auf die gleiche weise aufgebaut, aber komischerweise kann ich nur das erstere compilieren.
Das erste Programm löst beim öffnen eines Sockets ein OnListen-Event aus. Dieses Event wird mit der Zeile „@S.OnListen := @SocketNotifyEvent;“ an die entsprechende Prozedur gebunden, die beim Ausführen des Programms auch ordungsgemäß ausgeführt wird.
Das zweite Programm soll alle 200 ms ein OnTimer-Event auslösen. Wie im ersten Programm möchte ich die entsprechende Prozedur „NotifyEvent(Sender: TObject);“ mit der Zeile „@T.OnTimer := @NotifyEvent;“ an dieses Event binden. Leider will der Compiler das jedoch so nicht hinnehmen und meldet mir den Fehler: „Inkompatible Typen: ‚TNotifyEvent‘ und ‚Pointer‘“.
Ich verstehe das nicht. Was mache ich falsch?
Ps: Das Programm soll auf jeden Fall als reines Konsolenprogramm ohne Fenster laufen. Daher muss ich auch die Events über den Programmcode zuordnen und kann nicht den Objektinspector verwenden
Programm 1
program Project1;
{$APPTYPE CONSOLE}
uses
sysutils,
scktcomp;
var S : TServerSocket;
procedure SocketNotifyEvent(Sender: TObject; Socket: TCustomWinSocket);
begin
WriteLn('Yes');
Readln;
end;
begin
S := TServerSocket.Create(Nil);
Try
@S.OnListen := @SocketNotifyEvent;
S.Open; // -\> Active:=True; -\> löst das OnListen-Event aus
Writeln('Weiter mit Enter');
Readln;
Finally
S.Free;
end;
end.
Programm 2
program TimeEvent;
{$APPTYPE CONSOLE}
uses
SysUtils,
ExtCtrls;
var
T : TTimer;
i : Integer;
procedure NotifyEvent(Sender: TObject);
begin
writeln('yes');
beep;
end;
begin
T := TTimer.Create(nil);
T.Interval := 200; // -\> löst alle 200 ms das OnTimer-Event aus
try
@T.OnTimer := @NotifyEvent; { [Fehler]: Inkompatible Typen: 'TNotifyEvent' und 'Pointer' }
T.Enabled := true; // aktiviert den Timer
writeln('Warte auf Event: ');
for i := 1 to 5 do begin
sleep(100);
writeln('warte ' + inttostr(i\*100) + 'ms...');
end;
T.Enabled := false; // deaktiviert den Timer
finally
T.Free;
end;
end.