Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi RichEdit - Schreibschutz für einzelne Zeilen (https://www.delphipraxis.net/172707-richedit-schreibschutz-fuer-einzelne-zeilen.html)

runningsoft 18. Jan 2013 13:45

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:
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;
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.

Vielen Dank für eure Hinweise.

p80286 18. Jan 2013 14:01

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:

Mithilfe von DefAttributes können Sie die Attribute der Standardschrift abrufen oder ändern, die in einem RTF-Eingabefeld für neu eingefügten Text verwendet werden. Dies sind die Merkmale des Textes vor der Anwendung der speziellen Attribute. Nachdem spezielle Attribute für einen Teil des Textes verwendet wurden, gelten ab dieser Position die Standardattribute intern als nicht mehr für den Text definiert, auch wenn die Attribute mit DefAttributes übereinstimmen.
Gruß
K-H

runningsoft 18. Jan 2013 14:07

AW: RichEdit - Schreibschutz für einzelne Zeilen
 
Daran hatte ich auch gedacht, und ursprünglich

Delphi-Quellcode:
RxRichEdit1.SelStart := TxtLength + 1;
with RXRichEdit1.SelAttributes do Protected := false;
verwendet.

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.

runningsoft 18. Jan 2013 14:49

AW: RichEdit - Schreibschutz für einzelne Zeilen
 
Ich hab mal noch ein bisschen probiert:

Ich habe in meiner Prozedur ja
Delphi-Quellcode:
Length(RxRichEdit1.Text)
verwendet, um, wie ich dachte, die Anzahl der in der Schleife erzeugten Zeichen zu ermitteln und genau bis dorthin SelLength anzuwenden.

Rein rechnerisch werden in meiner Schleife 78 Zeichen erzeugt, ein
Delphi-Quellcode:
Length(RxRichEdit1.Text)
ergibt aber eine Textlänge von 100 Zeichen.

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:
with RXRichEdit1.SelAttributes do Protected := true;
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.

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

runningsoft 18. Jan 2013 16:05

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