Text auf Änderungen überprüfen (beim Speichern, Öffnen,...)



  • Hi Leute!

    Wieder mal ein (vermutlich) simples Problem, bei dem ich einfach nur einen Denkhänger habe. Bitte entschuldigt sollte es das Thema bereits gegeben haben, ich tu mir im moment schwer Suchbegriffe zu finden.

    Ich hab einen simplen Texteditor, der bei verschiedensten Dingen (Öffnen,Speichern,Neu,...) überprüfen soll ob am Text was geändert wurde seit dem das letzte mal gespeichert / geöffnet wurde. Ich hab das ganze mal so gelöst:

    void CheckForChanges ()
    {
    Changes = false;
    if (Edit->Lines->Count == LastSavedState->Count)
            {
            for (i = 0; (Edit->Lines->Strings[i] == LastSavedState->Strings[i]) && (i < Edit->Lines->Count-1); i++);
            if (i < LastSavedState->Count-1) Changes = true;
    }
    else
            {
            Changes = true;
    }
    }
    

    Ist alles schön und gut, einfach und für mich logisch. Jez gibts aber das Problem, dass er liebend gern OutOfRange Errors zurückwirft (Hat das Textfeld z.B nur eine (0) Zeile). Nach einigem rumprobieren hab ichs dann irgendwie hinbekommen, er hat allerdings die letzte Zeile des Textes nicht mehr überprüft. Frustiert wie ich war hab ich das ganze dann gelöst in dem ich an die StringListen noch 2 leere Strings "drangehängt" hab (die er nachher wieder entfernt) und somit auch die letzte Zeile "von Wert" überprüft hat. Ich hoffe es gibt da noch ne bessere Lösung.

    Durch meine Lösung gibt es dann übrigens noch einen 2. Fehler wo er einen komplett mit dieser Funktion zusammenhanglosen String "zerstört". Werd darüber näheres posten wenn sich das Problem nicht von selbst löst.

    Hoffe ihr könnt (und wollt) mir helfen 🙂

    Edit: WOPPS, hab vergessen eine Variable umzubenennen, hieß vorher CheckScript, jez stimmt alles wida 🙂



  • Also ich habe sowas mal so wie Microsoft gelöst.
    Sobald eine Eingabe getätigt wurde (egal ob man nun einen Punkt entfernt und dann wieder eingibt) wird behauptet, das eine Änderung stattgefunden hat.



  • Was ist denn CheckScript?



  • Hallo

    Entweder auf dware hören oder (falls LastSavedState auch ein TStrings-Objekt ist)

    void CheckForChanges ()
    {
    Changes = (Edit->Lines->Text != LastSavedState->Text);
    }
    

    /Edit : Bitte beim nächsten Mal die C++ Tags anstelle der Code Tags benutzen

    bis bald
    akari



  • akari I love You^^

    Sowas ähnliches ist glaub ich auch mal in meinem Spatzenhirn herumgeschwirrt, hat aber ned geklappt. DankeFunzt. (C++ Tags, geht klar)

    Also ich habe sowas mal so wie Microsoft gelöst.
    Sobald eine Eingabe getätigt wurde (egal ob man nun einen Punkt entfernt und dann wieder eingibt) wird behauptet, das eine Änderung stattgefunden hat.

    Genau dieses Verhalten find ich extrem nervig, gibts nen Grund warum man das so machen sollte?



  • Hallo

    Deine lösung braucht ca. zweimal soviel Speicher wie nötig und muß einen potentiel aufwendigen Vergleich ausführen, wo die "MS"-Variante nur eine Variable abfragen muß.
    Bei ein paar Kilobyte Text spielt das keine Rolle, aber bei ein paar MegaByte sieht das schon anders aus.

    bis bald
    akari



  • Die andere Variante ist beim TEdit schon eingebaut:

    bool CheckForChanges()
    {
      return Edit->Modified;
    }
    

    Du mußt diese Eigenschaft beim Laden eines Textes zusätzlich wieder zurücksetzen (da jede Textänderung als Modifizierung angesehen wird).



  • Du könntest auch einen CRC oder MD5 über deinen Text bilden und den dann auf Änderung prüfen.



  • Burkhi schrieb:

    Du könntest auch einen CRC oder MD5 über deinen Text bilden und den dann auf Änderung prüfen.

    wollte ich auch gerade vorschlagen, sollte aber wirklich nur beim speichern/öffnen, etc gemacht werden und nicht ständig während des editierens.


Log in to reply