Ich möchte in einem Richedit Text bearbeiten, nämlich:
1. Markierter Text in kleine Buchstaben
2. Markierter Text in große Buchstaben
3. Markierter Text tauschen (klein wird groß, groß wird klein)
Für Punkt 1. und 2. nutze ich fertige Routinen, für Pkt3 eigenen Code.
Lösungsansatz:
Eine Schleife über alle Zeichen mit Zurückschreiben in Text akzeptiert der Compiler nicht. Also so etwas:
Delphi-Quelltext
1: 2: 3:
| for j:=1 to length(Richedit.Text) do Cha j lesen, ändern und zurück mit Richedit.Text[j]:=Char |
Habe daher den RichText zerlegt in 3 Stringteile: sL= Text vor Markierung, sM= markierter Text, sR= Text nach Markierung. Bearbeite nun den markierten Text und setze die 3 Teile wieder zusammen. Hier der Code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| Procedure FileCharChange(Big:ShortInt);
var j, lg : longint; SelSt,SelLg:longint; sL,sM,sR : string; ChaNr:integer; Begin with Form1.Richedit1 do begin if (Sellength=0) or (length(text)=0) then putalarm(ma2SelLg0) else begin sL:=''; sM:=''; sR:=''; SelSt:=Selstart; SelLg:=Sellength; lg:=length(Text); sL:=AnsiLeftStr(Text,SelSt); sM:=AnsiMidStr(Text,SelStart+1,SelLg); sR:=AnsiRightStr(Text,lg-SelStart-SelLg); Case Big of 1: sM:=AnsiUpperCase(sM); 2: sM:=AnsiLowerCase(sM); 3: for j:=1 to SelLg do begin ChaNr:=ord(sM[j]); if ChaNr>64 then begin if (ChaNr<=90) then inc(ChaNr,32) else if (ChaNr<97) then else if (ChaNr<=122) then dec(ChaNr,32) else if (ChaNr<192) then else if (ChaNr<=222) and not (ChaNr=215) then inc(ChaNr,32) else if (ChaNr<=254) and not (ChaNr=215) and not (ChaNr=247) then dec(ChaNr,32); sM[j]:= chr(ord(ChaNr)); end; end; End; Text:=sL+sM+sR; end; SelStart:=SelSt; Sellength:=SelLg; end; end; |
Nun stelle ich fest, dass meine Rechnung zur Aufteilung in die 3 Teilstrings nicht korrekt funktioniert. Grund: Ich habe unterstellt, dass z.B. bei komplett markiertem Text die Werte von length(Text) = Sellength sind. Bei Markierungen über mehrere Zeilen ist dies jedoch nicht der Fall. Sellength zählt offenbar evtl. enthaltene Steuerzeichen #0D#0A (Zeilenwechsel) nicht mit. So kommt es bei der Bearbeitung zu einem falsch ausgewählten Textbereich.
Ein Test liefert mir kein logisches Ergebnis. Markiere ich z.B. mit Strg+A die gesamte Datei, dann werden genau entsprechend der
Zeilenanzahl die letzten Zeichen nicht bearbeitet. Wenn schon ein solcher "Zählfehler", dann hätte ich die doppelte Anzahl nicht bearbeiteter Bytes wie Zeilenanzahl erwartet, da ja #0D#0A zwei Byte sind. Markiert man einen Zwischenbereich einer Textdatei, dann verschiebt sich sM nach vorn. Mit anderen Worten: Text[SelStart] zeigt nicht auf das am Bildschirm 1. markierte Zeichen.
1. Was denke/mache ich falsch?
2. Wie kann man das Problem lösen?
3. Warum liefert Richedit.Text[j]:=chr(ord(ChaNr)) einen Compilerfehler?
hRb
Moderiert von Th69: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 20.02.2020 um 09:37