RichEdit the hard way Part2 (long)

hi :smiley:

(Kurzversion dieses Artikels unter Quellcode )

dank der grossen Hilfe von wer weiss wass usern, steh ich „das delphi-nooby“ kurz davor ein RichEditfeld nach meinen Vorstellungen zu kontrollieren.
ich hatte mir zur Aufgabe gesetzt ein RE Feld zu programmiern das volgendes kann:

  1. es ist auf 5 Zeilen begrenzt.
    [ist mir fast gelungen allerdings, sind 5 Zeilen voll und es wird
    in der 3. Zeile etwas hinzugefügt, wird anstatt in der 3.Zeile
    das was zuvieleingegeben worden ist, in der 5.Zeile
    geloescht #duh]
  2. Einzelne Wöter können markiert und dadurch verwaltet werden,
    zB.: soll später eine Abfrage möglich sein, wie:
    Wieviel Markierungen gibt es und wo befinden Sie sich.
    [wie man meinem folgenden Anfängercode entnehmen kann, hab ich es nur geschafft einzelne Wöter zu markieren und wenn gewünscht diese Markierungen wieder aufzulösen]

Code:

procedure TForm1.RichEdit1Change(Sender: TObject);
var t:integer;
begin
memo1.text := RichEdit1.text;
label1.Caption := inttostr(RichEdit1.lines.count);
if richedit1.Lines.count > 5 then
begin
for t := richedit1.lines.count -1 downto 5 do richedit1.lines.Delete(t);
end;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
with RichEdit1.SelAttributes do
begin
Color := clRed;
end;

end;
procedure TForm1.Button7Click(Sender: TObject);
begin
with RichEdit1.SelAttributes do
Color := ClBlack;
end;

(ür Tips wie man markierte Wörter verwalten koennte, oder wie man
das Richedit feld so veraendert das es nur 5 Zeilen erfassen kann und nicht in der zB. 5 Zeile löscht , was in einer von den anderen Zeilen zuviel eingegeben wurde waere ich sehr dankbar)

Peace n Love
Mulai

Hallo erstmal,

Also gleich zu Anfang die schlechte Nachricht. Ich habe nun auch schon mit RichtEdit-Feldern programmiert, aber ich wuesste nicht, dass es möglich ist, mehrere Wörter zu markieren. Vielleicht existiert noch ein Property wie zum Beispiel bei dem ComboBoxes, welches auf true gesetzt Mehrfachkarkierungen zulässt, aber das glaube ich eher nicht (kannst ja noch mal in der Hilfe nachschauen). Ich glaube auch nicht, dass sich das irgendwie realisieren ließe, denn RichEdit-Felder sind intern auch nur Windows-Komponenten mit Delphi-Schablone und da kommst du sehr schlecht ran. Musst dir also irgendwas anderes einfallen lassen.
Nun zu deiner ersten Frage mit den 5 Zeilen. Wenn ich dich richtig verstanden habe, soll, wenn 5 Zeilen voll sind, keine weitere Eingabe mehr möglich sein. Ich würde mal folgendes probieren:
In einem KeyDown- oder KeyPress-Ereignis des RichEdit-Feldes überprüfst du bei jedem Tastendruck, ob die 5 Zeilen schon voll sind und falls dies der Fall ist setzt du das Property ReadOnly auf true. Das wäre erstens, nun willst du ja aber sicherlich auch wieder Zeichen löschen können, wenn die 5 Zeilen voll sein sollten. Da könntest du weiterhin in dem KeyDown- oder KeyPress-Ereignis prüfen, ob die Entf- oder Del-Taste gedrückt wurde und ReadOnly true ist und in dem Fall ReadOnly wieder auf false setzen. Ich hab das noch nicht probiert, ist auch nicht sonderlich komfortabel, gebe ich zu, aber vielleicht hilft’s dir.
Eine andere Möglichkeit wäre das hier (dazu musst du dich aber mit Komponenten-Programmierung befassen, ist also anspruchsvoller):
Leite eine neue Komponente von TRichEdit ab. In dieser überschreibst du die Prozedur KeyDown oder KeyPress (so heißen die glaube ich, aber es empfiehlt sich, doch noch mal im Quellcode nachzusehen). Und darin prüfst du, ob das RichEdit schon voll ist. Wenn ja, rufst du einfach nicht die abgeleitete Prozedur auf, womit es dann so aussieht, als wäre die Taste nicht gedrückt worden. Müsste klappen.

Viel Spass
Christian