vector Inhalt ploetzlich weg



  • Hallo,

    @DerAltenburger
    warum kein vector? Als quälen würde ich das nicht gerade bezeichnen.

    @virtuell Realisticer

    Die Schleife würde ich aber so machen

    for(std::vector < AnsiString >::iterator i=m_Values.begin(); i!=m_Values.end(); i++)
               this -> Panels -> Items[i] -> Text = *i;
    

    Meinst du mit leer, das kein Element mehr im Vektor ist, oder das die enthaltenden Elemente leer sind?
    Wenn die Elemente leer sind, so musst du bedenken, dass AnsiString mit Referenzzähler arbeitet, das also bei Kopien kein wirklich neuer String erzeugt wird. Wenn du also das Orginal löschst ist auch die Kopie leer. Die Referenz kannst du mit der MemberMethode Unique() auflösen.

    Ciao

    [ Dieser Beitrag wurde am 19.03.2003 um 13:31 Uhr von Braunstein editiert. ]



  • Die Schleife würde ich aber so machen

    for(std::vector < AnsiString >::iterator i=m_Values.begin(); i!=m_Values.end(); i++)
    this -> Panels -> Items[i] -> Text = *i;

    Ne, das kann nicht gehn, da 'i' ja vom Typ 'AnsiString *' ist. Der Zugriff auf
    'Items[i] -> Text' funktioniert dann nicht mehr.

    mfg
    v R



  • Doch das müsste schon gehen.
    i ist ein Iterator auf AnsiString



  • @Braunstein

    Ob 'Quaelerei' oder nicht, ist Ansichtssache, da haste Recht.

    Ich meinte nur, wenn er mit BCB arbeitet, macht sich das besser auch BCB- Funktionen/ Klassen zu benutzen (Da passt (fast 😉 )alles direkt zusammen).

    Bei 'ner BCB- Stringliste weis ich was d'rin ist - KOPIEN der Strings.

    Deine Aussage mit dem Referenzzaehler bei AnsiString se' ich aber nicht ganz so:

    Wenn ( IM BCB!!!) einer AnsiString- Variablen der Inhalt einer anderen zugeordnet wird, ist der Inhalt auch noch da, wenn die andere geaendert wird!!!
    Deine Aussage stimmt nur, wenn einer Zeigervariablen (auf AnsiString) die Adresse einer anderen verpasst wird. Das macht der Realisticer aber nicht!(?)

    @Realisticer

    Das mit dem vector muesste gehen!(hab's mit BCB 4.0 probiert!)
    Du musst vector.h includieren

    [ Dieser Beitrag wurde am 19.03.2003 um 13:51 Uhr von DerAltenburger editiert. ]



  • Probier mal das hier und schau ob es dann noch probleme gibt

    for(std::vector < AnsiString >::iterator i=m_Values.begin() , int n = 0; i!=m_Values.end(); ++i,++n)
               this -> Panels -> Items[n] -> Text = *i;
    


  • @DerAltenburger

    Das bei AnsiString Zuweisungen nur Referenzen übergeben werden, hat nix mit Pointern zu tun. Prinzipiell hast du natürlich recht.
    Wenn du einem AnsiString einen Anderen zuweist wird der Referenzzähler um 1 erhöht aber keine echte Kopie angelegt. Wenn du dann allerdings den ersten AnsiString änderst, müsste die Referenz aufgehoben werden und der Zähler wieder derkrementiert werden.
    siehe auch
    http://ourworld.compuserve.com/homepages/praxisservice/kapit3.htm



  • @Braunstein

    Da sind wir uns ja einig 😉 .

    Nur erklaert das jetzt nicht das Problem vom Realisticer???

    Bei mir funktioniert sein Code, komisch!



  • So, ich hab jetzt diese beiden Funktionen ganz rausgenommen und korrigiere
    einfach nur die groesser der Teilbereiche nachdem die Progressbars weg sind.

    Jetzt steht dort wieder alles korrekt.

    Danke fuer die Hilfe von euch allen.

    mfg
    v R



  • vielleicht hast du den vektor kaputt gemacht in dem eine andere funktion in den speicherbereich dieses vektors schreibt. da gibt es überhaupt keine probleme bei AnsiString in vector. Mach mal ein Minimalbeispiel. Bestimmt macht ne andere Stelle in deinem Programm den Fehler



  • Hi,

    also in einem Minibeispiel sind die Daten in vector auch enthalten, wenn sich
    die Daten in nem Text-Element eines Panels aendert oder geloescht wird.

    Naja, ich werd mir den Quellcode nochmal durchlesen muessen.

    mfg
    v R


Anmelden zum Antworten