Registriert seit: 15. Jul 2005
311 Beiträge
Delphi XE5 Professional
|
Re: Property nur Lesen kann nicht zugewisen werden
8. Mai 2007, 06:00
Nein, so nicht. Ich poste einfach mal mehr Code, da ich ein wenig in Eile bin :/
Delphi-Quellcode:
type
TDebugMode = (dmFull, dmNormal, dmMessages);
TCOnnectionStatus = (csConnecting, csConnected, csDisconnected);
TUserStatus = procedure(Sender: TObject; Const ConnectedClients, ConnectedUsers: Integer) of Object;
type
TServerPA = Class(TWinControl)
private
FSocket: TServerSocket; // Server Socket
FCommand: Integer; // Commando des Datensatzes
FArg: TArgList; // Argumentenliste eines ankommenden Datensatzes zur Weiterverarbeitung
FLog: TStrings; // Log
FDebugMode: TDebugMode; // Debug Mode zur Anzeige im Log
FPingDelay: TTimer; // Timer für das Ping Pong
FActiveConnections: Integer; // Anzahl der angemeldeten Clients
Users: TUsers; // Benutzerliste
FUserStatus: TUserStatus;
procedure FSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure FSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure FSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure FSocketClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure WritetoLog(const S: String);
procedure FPingDelayTimer(Sender: TObject);
public
constructor Create(AOwner: TComponent; Log: TStrings = Nil; DebugMode: TDebugmode = dmFull);
destructor Destroy();
procedure Open;
procedure Close;
function Active: Boolean;
property OnUserStatus: TUserStatus read FUserstatus write FUserStatus;
end;
implementation
{ TServerPA }
function TServerPA.Active: Boolean;
begin
// Ist der Socket noch aktiv?
Result := FSocket.Active;
end;
procedure TServerPA.Close;
begin
// Server schliessen
// Socket schliessen
FSocket.Close;
// Ping Timer abschalten
FPingDelay.Enabled := False;
// Log schreiben
WritetoLog('Server geschlossen');
end;
constructor TServerPA.Create(AOwner: TComponent; Log: TStrings; DebugMode: TDebugMode);
begin
// Original Constructor aufrufen
inherited Create(AOwner);
// Server Socket erstellen; Eriegnisseprozeduren übergeben
FSocket := TServerSocket.Create(AOwner);
FSocket.Port := CONNECTION_PORT;
FSocket.OnClientConnect := FSocketClientConnect;
FSocket.OnClientDisconnect := FSocketClientDisconnect;
FSocket.OnClientRead := FSocketClientRead;
FSocket.OnClientError := FSocketClientError;
// Timer erstellen für das Ping Pong
FPingDelay := TTimer.Create(Nil);
FPingDelay.OnTimer := FPingDelayTimer;
FPingDelay.Interval := 1000 * 30;
FPingDelay.Enabled := False;
// Benutzerliste erstellen
Users := TUsers.Create(TUser);
// Log
FLog := Log;
// Debug Mode setzen
FDebugMode := DebugMode;
end;
destructor TServerPA.Destroy;
begin
// Socket freigeben
FSocket.Free;
// Original Destructor aufrufen
inherited Destroy;
end;
procedure TServerPA.FPingDelayTimer(Sender: TObject);
begin
//
WritetoLog('Ping Zeit');
end;
procedure TServerPA.FSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Ereignis, wenn sich ein Client verbindet
FActiveConnections := FSocket.Socket.ActiveConnections;
WritetoLog('Client angemeldet');
// Übergabe der verbundenen Clients und der angemeldeten Benutzer
if Assigned(FUserstatus) then
FUserstatus(Self, FActiveConnections, Users.Count);
end;
procedure TServerPA.FSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Ereignis, wenn sich ein Client trennt
FActiveConnections := FSocket.Socket.ActiveConnections -1;
WritetoLog('Client getrennt');
// Übergabe der verbundenen Clients und der angemeldeten Benutzer
if Assigned(FUserstatus) then
FUserstatus(Self, FActiveConnections, Users.Count);
end;
procedure TServerPA.FSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
// Ereignis, wenn ein Fehler auftritt
WritetoLog('Es trat ein Fehler auf');
end;
procedure TServerPA.FSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Ereignis, wenn Daten eines Client ankommen
WritetoLog('Daten kommen an');
WritetoLog(Socket.ReceiveText);
end;
procedure TServerPA.Open;
begin
// Server starten
// Socket öffnen
FSocket.Open;
// Ping Timer einschalten
FPingDelay.Enabled := True;
// Log schreiben
WritetoLog('Server gestartet');
// Übergabe der verbundenen Clients und der angemeldeten Benutzer
if Assigned(FUserstatus) then
FUserstatus(Self, FActiveConnections, Users.Count);
end;
procedure TServerPA.WritetoLog(const S: String);
var
FS: String;
begin
FS := Format('[%s] %s', [DatetimetoStr(Now), S]);
if Assigned(FLog) then
FLog.Add( FS );
end;
Der ist natürlich noch nicht fertig. Bisher ist nur gegeben, das ich eben die Property testen kann / will.
Daniel Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
|
|
Zitat
|