AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Chat mit PM

Ein Thema von hans ditter · begonnen am 3. Okt 2010 · letzter Beitrag vom 10. Okt 2010
Antwort Antwort
Seite 4 von 4   « Erste     234   
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#31

AW: Chat mit PM

  Alt 8. Okt 2010, 23:56
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:
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;
Alle Angaben ohne Gewähr!

MfG
Fabian

PS: Die Dictionary wäre halt schneller, aber so gehts auch erstmal.
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
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
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#33

AW: Chat mit PM

  Alt 9. Okt 2010, 09:33
Moin,
könnte er sich dann nicht den Cast sparen und einfach den zweiten Parameter verwenden?

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Chat mit PM

  Alt 9. Okt 2010, 09:42
Moin,
könnte er sich dann nicht den Cast sparen und einfach den zweiten Parameter verwenden?

MfG
Fabian
Nein (ok ich hatte mich im letzten teil vertippt, hab es aber jetzt korrigiert), denn ich brauche ja den Zugriff auf den ServerSocket um alle anderen Verbindungen (Sockets) zu erfahren
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)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#35

AW: Chat mit PM

  Alt 9. Okt 2010, 10:45
Achso, und der zweite Parameter gibt den "Quellsocket" an, also wo das Paket hergekommen ist? Dann hab ich nichts gesagt Hab halt nicht so viel damit zu tun.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#36

AW: Chat mit PM

  Alt 9. Okt 2010, 23:12
Ok, das hört sich doch alles sehr gut an!! Könntet ihr mir aber nochmal auf die Sprünge helfen, wie ich herausbekomme, welcher Datentyp .Connections[idx] ist?
Eine generelle Frag zu Pointer hab ich nochmal:
Ich weise einen Wert zu:
Delphi-Quellcode:
New(Pointer);
Pointer^.A:='A';
Ich lese den Wert eines Pointer aus: PointerString:=Format(%p,'Pointer^.A'); Ist das richtig? Denke, da muss ich noch was dran korrigieren...

Vielen Dank für eure große Hilfe,
hans ditter

[edit]Muss ich eigentlich eine Record und eine Klasse verwenden? [/edit]
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!

Geändert von hans ditter ( 9. Okt 2010 um 23:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Chat mit PM

  Alt 10. Okt 2010, 02:20
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 ...
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 (10. Okt 2010 um 02:22 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz