AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi TList mit records - wie darin suchen?
Thema durchsuchen
Ansicht
Themen-Optionen

TList mit records - wie darin suchen?

Ein Thema von Tubos · begonnen am 2. Aug 2004 · letzter Beitrag vom 2. Aug 2004
Antwort Antwort
Tubos

Registriert seit: 25. Feb 2004
Ort: Yspertal (Niederösterreich)
1.014 Beiträge
 
Delphi 7 Personal
 
#1

TList mit records - wie darin suchen?

  Alt 2. Aug 2004, 00:03
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?
Lukas
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

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

Re: TList mit records - wie darin suchen?

  Alt 2. Aug 2004, 01:56
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!
Dani H.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: TList mit records - wie darin suchen?

  Alt 2. Aug 2004, 07:44
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Tubos

Registriert seit: 25. Feb 2004
Ort: Yspertal (Niederösterreich)
1.014 Beiträge
 
Delphi 7 Personal
 
#4

Re: TList mit records - wie darin suchen?

  Alt 2. Aug 2004, 11:27
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!
Lukas
  Mit Zitat antworten Zitat
Tubos

Registriert seit: 25. Feb 2004
Ort: Yspertal (Niederösterreich)
1.014 Beiträge
 
Delphi 7 Personal
 
#5

Re: TList mit records - wie darin suchen?

  Alt 2. Aug 2004, 13:28
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;
Lukas
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

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

Re: TList mit records - wie darin suchen?

  Alt 2. Aug 2004, 13:54
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
Dani H.
  Mit Zitat antworten Zitat
Tubos

Registriert seit: 25. Feb 2004
Ort: Yspertal (Niederösterreich)
1.014 Beiträge
 
Delphi 7 Personal
 
#7

Re: TList mit records - wie darin suchen?

  Alt 2. Aug 2004, 14:17
ooh...danke!
das mit break hatte ich übersehen
Lukas
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#8

Re: TList mit records - wie darin suchen?

  Alt 2. Aug 2004, 14:18
oder aus dem break nen "exit" machen
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:53 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