![]() |
SelAttributes im RichEdit
Hallo, ich habe ein Problem mit der Textart (Größe, Farbe, Style etc) in einem Richedit:
Aus einem normalen Memo wird ein Text gelesen, in dem auch solche Textstyle-Infos ahnlich dem BBCode enthalten sind. Diese Infos werden in einer Prozedur ausgelesen und in Variablen gespeichert. anschließend wird das entsprechende Zeichen markiert und ihm werden per SelAttributes die Variablen zugewiesen. Das ganze geschieht in einer Schleife, die immer zeichenweise vorgeht und das nächste Zeichen an den Text im Richedit anhängt.
Delphi-Quellcode:
RichEdit1.SelStart := Length(RichEdit1.Text) - 1;
RichEdit1.SelLength := 1; with RichEdit1.SelAttributes do begin Name := TextSchrift; Color := TextFarbe; Size := TextGroesse; Style := TextStyle; end; Das Problem ist nun, dass nur die aller ersten Textstyle-Infos auch angewendet werden, sobald einmal der normale Text angefangen hat, werden in Infos zwar ausgelesen und in den Variablen gespeichert (per Breakpoints geprüft) aber nicht mehr auf den darauf folgenden Text angewendet. Woran kann das liegen??? :gruebel: Help me plz |
Re: SelAttributes im RichEdit
poste doch mal etwas mehr Code. Interessant wäre da diesbezüglich z.B. der Schleifenformalismus selbst und das voranschreitende Pointen (auf den dann jeweils immer als nächstes zu formatierenden Char) mittels SelStart.
|
Re: SelAttributes im RichEdit
Hier is im Grunde die ganze Proz, den Befehl-Auswerten-Teil hab ich mal als externe Proz nur reingeschrieben, der funktioniert problemlos.
Delphi-Quellcode:
var ganzertext: Ansistring;
i: integer; tbefehl: String; // ließt erstmal generell den Befehl aus tgroesse: integer; tschrift: string; tstyle: tfontstyles; tstyle2: string; tfarbe: tcolor; tAlign: TAlignment; Prozedure Entschluesseln; begin GanzerText := Memo1.Text; for i := 1 to Length(GanzerText) do begin if Befehl = true then Befehl auswerten else begin TextFeld.Text := TextFeld.Text + Copy(GanzerText,1,1); Textfeld.SelStart := Length(Textfeld.Text); Textfeld.SelLength := -1; with TextFeld.SelAttributes do begin Name := tSchrift; Color := tFarbe; Size := tGroesse; Style := tStyle; end; Delete(GanzerText, 1, 1); // löscht letztes bearbeitetes Zeichen end; // end if kein Befehl, Text formatieren if Length(GanzerText) = 0 then Exit; end; // Schleife end; |
Re: SelAttributes im RichEdit
also auf den ersten Blick würde ich sagen:
1. Dein SelStart pointet immer genau hinter den letzten, eben gerade addierten, Char. RichEdit-intern hat der erste RichEdit-Text-Char nämlich den Index=0 ...ergo musst du mit Length(Textfeld.Text)-1 pointen 2. SelLength := +1; Außerdem: Auf deine Weise wirst du auch die Cr- u. Lf-Bytes (Bytes durch die jede Memo- o. RichEdit-Zeile terminiert ist) mitformatieren, ...was dann aber ggf. durchaus auch nochmal zu gewissen (unvorhersehbaren) Fehlereffekten führen könnte. edit: also normalerweise werden diese CrLf-Bytes natürlich immer mitformatiert, allerdings nur nicht extra ...als wären es ganz normale Chars, denen ich jetzt auch noch ein ganz spezielles Format verpassen möchte. |
Re: SelAttributes im RichEdit
Hallo Hügel,
wenn du SelLength auf einen negativen Wert setzen willst, dann musst du dich etwas mehr anstrengen - intern wird nur mit dem Betrag gearbeitet. Das Abschneiden, Löschen und Formatieren jeweils eines einzelnen Zeichens ist auch nicht gerade der Hit. Hier ein kleiner Ausschnitt aus einem Programm, mit dem ich selbst solche Style-Infos zeilenweise verarbeite. Vielleicht hilft dir das ja bei der Verbesserung deines Codes. Die Funktion Strip() zerlegt einen String beim ersten Auftreten eines Delimiters und StripStyle() extrahiert die Style-Codes und merkt sie sich in CurrentStyle.
Delphi-Quellcode:
Grüße vom marabu
procedure TMainForm.ProcessLine(line: string);
var s: string; begin RichEdit.Lines.Add(''); while line <> '' do begin s := Strip(line, '[', pmSingle); RichEdit.SelStart := Length(RichEdit.Text) - 2; RichEdit.SelAttributes.Style := CurrentStyle; RichEdit.SelText := s; if line <> '' then StripStyle(line); end; end; |
Re: SelAttributes im RichEdit
Hallo, danke erst mal für eure Hilfestellungen!!!
@ TStringlist: ich habs jetzt in
Delphi-Quellcode:
geändert, allerdings leider ohne Erfolg.
Textfeld.SelStart := Length(Textfeld.Text) - 1;
Textfeld.SelLength := 1; @ Marabu: du gehst die Formatierung auf ne etwas andere Sache an, so hatte ich das auch schon mal überlegt... deine Version könnte mir also noch hilfreich sein, Danke also. @ alle anderen: vllt hat ja noch jemand eine Idee, da es bisher leider noch nicht funktioniert hat :(... |
Re: SelAttributes im RichEdit
Der Hauptfehler liegt darin, dass du den Text des RichEdit-Controls nicht immer wieder über dessen Text-Property neu laden darfst!!! Warum? Weil du bei einer jeden solchen Zuweisung dann nämlich auch immer wieder von neuem den gesamten bisherigen RichEdit-Inhalt 100%ig überschreibst. Also gleichzeitig auch immer wieder sämtliche Format-Anweisungen, die du in diesen Text bis dato (theoretisch) schon eingebracht hattest. Auf der rechten Seite der Zuweisung hast du zwar auch wieder das Textfeld.Text stehen, aber das stellt dort nur noch mehr einen ganz normalen einfachen String dar, ohne jegliche Format-Anweisungen.
|
Re: SelAttributes im RichEdit
Hallo,
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 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 by Thomas Breitkreuz