Einzelnen Beitrag anzeigen

Lyan

Registriert seit: 5. Aug 2011
188 Beiträge
 
#1

Chattool - Probleme beim Übermitteln des Usernames

  Alt 31. Aug 2011, 10:33
Delphi-Version: 5
Delphi-Version: XE


Hallo,

habe ein Chattool, das später zum kommunizieren per Wlan geeignet sein soll (das wir im unterricht miteinander schreiben können (ohne wlan)).

Das ganze sieht so aus:
http://imageshack.us/f/854/unconnected.png/

Wenn man sich verbindet sieht es dann so aus:
http://imageshack.us/photo/my-images...onnectedp.png/

Wie man an Abbildung 2 erkennen kann, ist im Fenster "--UserList--" alles leer. Beim Server wird aber ip + Username angezeigt.

ich möchte die Leute die verbunden sind in dem Fenster angezeigt haben, um später einen private chat zu realisieren.

Übrigens läuft das tool über TServerSocket und TClientSocket!

aber weiß grade nicht weiter! hier mal der code der Stelle:


Client:
Code:

procedure TFormClient.ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
richeditNachrichten.Lines.Add('Status: verbunden mit ' + socket.RemoteAddress);
//Server eigenen Namen mitteilen
client.socket.SendText(inttostr(edit1.color) + ';' + editusername.text + ';' + '!Connected#');
Timer2.Enabled := true;
end;

procedure TFormClient.ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
richeditNachrichten.Lines.Add('Status: getrennt mit ' + socket.RemoteAddress);
//Eigenen Name wieder aus Liste auf Server löschen
client.socket.SendText(inttostr(edit1.color) + ';' + editusername.text + ';' + '!Disconnected#');
end;


procedure TFormClient.Timer2Timer(Sender: TObject);
begin
Form2.richeditusers.Clear;
//Kontaktliste abrufen
client.Socket.SendText(inttostr(edit1.color) + ';' + editusername.text + ';' + '!GetList#');
end;


procedure TFormClient.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var i, iPos1, iPos2, iPos3 :integer;
    sFarbe, sText, sUsername, sIP: String;
begin
    sText := Socket.ReceiveText;

    if Pos('/', Trim(sText)) = 1 then
    begin
      iPos3 := Pos(';', sText);
      sIP := '';
      if iPos3 > 0 then
      begin
        sIP := Copy(sText, 2, iPos3-1);

        if sIP = sEigeneIP then
        begin
          sText := Copy(sText, iPos3+1, Length(sText));
          if Pos('!LIST#', sText) > 0 then
          begin
            sText := Copy(sText, Pos('#', sText) + 1, Length(sText));

            repeat
              if Pos(';', sText) > 0 then
              begin
                Form2.richeditusers.lines.Add(Copy(sText, 1, Pos(';', sText)-1));
                sText := Copy(sText, Pos(';', sText) + 1, Length(sText));
              end
              else
              begin
                Form2.richeditusers.lines.Add(Copy(sText, 1, Length(sText)));
                sText := '';
              end;
            until Length(sText) > 0;

          end;
        end;
      end;
      Exit;
    end;

    iPos1 := Pos(';', sText);
    sFarbe := '';
    if iPos1 > 0 then
    begin
      sFarbe := copy(sText, 1, ipos1 -1);
      delete(sText, 1, iPos1);
    end;

    iPos2 := Pos(';', sText);
    if iPos2 > 0 then
    begin
      sUsername := copy(sText, 1, ipos2 -1);
      delete(sText, 1, ipos2);
    end;

    if (stext <> '') then
    begin

      if sFarbe = '' then
        sFarbe := '0';
      RichEditNachrichten.SelAttributes.Color := strtoint(sFarbe);
    richeditNachrichten.Lines.Add(sUsername + ' -> ' + sText);

    end;
end;

procedure TFormClient.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  Client.Socket.Close;
end;


Und der Server:

Code:
function TFormServerMain.fsGetChatterList : string;
var sList : string;
    iI : integer;
begin
  Result := '';
  sList := '';
  try
    for iI := 0 to ListBoxUser.Count - 1 do
    begin
      if iI = 0 then
        sList := sList + ListBoxUser.Items[iI]
      else
        sList := sList + ';' + ListBoxUser.Items[iI];
    end;
  finally
    Result := sList;
  end;
end;


procedure TFormServerMain.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var i:integer;
    sNachricht: String;
    iPos1: Integer;
    iPos2: Integer;
    iPos3: Integer;
    sFarbe: String;
    sUsername: String;
    sText: String;
    sChatterList : string;
begin
  sChatterList := '';
  sNachricht := Socket.ReceiveText;
  iPos1 := Pos(';', sNachricht);
  if iPos1 > 0 then
  begin
    sFarbe := copy(sNachricht, 1, ipos1 -1);
    delete(sNachricht, 1, iPos1); //sNachricht := Copy(sNachricht,ipos1+1,length(sNachricht));
  end;

  iPos2 := Pos(';', sNachricht);
  if iPos2 > 0 then
  begin
    sUsername := copy(sNachricht, 1, ipos2 -1);
    delete(sNachricht, 1, ipos2);
  end;

  //Name von Client beim Connect erhalten
  if Pos('!Connected#', sNachricht) > 0 then
  begin
    ListBoxUser.Items.Add(Socket.RemoteAddress + '-' + sUsername);
  end
  else
  begin
    if Pos('!Disconnected#', sNachricht) > 0 then
    begin
      for i := 0 to ListBoxUser.Count - 1 do
      begin
        if ListBoxUser.Items[i] = Socket.RemoteAddress + '-' + sUsername then
        begin
          ListBoxUser.Items.Delete(i);
          Exit;
        end;
      end;
    end
    else
    begin
    if Pos('!GetList#', sNachricht) > 0 then
    begin
      //Liste der Chatter versenden
      sChatterList := fsGetChatterList;
      for i := 0 to server.Socket.ActiveConnections - 1 do
      begin
        server.Socket.Connections[i].SendText('/' + server.Socket.Connections[i].RemoteAddress + ';!LIST#' + sChatterList);
      end;
    end
    else
    begin
      for i := 0 to server.Socket.ActiveConnections - 1 do
        server.socket.Connections[i].SendText(sFarbe + ';' + sUsername + ';' + sNachricht);
      end;
    end;
  end;
end;

Ich hoffe jemand nimmt sich die Zeit ^.^ - Danke im vorraus

Geändert von Lyan (31. Aug 2011 um 10:45 Uhr)
  Mit Zitat antworten Zitat