Liste verwalten
-
Wie würdet ihr vorgehen wenn ihr eine Liste mit Strings verwalten müsst und die folgendermaßen aussieht:
192.168.6.4 | idle
192.168.6.5 | Clients: 0
192.168.6.22 | Clients: 7Problemfall: wenn jetz nachträglich "192.168.6.4 | Clients: 1" eingetragen werden muss soll die Position von vorhergehenden Eintrag übernommen werden der auf diese IP Adresse passt.
also:
192.168.6.4 | idle = 192.168.6.4 | Clients: 1 // Updates treffen alle 15 sec ein
192.168.6.5 | Clients: 0
192.168.6.22 | Clients: 7Wie würdet ihr vorgehen um eine List zu haben wo immer nur ein Eintrag pro IP eingetragen wird. Das schöne ist das ich bei der TNM UDP Komponenten FromIP als String erhalte.
Bin kurz vorm verzweifeln weil ich schon tausend mal den Quelltext abschnitt verworfen und neu konstruiert habe, aber es funktioniert immer nur teilweisse, bin kurz vorm verzweifeln
-
Hi,
da ich im Moment nicht so viel Zeit habe, nur eine kurze Anregung...
Der Versuch mit der TStringList aus den anderen Posting sieht nicht so verkehrt aus, jedoch würde ich auf DupIgnore verzichten (da ja nur die linke Seite der Zeile (die IP) identisch ist).
Versuch statt dessen mal durch die einzelnen Zeilen der StringList zu iterieren und überprüfe mit list->Strings[zeilennr].AnsiPos(FromIP) zu ermitteln, ob die aktuelle Zeile mit der aktuellen FromIP beginnt. Diese Zeile löschen und mit dem aktuellen Status neu einfügen...for (int i = 0; i < list->Count; i++) { if (list->Strings[i].AnsiPos(FromIP) == 1) { // yep, aktuelle Zeile beginnt mit der Zeichenfolge in FromIP // Zeile löschen und neu einfügen... } }
-
die Sache mit der AnsiPos sieht interessant aus
mit AnsiPos hätte ich auch ein Problem weniger da ich mit Ansi Pos die IP + Status verwenden kann ohne mir über diese Sort ständig zu stolpern. Werds mal ausführlich testen wenn ich zuhause bin, danke schonmal !
-
Ok, ich glaube das ich jetzt alles richtig habe:
void __fastcall TForm1::UDP1DataReceived(TComponent *Sender, int NumberBytes, AnsiString FromIP, int Port) { if (NumberBytes>-1 && NumberBytes<1024) { char Buff[1024]; int j,index,st; String check; bool value = false; UDP1->ReadBuffer(Buff, 1024, j); Buff[j]=0; for (int i = 0; i < list->Count; i++) { if (list->Strings[i].AnsiPos(FromIP) == 1) { value = true; list->Strings[i] = AnsiString(FromIP +" "+ Buff); } } if (value == false) list->Add(FromIP +" "+ Buff); list->Sort(); Form1->ListBox1->Clear(); Form1->ListBox1->Items->AddStrings(list); //-------------Disconnect erkennen und aus stringlist löschen check = FromIP + " "+ Buff; st = strlen(check.c_str()); if (check[st]=='d' && check[st-1]=='e' && check[st-2]=='s') { for (int i = 0; i < list->Count; i++) { if (list->Strings[i].AnsiPos(FromIP) == 1) { list->Delete(i); Memo2->Lines->Add(FromIP +": Session 2004 geschlossen"); list->Sort(); } } } } }Was passiert nun wenn z.B 2 Clients gleichzeitig senden ?
wenn ich das AnsiPos früher gekannt hätte wäre vieles viel viel einfacher gewesen
Für den Tip mit den Stringlisten vielen Dank an "great ol Jansen"
Apropo ,entfernt Delete(int) auch die Lücken in der StrinListe oder muss ich selber dafür Rechnung tragen?
-
Zero01 schrieb:
Was passiert nun wenn z.B 2 Clients gleichzeitig senden ?
Dann solltest Du 2 Einträge in der Liste haben.
Oder wie ist die Frage zu verstehen?Zero01 schrieb:
Für den Tip mit den Stringlisten vielen Dank an "great ol Jansen"
?? (Sollte ich mich jetzt beleidigt oder geehrt fühlen?
Zero01 schrieb:
Apropo ,entfernt Delete(int) auch die Lücken in der StrinListe oder muss ich selber dafür Rechnung tragen?
Delete(int Index) löscht eine komplette Zeile aus der StringList. Falls Du mit Lücken Leerzeilen meinst: Ja die mußt Du selbst löschen. Aber wo kommen die überhaupt her?
-
Öh wärs nicht angenehmer mit einer Names-Values Kombination zu arbeiten? (Wo IPs Names sind?)
-junix
EDIT: Siehe TStringList::Names und TStringList::Values in der BCB-Hilfe
-
Vielen Dank Leute, werde mich mal um die letzten Postings kümmern damit ich eure Vorschläge einbringen kann, hört sich alles gut an soweit.
@ Joe_M: Der Tip mit den Stringlisten habe ich bei ähnlichen Problemen vor einiger Zeit von Jansen bekommen. Keine Sorge bin dir für deinen Post ebenso Dankbar
Aber letztendlich läuft der Code super den ich als letzes gepostet habe.
-
na dann bin ich ja beruhigt.

Investier mal ein paar Stunden und schau Dir TStringList und AnsiString mal genauer an (jede Zeile in einer TStringList ist ein AnsiString). Beide Klassen sind sehr mächtig und flexibel.
-
Ach du meine Güte, in der Ausbildung kamen nahtlos verkettete Listen nach den Klassen, da spart mir eine Stringliste das ganze "Pointergewurschtel
" und somit analog auch mehr übersicht. Na gut, es gibt Leute die sagen "Sowas muss man auch mal per Hand gemacht haben", aber das näher zu erläutern wäre zu offtopic. Habe mir die Stringlisten in den letzten 2 Tagen ausführlich angeguckt und darin eine Vielzahl an möglichkeiten gesehen wo man sich früher einen bei abgebrochen hat. C++ ruled
-
Zero01 schrieb:
... man sich früher einen bei abgebrochen hat....
Nicht wahr...
Mit AnsiString verhält es sich ähnlich.
Aber dennoch gibt es mehr als genug Fälle, wo die Standardkomponenten nicht ausreichen und erweitert, oder durch eigene Komponenten / Klassen ersetzt werden müssen. Dann rächt es sich, wenn man die 'Handarbeit' nicht beherscht.
-
Ja schon ,wenn man einen vernünftigen Konstruktor hat und sauber seine Funktionsdefinitionen angelegt hat ist das auch ne gute Sache, aber übersichtlich finde ich das nicht gerade. Zu mal man ne menge Kopieraufwand spart weil man ja jediglich nur Adressen vertauscht oder für neuem Inhalt ne Adresse alokiert.