AGB  ·  Datenschutz  ·  Impressum  







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

(Keine) Freude mit Zeigern

Ein Thema von Dani · begonnen am 26. Dez 2003 · letzter Beitrag vom 26. Dez 2003
 
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#1

(Keine) Freude mit Zeigern

  Alt 26. Dez 2003, 02:59
Frohe Weihnachten allerseits

Ich arbeite gerade zum Spass an einem mittelmäßigen Chatprogramm für Delphi, was bisher auch relativ zügig voran ging, aber jetzt scheitert es an einem ziemlich nervigen (weil eigentlich nicht komplizierten) Problem....Zeiger....

Kann mir da evtl. jemand etwas unter die Arme greifen?

In der Haupt-Unit sind nämlich u.A. folgende Typen und Variablen definiert:

Delphi-Quellcode:
type

{TCchatMessage - Träger für alle Art von Datenpacketen, die zwischen Client und Server verschickt werden}
TChatMessage = record
    MsgType : Byte;
    MsgContent : array[0..1023] of char;
   end;

{TChatRoom - Ein Element innerhalb der Chatroomsm ObjectList}
  TChatroom = class(TObject)
    ClientsInRoom : TList;
    Name : String[30];
   end;

  PChatroom = ^TChatroom;

{TChatRoom - Virtuelle Entsprechung eines Chat-Benutzers und Element der AllClients ObejectList}
  TChatClient = class(TObject)
    Nickname : String[15];
    IPAddr : String[16];
    Room : PChatroom;
    Hash, awaymsg, dndmsg, abouttext : String;
    BannedFromRooms, IgnoredClients : TStrings;
    HasIdentified, IsAdmin: Boolean;
    Status : TClientstatus;
    Thread : PIDPeerThread;
   end;

  PChatClient = ^TChatClient;

var
  Form1: TForm1;
  MsgQueue, AllClients, BanList, Chatrooms: TObjectList;
  //In diesen Listen werden die Chaträume, User usw. gespeichert und verwaltet
Das läuft dann so ab, dass Client und Server sich zuerst Hallo sagen, der Server einen neuen TChatClient in die Allclients Liste einfügt und dem Client dann einen Raum zuweist. Ein paar wichtige Funktionen, die das erledigen sehen so aus:
(die sind glaube ich nicht das Problem, aber glauben hilft ja nix :-/ )

Delphi-Quellcode:
function InitNewClient(IP: String; AThread: PIdPeerThread): TChatClient;
begin
Result := TChatClient.Create;
with Result do
  begin
   Nickname := IP; //temporär, Namenszuweisung erfolgt im nächsten Schritt
   IPAddr := IP;
   Hash := StringToHash(Nickname+IPAddr); (** im Moment noch sinnlos...vielleicht später nützlich [Präadaption :P]  **)
   Room := AssignLobby; //Sucht bzw. erzeugt die nächste nicht überfüllte Lobby
   Room.ClientsInRoom.Add(@Result); //ob das funtkioniert?
   awaymsg := '';
   dndmsg := '';
   abouttext := '';

   BannedFromRooms := TStringlist.Create;
   IgnoredClients := TStringlist.Create;

   HasIdentified := false;
   IsAdmin := false;
   
   Status := csAvailable;

   Thread := AThread;
  end;
end;

function CreateRoom(designation: string): TChatroom;
begin
Result := TChatroom.Create;
Result.Name := designation;
Result.ClientsInRoom := TList.Create;
end;

function AssignLobby: PChatRoom;
var i: integer;
begin
//Untersuche Räume - Nächste Lobby die weniger als MaxUsersPerRoom User hat wird zurückgegeben
i := 1;
Result := nil;

 While Result=nil do
  begin
   Result := GetChatroomByName('LOBBY-'+IntToStr(i));
   Inc(i);
   If Result = nil then ChatRooms.Add(CreateRoom('LOBBY-'+IntToStr(i)))
    else
     If Result.ClientsInRoom.Count<MaxUsersPerRoom then
       break;
  end;
end;
Das klappt schon ganz ordentlich, nur eine Funktion zickt noch (kann mir aber nicht sicher sein, dass es die einzige ist) :

Delphi-Quellcode:
function GetChatroomByName(RoomName: String): PChatRoom;
var i: Integer;
begin
Result := nil;
 for i:=0 to ChatRooms.Count-1 do
  If (Chatrooms[i] as TChatroom).Name = RoomName then
   begin
    Result := Pointer( (Chatrooms.Items[i] as TChatRoom));
    break;
   end;
end;
Das Problem: Wenn ich diese Funktion aufrufe, gibt sie zwar einen gültigen Zeiger auf *irgendetwas* anderes als nil zurück, allerdings erhalte ich nur "Datenmüll" bei folgendem Test:
ShowMessage(GetChatroomByName('LOBBY-1').Name); ---------------------------
IP Delphi Chat
---------------------------
m‹À¼ÒJ ( + sehr viele Leerzeichen)
---------------------------
OK
---------------------------


Ich hab schon verschiedene Dinge ausprobiert, da ich dachte es stimme etwas von der Logik her mit der GetChatroomByname Funktion nicht, aber eigentlich müsste sie ja das richtige Ergebnis liefern, oder?

Viele Grüße an alle DP'ler und danke schonmal fürs lesen! Normalerweise versuche ich nicht unnötig auszuholen beim posten aber das hier ist schon etwas verzwickt
Dani H.
  Mit Zitat antworten Zitat
 


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 19:12 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