Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TList mit records - wie darin suchen? (https://www.delphipraxis.net/26955-tlist-mit-records-wie-darin-suchen.html)

Tubos 1. Aug 2004 23:03


TList mit records - wie darin suchen?
 
Hallo!

Ich möchte alle User eines Chats abspeichern.
Dazu verwende ich ein record und eine TList:
Delphi-Quellcode:
 type
 user = record
          ip: string; // Die IP eines anderen Users
          port: integer; // Der Port, den ein anderer User verwendet
          name: string; // Sein nick
         end;
 userpointer = ^user;
...
users: TList; // Liste mit den Usern
Und wenn ein neuer User hinzukommt, dann füge ich den in die Liste hinzu:
Delphi-Quellcode:
var newuser: userpointer;
...
new(newuser);
newuser.ip:=a;
newuser.port:=b;
newuser.name:=c;
users.Add(newuser);
Doch wenn der User den Chat wieder verlässt, habe ich als einzige Info seine IP.
Wie kann ich in der Liste nach einem Record suchen, wenn ich nur eine Eigenschaft kenne?

Tubos

edit:
ops...müsste doch einfach nur alle items durchgehen und nachsehen
ist schon spät, kann gar nicht mehr denken *g*
geht es einfacher?

Dani 2. Aug 2004 00:56

Re: TList mit records - wie darin suchen?
 
Hi,

Wenn du die IP zusätzlich als 4-Byte Zahl speicherst und den Vergleich damit durchführst gehtst evtl. schneller als mit String-Vergleichen (?)

Diese Funktion könnte dabei nützlich sein.

Guts Nächtle! :)

SirThornberry 2. Aug 2004 06:44

Re: TList mit records - wie darin suchen?
 
eine Schleife machen und darin das Item von der TList auf deinen Recordpointer casten. Dann kannst du auch auf die eigenschaften zugreifen.
Delphi-Quellcode:
var Lcount: Integer;
begin
  for Lcount := users.count-1 downto 0 do
  begin
    if userpointer(users.items[LCount]).ip = gesuchteIP then
    begin
      dispose(users.items[LCount]);
      users.delete(LCount);
      break;
    end;
  end;
end;

Tubos 2. Aug 2004 10:27

Re: TList mit records - wie darin suchen?
 
Zitat:

Wenn du die IP zusätzlich als 4-Byte Zahl speicherst und den Vergleich damit durchführst gehtst evtl. schneller als mit String-Vergleichen
Da hast du sicher recht, aber die Methode send vom Indy-UDP-Client übernimmt nur einen String.
Und wenn ich das als 4-Byte-Zahl speichern würde, müsste ich es ständig umwandeln wenn ich was senden will - nicht gerade die beste Lösung.
[EDIT]achso, zusätzlich...das wäre eine tolle Lösung! :d
Da aber der Chat nur mit maximal 5-10 Usern arbeiten wird, kann ich das vernachlässigen ;).

@SirThornberry: Danke!

Tubos 2. Aug 2004 12:28

Re: TList mit records - wie darin suchen?
 
Eine Frage noch:
wieso gibt dieser code immer -1 zurück, obwohl die ip 'a' in der Liste vorhanden ist?

Delphi-Quellcode:
function finduserip(ip: string): integer; // Gibt die Nummer des users in der "users"-Liste zurück, der die übergebene IP hat.
var i: Integer;
begin
 for i := users.count-1 downto 0 do
 begin
   if userpointer(users.items[i]).ip = searchip then
   begin
    result:=i;
    break;
   end;
 end;
 result:=-1; // wenn nichts gefunden wurde, wird -1 zurückgegeben
end;
Code zum testen:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var u: userpointer;
begin
 new(u);
 u.ip:='a';
 u.name:='a';
 u.port:=1;
 users.Add(u);
 new(u);
 u.ip:='b';
 u.name:='b';
 u.port:=2;
 users.add(u);
 showmessage('Nach dem Hinzufügen von 2 Items ist users.count = '+inttostr(users.Count));
 showmessage('user nr. '+inttostr(finduserip('a'))+' hat die IP a.');
end;

Dani 2. Aug 2004 12:54

Re: TList mit records - wie darin suchen?
 
Zitat:

Zitat von Tubos
Eine Frage noch:
wieso gibt dieser code immer -1 zurück, obwohl die ip 'a' in der Liste vorhanden ist?

Naja schaus dir doch nochmal an: Zuerst wird die for-Schleife durchgegangen und danach Result auf -1 gesetzt... egal was es vorher war. ;) Grund: break verläßt die Schleife, aber nicht die Funktion. Verschiebe Result := -1 ganz nach oben in der Funktion und es sollte gehen.

Delphi-Quellcode:
function TForm1.finduserip(searchip: string): integer; // Gibt die Nummer des users in der "users"-Liste zurück, der die übergebene IP hat.
var i: Integer;
begin
result:=-1; // wenn nichts gefunden wurde, wird -1 zurückgegeben
for i := Users.count-1 downto 0 do
begin
   if PUser(users.items[i]).ip = searchip then
   begin
    result:=i;
    break;
   end;
end;
end;
Gruß,
Dani

Tubos 2. Aug 2004 13:17

Re: TList mit records - wie darin suchen?
 
ooh...danke!
das mit break hatte ich übersehen :lol:

nailor 2. Aug 2004 13:18

Re: TList mit records - wie darin suchen?
 
oder aus dem break nen "exit" machen


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 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