Einzelnen Beitrag anzeigen

Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#8

Re: Property nur Lesen kann nicht zugewisen werden

  Alt 8. Mai 2007, 05: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!
  Mit Zitat antworten Zitat