markierung (auch über mehrere zeilen einrücken)



  • Hatte ich getestet, aber als Insert("\n\t", 1). Das schafft erst mal entsprechende Leerzeilen und setzt dann einmal den Tab, nützt also nix. Insert("\t", 1) geht aber, eben getestet.

    Da muß was gehen. So ein schöner Algor, das geb ich so schnell nicht auf. Erst die Abfrage auf "\n" vor dem Block, dann je bearbeitete Zeile die Restmarkierung wieder aktivieren und mit SelText arbeiten. So in etwa...



  • Ich kann dir nicht folgen. Inzwischen konnte ich es testen, das o.g. Beipiel (mit der korrigierten Zuweisung) funktioniert einwandfrei.

    Was hast du nur immer mit dem \n, das ist doch völlig irrelevant!?



  • Hmmm, hast du mal in eine der eingerückten Zeilen (oder ggf. auch in der davor) weiteren Text geschrieben? Der Text kann sich auch über mehrere Zeilen hinweg verschieben, die Tabs sind nicht mehr am Zeilenanfang.

    Ich will voneinander unabhängige Zeilen schaffen. Wenn dann eine Zeile länger wird und eine Folgezeile bildet, kann man die gezielt behandeln. Aber die geschaffene Gesamtstruktur bleibt erhalten. Darauf kommt es mir an.



  • "Und sie bewegt sich doch!" 😃 "\v" ist nicht "\n", kann aber zu "\n" werden. :p Mit dem Trick klappt das Separieren der Zeilen.

    // Alle Zeilen im markierten Block einrücken und voeinander trennen
    void __fastcall TChild::TextBlockClick(TObject *Sender)
    {
    
        // Txt ist ein RichEdit
        int Start = Txt->SelStart, Ende = Txt->SelLength, ssPlus = 0;
        int bkStart = Txt->Perform(EM_EXLINEFROMCHAR,0,Txt->SelStart);
        int bkEnde = Txt->Perform(EM_EXLINEFROMCHAR,0,Txt->SelStart+Txt->SelLength);
        for (int i = bkStart; i <= bkEnde; i++)
            // wenn der Block an einem Absatz begint
            if (i == bkStart && Txt->Text.SubString(Start,1) == "\n")
            {
                Txt->Lines->Strings[i] = Txt->Lines->Strings[i].Insert("\t",1);
                // Blocklängenkorrektur
                ssPlus += 1;
            }
            // sonst bzw. alle weiteren Zeilen
            else
            {
                Txt->Lines->Strings[i] = Txt->Lines->Strings[i].Insert("\r\v\t",1);
                // Blocklängenkorrektur
                ssPlus += 3;
            }
        // nochmal den Block markieren
        Txt->SelStart = Start;
        Txt->SelLength = (Ende + ssPlus);
        // die "\v" in "\n" umwandeln
        Txt->SelText=StringReplace(Txt->SelText,
                    "\v", "\n", TReplaceFlags()<<rfReplaceAll);
    }
    

    Letzter Schönheitsfehler: Läuft der Block über Absätze hinweg, entstehen zusätzliche Leerzeilen. Hat jemand 'ne Idee, wie sich das vermeiden läßt? Ich find die richtige Abfrage nicht. Txt->Lines->Strings[i].Trim(); hilft nicht.



  • Niemand 'ne Idee? Hätte es gern in der Schleife geregelt, aber am Schluß der Routine geht auch:

    // Leerzeilen entfernen 
        Txt->SelStart = Start;
        Txt->SelLength = (Ende + ssPlus);
        Txt->SelText=StringReplace(Txt->SelText,
                    "\n\r\n", "\n", TReplaceFlags()<<rfReplaceAll);
    

    Vorhanden gewesene Leerzeilen bleiben dabei erhalten - wie es sein soll.

    -Insgesamt stehen also die beiden Wege mit und ohne Absatzseparierung zur Verfügung... falls es jemand interessiert... (ziemlich verdatenbankt, die wüste Jejend hier 😃 ).


Anmelden zum Antworten