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
).