![]() |
Delphi-Version: 5
RichEdit - Schreibschutz für einzelne Zeilen
Hallo,
wie bekomme ich einen Schreibschutz für einzelne Zeilen in einem RichEdit hin?
Delphi-Quellcode:
Obiger code tut's leider nicht. Der Schreibschutz für die automatisch eingefügten Zeilen wird gesetzt, ich hab es aber leider noch nicht geschafft, ihn danach wieder aufzuheben.
procedure TForm11.Button2Click(Sender: TObject);
var i, TxtLength : integer; begin for I := 0 to 10 do begin RxRichEdit1.Lines.Add('Zeile ' + IntToStr(i)); end; RxRichEdit1.SelStart := 0; TxtLength := (Length(RXRichEdit1.Text)); RXRichEdit1.SelLength := TxtLength; with RXRichEdit1.SelAttributes do Protected := true; //der bisher eingegebene Text ist jetzt schreibgeschützt //jetzt wollte ich den Cursor auf die Position hinter dem erzeugten Text setzen //und den Schreibschutz wieder aufheben --> geht leider nicht RxRichEdit1.SelStart := TxtLength + 1; RXRichEdit1.DefAttributes.Protected := False; end; Vielen Dank für eure Hinweise. |
AW: RichEdit - Schreibschutz für einzelne Zeilen
Auch wenn du nicht mit TRichedit arbeitest, hast Du es mal mit SelAttributes versucht?
Denn in der D7-Hilfe steht: Zitat:
K-H |
AW: RichEdit - Schreibschutz für einzelne Zeilen
Daran hatte ich auch gedacht, und ursprünglich
Delphi-Quellcode:
verwendet.
RxRichEdit1.SelStart := TxtLength + 1;
with RXRichEdit1.SelAttributes do Protected := false; Da ja aber ab dem Cursor noch nichts ausgewählt sein kann (da man ja ab hier erst weiter schreiben soll) hat das keine Auswirkung. Das RichEdit bleibt komplett gesperrt. |
AW: RichEdit - Schreibschutz für einzelne Zeilen
Ich hab mal noch ein bisschen probiert:
Ich habe in meiner Prozedur ja
Delphi-Quellcode:
verwendet, um, wie ich dachte, die Anzahl der in der Schleife erzeugten Zeichen zu ermitteln und genau bis dorthin SelLength anzuwenden.
Length(RxRichEdit1.Text)
Rein rechnerisch werden in meiner Schleife 78 Zeichen erzeugt, ein
Delphi-Quellcode:
ergibt aber eine Textlänge von 100 Zeichen.
Length(RxRichEdit1.Text)
Daraus folgere ich, dass für jeden Zeilenumbruch 2 zusätzliche, nicht sichtbare Zeichen, erzeugt werden. Nun wird natürlich erst mal deutlich, warum
Delphi-Quellcode:
das RichEdit für weitere Eingaben sperrt: der selektierte Bereich ist einfach schon größer als die in der Schleife tatsächlich erzeugten (sichtbaren) Zeichen.
with RXRichEdit1.SelAttributes do Protected := true;
Nun stellt sich die Frage: wie ermittle ich die Endposition des letzten Zeichens des von mir in der Schleife erzeugten Textes um die Markierung exakt bis zu diesem Zeichen zu setzen? (Natürlich will ich nicht einfach mitzählen, in meiner realen Anwendung wird der per Programmcode erzeugte und dann zu schützende Text auf etwas komplexerem Weg erzeugt). |
AW: RichEdit - Schreibschutz für einzelne Zeilen
Ich hab das jetzt so gelöst, dass ich die gesamte Länge des Textes ermittele und davon die Anzahl der Zeilenumbrüche abziehe. Diese Anzahl ermittle ich in einer Funktion, die das Vorkommen von #13 im gesamten Text zählt.
Wen der Code interessiert:
Delphi-Quellcode:
function TForm11.CountChar(const RichEdit: TRXRichEdit; s: string): integer;
//diese Funktion sucht in dem übergebenen RichEdit nach der Anzahl des gesuchten //Zeichens var I, x: integer; MyText : string; begin x := 0; MyText := RichEdit.Text; for I := 0 to Length(MyText) do begin if MyText[i] = s then Inc(x); end; Result := x; end; procedure TForm11.Button2Click(Sender: TObject); var i, TxtLength : integer; begin //Testtext erzeugen for I := 0 to 9 do begin RxRichEdit1.Lines.Add('Zeile ' + IntToStr(i)); end; //bisher eingegebenen Text markieren //über function CountChar werden alle Zeichen des Textes abzgl. des Zeichens für carriage-return (#13) //ermittelt und das als Textlänge für SelLength übergeben RxRichEdit1.SelStart := 0; RxRichEdit1.SelLength := Length(RxRichEdit1.Text) - CountChar(RxRichEdit1,#13); with RXRichEdit1.SelAttributes do Protected := true; //der bisher eingegebene Text ist jetzt schreibgeschützt //Cursor in die nächste Zeile setzen RxRichEdit1.SelStart := RxRichEdit1.SelLength + 1; RxRichEdit1.SetFocus; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz