TMemo macht immernoch Probleme



  • Versuch doch mal, nicht auf die Texteigenschaft von TMemo zuzugreifen, sondern stattdessen auf die einzelnen Lines. Prüfe auch mal die eigeschafr Memo->Lines->Count, ob die Anzahl > 0 ist.
    Die Zugriffsverletzung sieht mir ganz danach aus, als ob das Memofeld keine Einträge enthält.

    So könntest du auch einen String aus den einzelnen Lines erzeugen:

    String s;
    for (int i=0; i < Memo1->Lines->Count;i++)
    {
      s += Memo1->Lines->Strings[i]+"\n";
    }
    

    In s steht dann der gesamte inhalt des Memofeldes, jeder Zeile ist mit dem Wagenrücklauf getrennt.

    Vielleicht hast du in der Funktion, die deine Funktion zum Wegschreibn aufruft, vielleicht das Memofeld nochmals deklariert?



  • Maffe001 schrieb:

    Hi,

    ich hatte vor ein paar Wochen einen Thread eröffnet, der sich um diese Problem dreht. Allerdings hat der mich nicht wirklich weitergebracht. Ich versuche es jetzt schon eine ganze Weile, aber ich dreh mich immer nur im Kreis. 😡

    Handelt es sich bei Deinem alten Thread um diesen?
    Falls ja: Hast Du meine letzte Antwort mal begutachtet und Dich über c_str()
    schlau gemacht?
    Falls ja: Was hast Du gemacht (da es ja offenbar nicht funktioniert hat)?
    Ist der Aufruf Deiner abgeänderten (Argumenttyp von char* auf AnsiString)
    noch der gleiche wie oben angegeben?

    Gruß,

    Alexander



  • @Burkhi
    Das was du da machst geht auch einfacher.
    String s = Memo1->Lines->Text;

    @Alexander
    Wenn er die Deklaration von InsertComment so abgewandelt hat (Parameter AnsiString), dann kann er auch ohne Probleme const *char übergeben, da in diesem Fall sowieso eine Kopie gemacht wird.



  • Braunstein schrieb:

    @Alexander
    Wenn er die Deklaration von InsertComment so abgewandelt hat (Parameter AnsiString), dann kann er auch ohne Probleme const *char übergeben, da in diesem Fall sowieso eine Kopie gemacht wird.

    Bist Du Dir bzgl. der Kopie vollkommen sicher?
    Mich würde einfach mal interessieren, ob Maffe001 überhaupt mal was in der
    Richtung ausprobiert hat. Bevor man nach anderen Fehlerquellen sucht, sollte
    man alle bisher bekannten potentiellen Fehlerquellen abklopfen.
    Mag ja sein, daß c_str() überhaupt keine Probleme an der Stelle bereitet, aber
    sicher kann man sich erst sein, wenn man c_str() wegläßt oder korrekt verwendet.

    Gruß,

    Alexander



  • Hallo Alexander,

    Ich bin mir bezüglich der Kopie sicher. Es muss hier ja implizit gecastet werden (*char auf AnsiString) und das macht eine Kopie unabdinglich. Prinzipiell hast du natürlich recht. Die Verwendung von c_str() macht hier keinen Sinn.
    Die Meldung von CodeGuard deutet allerdings darauf hin, dass irgendwie versucht wird auf nicht initialiserten Speicher zuzugreifen. Da ist wohl noch irgendetwas anderes faul.

    Ciao



  • So,

    ich hab mich jetzt noch mal mit allen Tips bis auf den Lines auseinandergesetzt. Ich bin jetzt auf dem Stand, dass ich den AnsiString direkt übergeben will. Wie schon gesagt, die Meldung von Codeguard bleibt die Gleiche.

    Access in invalid memory
    --Attempt to access 4 Bytes at 0x00000000+752

    Ich hab auch schon versucht einfach den String in ..->KInfoEdit->Text an einen anderen AnsiString zu übergeben mit dem gleichen Ergebnis.

    AnsiString QStrg;
    
    QStrg = MedKInfo->KInfoEdit->Text;
    

    c_str() hab ich mir auch nochmal angeschaut. Laut der Doku, die ich gefunden habe. Versucht c_str() auf die intere Variable Data zuzugreifen. Wenn etwas enthalten ist, dann wird der String ansonsten ein leerer String übergeben.

    The c_str() function returns a pointer to AnsiString’s private Data variable. It is an inline function whose declaration is ridiculously simple:

    char* __fastcall c_str() const
    { return (Data)? Data: "";}

    If Data is non-null, c_str() returns a pointer to the data. If Data is null, c_str() returns an empty string.

    Ich hab beim Debuggen gesehen, dass er versucht auf Data zuzugreifen, und dann NULL zurückgibt. Wenn ich dem Debugger glauben schenken kann, sind aber Daten in dem String enthalten.
    😕

    Edit:
    @burkhi:
    Nein ich hab das Memofeld nicht noch einmal deklariert.



  • Ich muss mich nochmal berichtigen. Ich hab jetzt nochmal die c_str()-Variante probiert, weil ich nicht mehr ganz sicher war. In Data ist tatsächlich nichts enthalten, obwohl ich etwas in das Feld eingetragen habe. Nach dem Debugger ist aber in ..->KInfoEdit->Text der Text enthalten.
    Jetzt verstehe ich gar nichts mehr. 😕



  • So jetzt bin ich komplett verwirrt. Ich hab jetzt noch die Lines-Variante ausprobiert.

    AnsiString QStrg;
    
    if (MedKInfo->KInfoEdit->Lines->Count > 0)
      for (int zaehler = 0; zaehler < MedKInfo->KInfoEdit->Lines->Count; zaehler++)
        QStrg += MedKInfo->KInfoEdit->Lines->Strings[zaehler];
    

    Ich hab den Debugger auf der if-Zeile anhalten lassen und mir den Wert in ..->Lines->Count angesehen und er war tatsächlich gleich der Zeilenanzahl, die ich eingegeben habe.
    Allerdings einen Schritt weiter sprang der CodeGuard an mit der gleichen Meldung, wie vorher. 😕😡



  • Maffe001 schrieb:

    Also ich erzeuge von meinem Programm eine Form mit einem TMemo und zwei TButton.

    Du erzeugst also ein Formular dynamisch? Kanst Du mal zeigen wie?
    Und (nur für Begriffsstutzige wie mich) von welchem Typ sind doch noch mal
    MedKInfo(TForm*?) und KInfoEdit(TMemo*?)?
    Hast Du zwischenzeitlich auch mal das Projekt neu erzeugen lassen?

    Gruß,

    Alexander



  • Ich hab's!!! Der Fehler ist winzig und der, der den verbrochen hat (ich), richtig dämlich! 🙄

    Und zwar hab ich beim Erzeugen der Form den eigentlichen Pointer überdeklariert, so dass da irgendetwas durcheinander gekommen ist.
    Und zwar:

    //MedComment.h
    extern PACKAGE TMedKInfo *MedKInfo;
    
    //MedComment.cpp
    TMedKInfo *MedKInfo;
    
    //MainForm.cpp
    TMedKInfo *MedKInfo = new TMedKInfo (Application);
    

    D.h. ich hab den erzeugten Pointer aus der MainForm.cpp mit dem in der MedComment.cpp überschrieben und schon war die Verwirrung komplett.

    Danke, an alle die sich die Zeit genommen haben mir zu helfen. Ich hoffe, ich habe niemanden in Unglauben an den AnsiString gestürzt. 😃


Anmelden zum Antworten