![]() |
AW: Chat mit PM
Das ist im Grunde genommen diese Liste. Ich sagte auch "am besten ginge es ...", aber da müsste ich noch mehr erklären und man müsste sich das erst downloaden/zusammensuchen.
Ich würde dir empfehlen: Du speicherst in einer Liste zu welcher Connection, welcher Benutzername gehört. Das heißt erstmal findest du heraus, welcher Datentyp .Connections[ idx ] ist. Und dann machst du das entweder mit Records oder mit Klassen und speicherst zu jeder Verbindung, welcher Benutzername dazu gehört. Das speicherst du in die Liste und die dir unbekannte Methode geht dann einfach die Liste durch und sucht den Benutzername. So ungefähr könnte man das machen:
Delphi-Quellcode:
Alle Angaben ohne Gewähr!
type
PElement = ^TElement; TElement = record Nick : string; Connection : TConnection; // Den Datentyp von oben! Ich weiß es gerade nicht, also einfach mal gucken! end; TConnections = class(TObject) private FConnections : TList; // Im Konstruktor erstellen/Destruktor freigeben public procedure AddConnection(Nick : string; Connection : TConnection); procedure RemoveConnection(Nick : string); function GetUserFromSocket(Connection : TConnection) : string; // Das ist einfach durchgehen und testen end; procedure TConnections.AddConnection(Nick : string; Connection : TConnection); var e : PElement; begin New(e); e.Nick := Nick; e.Connection := Connection; FConnections.Add(e); end; procedure TConnections.RemoveConnection(Nick : string); var e : PElement; begin // Nick suchen for i := 0 to FConnections.Count - 1 do begin e := PElement(FConnections[i]); if (e.Nick = Nick) then begin FConnections.Delete(i); Dispose(e); Exit; end; end; end; MfG Fabian PS: Die Dictionary wäre halt schneller, aber so gehts auch erstmal. |
AW: Chat mit PM
Zitat:
Zitat:
Nehmen wir mal an, die heißt ServerSocket1, dann hätte ich auch schreiben können
Delphi-Quellcode:
aber sowas ist immer doof, denn wenn du die Komponente umbenennst, dann funktioniert dein Code nicht mehr.
ServerSocket1.Connections[ idx ]
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
Delphi-Quellcode:
). Darum benötige ich/du einen TypeCast und den macht man mit
procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
Delphi-Quellcode:
. Jetzt kannst du deine Komponente auch in
TServerWinSocket( Sender )
Delphi-Quellcode:
umbenennen und es (diese Methode) wird immer noch funktionieren (in D2010 kann man auch ein ü im Namen haben).
RudiRüsselSeineSocketKomponente
Ich hätte auch
Delphi-Quellcode:
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 ;)
TServerSocket( Sender )
Soweit zum TypeCast
Delphi-Quellcode:
Hier die Bedeutung der einzelnen Elemente:
( Socket <> TServerWinSocket( Sender ).Connections[ idx ] )
Delphi-Quellcode:
-> Verbindung zum Client, von dem aktuell die Nachricht empfangen wird
Socket
Delphi-Quellcode:
-> Liste mit allen Verbindungen zum Server
TServerWinSocket( Sender ).Connections
Delphi-Quellcode:
-> Verbindung zu einem Client
TServerWinSocket( Sender ).Connections[ idx ]
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. |
AW: Chat mit PM
Moin,
könnte er sich dann nicht den Cast sparen und einfach den zweiten Parameter verwenden? MfG Fabian |
AW: Chat mit PM
Zitat:
|
AW: Chat mit PM
Achso, und der zweite Parameter gibt den "Quellsocket" an, also wo das Paket hergekommen ist? Dann hab ich nichts gesagt :stupid: Hab halt nicht so viel damit zu tun.
MfG Fabian |
AW: Chat mit PM
Ok, das hört sich doch alles sehr gut an!! :-D Könntet ihr mir aber nochmal auf die Sprünge helfen, wie ich herausbekomme, welcher Datentyp
Delphi-Quellcode:
ist?
.Connections[idx]
Eine generelle Frag zu Pointer hab ich nochmal: Ich weise einen Wert zu:
Delphi-Quellcode:
Ich lese den Wert eines Pointer aus:
New(Pointer);
Pointer^.A:='A';
Delphi-Quellcode:
Ist das richtig? Denke, da muss ich noch was dran korrigieren...
PointerString:=Format(%p,'Pointer^.A');
Vielen Dank für eure große Hilfe, hans ditter [edit]Muss ich eigentlich eine Record und eine Klasse verwenden? [/edit] |
AW: Chat mit PM
Frage die Online-Hile oder die Delphi-Reference
Pro Thread nur eine Frage, du kannst aber auch die SuFu hier im Forum benutzen Allerdings, wofür einen Pointer? In der Objekt-Variable ist eh nur die Referenz auf den Speicherbereich hinterlegt - ist also quasi ein Pointer. Und dann noch die Umwandlung in einen String ... Merk dir doch einfach die Objekt-Referenz Du solltest unbedingt einige Grundlagen-Tutorials durcharbeiten. Tutorials findet man über die SuFu oder google oder ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz