RE Zeilen und "\n"



  • In einer RichEdit Zeile wirst du weder \n noch \r\n finden, es sei denn du schreibst es manuell rein.

    BTW: Was willst du eigentlich erreichen?



  • ich zeigs einfach kurz. 🙂

    int gesuchter_character = '\n';
    char* such_string;
    strcpy(such_string, "Ich bin zum testen.\n");
    if(strchr(such_string, gesuchter_character)) {
    printf("character gefunden!\n");
    else
    printf("character nicht gefunden!\n");



  • @kickass, hab versucht, deine Methode zu verwenden. Ich bekomm eine Access Violation:

    int gesuchter_character = '\n';
        char* such_string;
        strcpy(such_string, Txt->Lines->Strings[i].c_str());
        if(strchr(such_string, gesuchter_character))
          ShowMessage("ja");
    

    Ich will die Zeilen innerhalb eines Absatzes separieren. Die erste Zeile im Absatz soll nicht behandelt werden. Danach alle weiteren bis zum Absatzende.

    Solange ich die Situation nicht prüfen kann, bring ich zusätzliche Leerzeilen in den Text ein.

    @Eßer, auch wenn ich die Zeilenwechsel selbst eingefüht habe, lassen sie sich bei der Zeilenbearbeitung nicht mehr finden. Die Zeilen dürften in der Kompo mit Trim() bearbeitet worden sein. Ein Trim() meinerseits bringt kein neues Ergebnis. Auch Versuche mit AnsiLastChar brachten nur dicke Exeption's.

    Also liegen die Steuerzeichen zwischen den Zeilen. Wie könnte man da rankommen?



  • Original erstellt von <Omega-X>:
    Also liegen die Steuerzeichen zwischen den Zeilen.

    Falsch

    Die Zeilenumbrüche werden Schlicht in Elemente von Lines verwandelt was durchaus Konsequent und richtig ist.

    -junix



  • Die Umwandlung macht die Bearbeitung der Zeichen natürlich unmöglich, solange man nicht weiß, in welche Form sie umgewandelt werden. Laß ich mir den String ausgeben, enthält er ja nur die lesbaren Zeichen.

    Ist mir auch völlig klar, daß das in der Praxis genau so gebracht wird. Zum Bearbeiten sollte man aber drankommen können.



  • Also adde ich die aktuell in der for-Schleife bearbeitete Zeile in ein RE2. Dann prüfe ich RE2->Text auf "\n". Fehlanzeige. Nach Abschluß der Aktion enthält RE2 den gesamten Text von RE, aber kein "\n". Der Text von RE2 ist zusammengeklatscht.

    Also ist das "\n" doch nicht formatwirksam in der Zeile enthalten. Das sieht für mich nicht wie überlegte Absicht aus sondern wie unüberlegt übersehen. RE rutscht damit wieder mal in die Spielzeugklasse ab, IMHO.

    Kann sein, ich mach dickes Denkfehler. Trotzdem brauch ich die Lösung. Wer hat eine Idee?



  • Hi,
    IMHO ist am Ende jeder Zeile eines RE ein '\n'!
    Die Zeilen sind ja der Text des RE der an den '\n' in die Lines geteilt wird!
    Wie du aber herausfinden kannstob die Zeilen durch '\n' oder durch '\r\n' zusammengesetzt sind weiß ich nicht?

    MFG

    Alexander Sulfrian



  • Original erstellt von <Omega-X>:
    Ich will die Zeilen innerhalb eines Absatzes separieren. Die erste Zeile im Absatz soll nicht behandelt werden. Danach alle weiteren bis zum Absatzende.

    Was verstehst du denn konkret unter "Absatz"? Einen Textblock, der zwischen zwei Leerzeilen steht?



  • Ja, @Jansen. Genau gesagt, unter einem Absatz verstehe ich einen Fließtextblock, der von Returns eingeschlossen ist.

    Üblich sind Leerzeilen zwischen den Absätzen. Aber wenn keine vorhanden sind, will die Formatierung welche schaffen.

    @Alexander Sulfrian, das interne "\n" (oder sonstwas) daß der RE für den virtuellen WordWrap setzt, interessiert hier nicht. Die Umbrüche sind ja abhängig von der Darstellung und von der Editorbreite.

    Folgendes: Der gesamte markierte Text wird mit TAB eingerückt. Das klappt. Wenn aber später im Text geschrieben wird oder die Editorbedingungen sind anders, gerät die Formatierung durcheinander. Also muß jede Zeile innerhalb des Absatzes aufgeentert werden. Das macht üblicherweise "\r\n".

    Wie gesagt, setzen kann ich es. Da ich es aber nicht lesen kann, wird die Formatierung falsch.

    Hab übrigens noch einen Test gemacht: Jede in der for-Schleife bearbeitete Zeile hab ich selektiert und gelöscht:

    RE->SelText = RE->Lines->Strings[i];
        RE->ClearSelection();
    

    Nach der Aktion war wie zu erwarten der Text weg, keine übrig gebliebenen Returns. Also der geschichte scheint von keiner seite beizukommen zu sein.



  • Wenn du kein Wordwrap nicht aktiviert hast gibt es keinen Fliesstext, und wenn du es aktiviert hast dann wird automatisch in jeder (umgebrochenen) Zeile ein \r\n eingefügt.

    Meiner Meinung nach kannst du Absätze nur mittels Leerzeilen identifizieren, nicht anhand von Zeilenumrüchen.



  • Diese virtuellen \r\n seh ich nicht. Sie scheinen nur das Handling in der Kompo intern zu regeln. Ich kann ja im Text beliebig weiter schreiben. Der virtuelle Umbruch verschiebt sich aktuell.

    Nachdem ich die \r\n im Text zwar feststellen kann, aber keinen Bezug zur aktuellen Arbeitszeile hinbekomm, kann ich die Absätze in der Tat nur anhand der Leerzeilen erkennen:

    if (RE->Lines->Strings[i].Length() > 2 &&
            RE->Lines->Strings[i].SubString(0,1) != "\t")
        {
          RE->Lines->Strings[i] = RE->Lines->Strings[i].Insert("\t",1);
          ssPlus++;
        }
    

    Dann setz ich noch ein \r\n davor und fertig... aber falsch. Denn aus gewollten harten Zeilenumbrüchen werden nun Leerzeilen. Is halt keine saubere Formatierung. In meinen Augen ist es Murks oder Behelf. 🙄


Anmelden zum Antworten