Zweimal TStringList. Position von ListB muss gleich Position ListA sein



  • sorry für den titel! 🙄

    ich stehe vor folgendem problem.
    ich habe eine TStringList ListA die Sorted auf true hat und Duplicates auf DupIgnore. Die ListB hat keine dieser zwei eigenschaften gesetzt. Mein problem ist nun das ich beim hinzufügen eines string in die listen die positionen immer an gleicher stelle haben muss. Also das hinzufügen in die beiden listen geschieht synchron. Wenn A etwas hinzugefügt wird wird auch B (etwas anderes) hinzugefügt. Der index muss dann aber ebenfalls synchron sein. Da aber ListA Sorted auf true hat und Duplicates auch aktive ist, geht das ja leider nicht. Folgendes wäre die ursache:

    a) Entweder stimmt der count nicht mehr überein da die einte duplikate nicht zulässt. oder aber..
    b) Die String positionen stimmen nicht mehr überein da die einte ja sortiert.

    was soll ich tun? Ich kann glaub sowas machen:

    if(ListA->Add("xyz"))
    {
        //ja der string wurde hinzugefügt also machs auch bei der normalen liste...
        ListB->Add("123");
    }
    

    dann wäre wenigstens das problem (b) gelöst mit dem synchronisierten count (also beide listen werden dann sicher gleichviele Strings haben). Doch in dieser lösung ist dann eben das String position problem nicht gelöst. Was bei ListA an 5 (war) ist nun z.b. an 3 obwohl ListB immer noch an der position 5 ist = asynchron. Interessant wäre es wenn sobald in der sortierten liste etwas verschoben (sortiert) wird, die neue(n) positionen auch der normalen liste zugewiesen werden.



  • Hallo

    so genau versteh ich jetzt nicht, warum bei gleichen Daten die beiden ListBoxen nicht auch die gleichen Einstellung bezüglich Sortierung haben sollen.

    Aber du kannst ja den Rückgabewert von Add() benutzen

    BCB_Hilfe zu Add() schrieb:

    Add gibt die Position des Eintrags in der Liste zurück, wobei der erste Eintrag den Index 0 hat.

    und dann mit der Methode Exchange in der zweiten ListBox den ebenfalls neuen Wert an die Position schieden, die du durch das Add bekommen hast.

    bis bald
    akari



  • danke für deine hilfe. ich glaube es funktioniert wie ich es brauche. das die zweite liste nicht sortiert ist hat schon seine gründe 🕶 es sind hald nie die gleichen werte, deswegen kann ich die zweite liste nicht sortieren lassen da es ja nicht die gleichen werte sind und somit wäre nach dem sortieren die position anderst. wenn beide listen die gleiche werte je Add bekommen, dann würde das sortieren beidener natürlich sinn machen.

    Also gehe ich richtig der annahme das alles was nicht -1 als rückgabewert ist = ok ist und = position, ja? dann wäre z.b. (index ist vom typ int)

    if(index >= 0)

    ein erfolgreiches adden in die sortierte liste?



  • Hallo

    jawohl, genauso stehts auch in BCB-Hilfe zu Add()

    bis bald
    akari



  • hallo. habe gerade etwas bemerkt und in der hilfe steht das:

    Hat Duplicates den Wert dupIgnore, gibt Add bei dem Versuch, einen doppelten String einzufügen, den Index des vorhandenen Eintrags zurück.

    das problem ist also das garnie -1 als rückgabewert übergeben wird 😮 ich brauche ja aber sowas. Ich muss wissen ob der eintrag erfolgreich war (index >= 0) oder nicht erfolgreich (-1)... geht das nicht irgendwie raus zu bekommen?



  • also eine möglichkeit wäre natürlich vor dem Add() mit einer lokalen int variable den count auslesen. Ist nach dem Add() Count von der liste grösser als count, dann kann man es in die zweite liste hinzufügen. Aber ist sowas effizient?



  • Dann überprüfe halt vorher z.b. mit

    IndexOf
    

    ob der Eintrag in der Liste vorhanden ist.

    MfG



  • @akari: Mir ist eben ein problem eingefallen. Das ganze mit Exchange klappt ja eigentlich insofern das in der unsortierten liste der neu hinzugefügte string nun durch exchange an die neue position gelangt, mittels des index von der sortierten liste. soweit sogut. aber da ja nun in der unsortierten liste ein exchange durchgeführt wurde und dort wo nun der neue string hinging, ein bereits vorhandener war, wird dieser ja automatisch an eine neue stelle (da unsortiert denke ich an die letzte stelle) verschoben. Das ganze führt dann zu folgendem problem: der alte string der eigentlich an einer position war wo er sein sollte (identische position mit der sortieten liste) ist nun an letzter stelle der unsortierten liste und somit stimmt für diesen string die identische position zur sortierten liste wiederum nicht mehr überein.

    verstanden? oder sehe ich da etwas falls das dies garnicht so ist? wäre eigentlich komisch. hast du da eine lösung für mich wie ich das problem lösen kann? das ganze führt so ja dann zu einem endlos problem. jedesmal wenn ein exchange stattgefunden hat, stimmt die position mit dem alten string nicht mehr überein. der neue string stimmt dann zwar aber eben.... 🙄



  • Hier läuft doch m.E. etwas konzeptionell falsch. Du hast ja bis jetzt noch nicht mitgeteilt, warum du überhaupt 2 Listen führst. Vermutlich doch deshalb, weil zusammengehörige Informationen verwaltet werden sollen. Beipielsweise Liste 1 Nachname, Liste 2 der dazugeörige Vorname.

    Das Vorgehen solche Daten in getrennten Listen zu halten und dann noch exakt zu synchronisieren ist aufwendig und lohnt nicht. Hier kommt noch erschwerend hinzu, dass eine List sortiert ist, und die andere nicht.

    Mögliche bessere Vorgehensweisen sind:

    - Erfasse alle Informationen in einem String und wenn du die einzelnen Informationen brauchst splittest du den String auf

    - Baue dir ein struct auf, welches alle deine Informationen enthält. Das kannst du auch in einer TList oder in einem vector halten.

    - Nutze ggf. eine DB und verschiedene Tabellen

    - Halte beide Stringlisten gleich (unsortiert) und nur wenn du die Liste sortiert brauchst, übergibst du diese einer 3. Stringlist, die die Sortierung vornimmt und anzeigt.



  • das mit dem splitten dachte ich mir auch schon aber dann gibt es ein problem. somit könnten sich dann doppelte strings einschleichen. ich mach dir ein beispiel mit splitten und ohne splitten (so wie es nun ist mit einer zweiten nicht sortieten liste).

    Mit splitten
    wird geaddet sollte aber nicht, da der string
    vor dem splitt gleich sit wie der darauf folgende

    Der_String_Vor_Dem_Split**<splitchar>**123

    wird geaddet sollte aber nicht, da der string
    vor dem splitt gleich sit wie der darauf folgende

    Der_String_Vor_Dem_Split**<splitchar>**1234

    wird geaddet sollte aber nicht, da der string
    vor dem splitt gleich sit wie der darauf folgende

    Der_String_Vor_Dem_Split**<splitchar>**12345

    Ohne splitten dafür mit zweiter liste
    das geht, also adde etwas anderes in die zweite liste
    Der_String

    das geht nicht mehr, also adde nichts in die zweite liste
    Der_String

    nur eben wie beschrieben, ist mir aufgefallen das dies zwar geht aber sobald ein exchange in der unsortierten liste stattfindet, die positionen zuvor ggf. dann nicht mehr stimmen. Was nun?



  • Ich habe das Problem überhaupt nicht verstanden. Fakt bleibt, dass dein Vorgehen nicht optimal ist (EDV-Technisch). Irgendwas stimmt an deinem Datenmodel nicht.

    Da mit der Aufnahme von gleichen Strings läßt sich mit dupIgnore erledigen. Es werden nur "einmalige" aufgenommen. Man kann ja auch vor dem ADD splitten und schauen, ob man ihn aufnimmt. Der Möglichkeiten gibt es viele. Hingewiese sei auf die Struktur.


Anmelden zum Antworten