Thema: Chat mit PM

Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#32

AW: Chat mit PM

  Alt 9. Okt 2010, 01:04
Ok, cool!! Ich hab das aber mit dem User herausfinden noch nicht ganz gerafft.
Mein Delphi kennt beim Server die Funktion GetUserFromSocket nicht. Was mache ich falsch bzw. wie komme ich dann an die Verbindung ran?
Wie xZise schreibt, die musst du selber erstellen ... ich bin aber (nach dem was du hier geschrieben hast) davon ausgegangen, dass du schon so eine Liste führst (User,Socket). Die Funktion sucht dann aus der Liste den Socket und liefert den User.

Auch finde ich im Moment "TServerWinSocket" nicht ... ich habe die ganze Weiterleitung etc. in OnClientRead (ist das korrekt?), da gibt es aber nur ...ClientRead(Sender: TObjet; Socket: T[B]Custom[/B]WinSocket); .
Und:  ( Socket <> TServerWinSocket( Sender ).Connections[ idx ] ) then --> ist Socket nicht gleich TServerWinSocket??
Du hast doch eine TServerSocket-Komponente auf deiner Form liegen. Ich weiß nicht wie die heißt ... ist aber auch egal.
Nehmen wir mal an, die heißt ServerSocket1, dann hätte ich auch schreiben können ServerSocket1.Connections[ idx ] aber sowas ist immer doof, denn wenn du die Komponente umbenennst, dann funktioniert dein Code nicht mehr.
In dem Parameter Sender habe ich den Verweis auf die Komponente die diese Methode aufruft, und das ist deine TServerSocket (wie immer die auch heißen mag). Durch die Vererbung (OOP) brauche ich die Sicht auf TServerWinSocket (davon ist TServerSocket abgeleitet), denn ab da kann ich auf die Connections zugreifen.
Sender ist aber erst mal vom Typ TObject (siehst du an der Definition der Methode procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket); ). Darum benötige ich/du einen TypeCast und den macht man mit TServerWinSocket( Sender ) . Jetzt kannst du deine Komponente auch in RudiRüsselSeineSocketKomponente umbenennen und es (diese Methode) wird immer noch funktionieren (in D2010 kann man auch ein ü im Namen haben).

Ich hätte auch TServerSocket( Sender ) nehmen können, es ist aber besser immer die niedrigste benötigte Ableitung im TypeCast zu verwenden. Das wirst du merken, wenn du mal etwas mehr mit OOP arbeitest

Soweit zum TypeCast

( Socket <> TServerWinSocket( Sender ).Connections[ idx ] ) Hier die Bedeutung der einzelnen Elemente:

Socket -> Verbindung zum Client, von dem aktuell die Nachricht empfangen wird
TServerWinSocket( Sender ).Connections -> Liste mit allen Verbindungen zum Server
TServerWinSocket( Sender ).Connections[ idx ] -> Verbindung zu einem Client

Innerhalb der for-Schleife (idx) prüfe ich, ob die Verbindung[ idx ] = der Verbindung des Clients ist von dem aktuell die Nachricht empfangen wird, weil dem will ich die Nachricht ja nicht mehr schicken.
Der bekommt im Anschluss zwar auch eine Nachricht, aber mit einer anderen Intention.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 9. Okt 2010 um 09:44 Uhr)
  Mit Zitat antworten Zitat