vector Inhalt ploetzlich weg



  • Benutze niemals 'using' in einem Header.



  • Hi virtuell Realisticer ,

    Warum quaelst Du Dich mit vector ... 'rum??? 😕

    Wenn Du mit BCB arbeitest, nimm doch besser in Deine Klasse ein TStringList auf!
    😉
    im Constructor mit TStringList *SL=new TStringList; erzeugen
    im destructor delete SL; vernichten.

    Zum Fuellen:
    SL->Clear();
    SL->Add("Neuer Test");
    .
    .
    .

    Beim Auslesen gibt's da kaum Probleme! :p

    PS: Anderes Forum waere doch besser!(?)



  • Benutze niemals 'using' in einem Header.

    Hatt ich auch schon wieder rueckgaengig gemacht und durch ein

    std::vector < AnsiString > m_Values;
    

    ersetzt (Hab doch gestern erst wieder die Stelle in Marc++s Buch gelesen 🙄 )

    PS: Anderes Forum waere doch besser!(?)

    Wenn ich es mit TStringList mache, dann ja. Aber vector gehoert doch eher hier
    herein.

    mfg
    v R

    PS: Werd es jetzt erstmal mit TStringList ausprobieren, dennoch find ich es
    sehr merkwuerdig, dass der vector ploetzlich leer ist 😞



  • 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