![]() |
Memo -> RichEdit mit FormatÜbergabe
Schönen guten Abend :)
in einer MemoBox soll der Text individuell mit verschiedenen Tags markiert werden. Vergleichbar den HTML-Tags oder ForenCode, also beispielsweise einleitend und schliessend Die Attribute des Textes stehen also im Klartext dar. Gleichzeitig will ich in einem RichEdit genau den gleichen Text nur OHNE die Tags und stattdessen mit der fertigen Formatierung anzeigen lassen. Also quasi ein Vorschaufenster. Nur leider komm ich damit nicht ganz zurecht. Das Einfügen der Formatierung ist klar... einfach das ganze Feld oder den selektierten Text mit den Tags oder Attributen versehen. Je nachdem ob ich direkt die Vorschau bearbeite oder die MemoBox. Nur der Abgleich. Ich habs schon vom Memo ins RichEdit versucht. MemoInhalt temporärer Variable zuweisen in einer for-to-Schleife die Variable durchlaufen und nach Schlüsselzeichen absuchen dann eine Flag setzen, das eine z.B. Farbcodierung beginnt jetzt müsste eigentlich der CodeTag der Farbcodierung entfernt werden, wie ist noch unklar und der Text der jetzt zwischen Starttag und Endtag kommt, müsste als formatierter Text in das Richedit übergeben werden. Und da haperts. Im Moment bin ich soweit:
Delphi-Quellcode:
sieht sehr wirr aus, ich weiss.... aber dürfte seinen Dienst schonmal verrichten, glaub ich....
richVorschau.Text := memoEingabe.Text;
j := 0; k := 0; tempEin := memoEingabe.Text; for i := 0 to Length(tempEin) do begin if flag = 1 then begin if Text[i] = 'C' then k := 2; if Text[i] = 'O' then k := 3; if Text[i] = 'L' then k := 4; if Text[i] = 'O' then k := 5; if Text[i] = 'R' then k := 6; if Text[i] = '=' then k := 7; richVorschau.SelStart;r flag := 0; if Text[i] = '[' then begin k := 1; flag := 1; end; k := i + k; if flag = 0 then richVorschau := richVorschau + tempEin[k]; i := i + 1 + k; k := 0; end; } jemand ne Idee wie ich das bewerkstelligen könnte? Bin für jeden Tip dankbar tyler |
Re: Memo -> RichEdit mit FormatÜbergabe
Moin, moin.
Zum Scannen eines Textes oder einzelner Strings eignen sich übrigens auch besonders gut die Funktionen "Pos" bzw. "PosEx". Und zum Entfernen von 'CodeTags' oder Teilstrings wäre wiederum die Procedure "Delete" zu empfehlen... Ich würde so einen Text übrigens Zeile für Zeile abarbeiten (ist doch irgendwie etwas übersichtlicher) ...Jeweils immer zuerst eine Zeile des Memo-Textes in einen extra String laden ...dort dann alle CodeTags rausschneiden und diesen danach 'sauberen' Sring dann an den bisherigen RichEdit-Text (mit Lines.Add) dranhängen. Danach erst würde ich diese Memo-Zeile richtig ausscannen und je nach CodeTags in dieser dazu äquivalenten letzten RichEdit-Zeile dann die Formate (mittels SelStart/SelAttributes/SelLength) einbauen. |
Re: Memo -> RichEdit mit FormatÜbergabe
SelStart in der RichBox währe in dem Fall der schon dort vorhandene Text und SelLength die Länge des addierten Textes ohne CodeTags?
Dann per SelAttribute formatieren. Okay, das krieg ich hin. Und den Text sondieren: Wenn ich Zeilenweise vorgehe, hab ich das Problem: Sollte ein CodeTage mehrere Zeilen umgreifen, wird für die darauffolgenden Zeilen keine Formatierung vorgenommen, da in der aktuellen Zeile ja kein CodeTag zu finden ist :( hmm... schwierig schwierig... ich steh vor nem echten Problem aber danke erstmal für die Antwort tyler //EDIT hab aber gerade ne andere Idee... wenn ich das in Echtzeit regele. Sobald etwas markiert wird, im EingabeFeld, suche ich im RichEdit nach genau dem Text, was ja gehen müsste, und markiere den. Dann kann ich die Farbauswahl einmal als CodeTag und einmal als Attribute anwenden. Am einfachsten wäre das, in dem ich in Echtzeit in einem temporären String den Inhalt des Eingabefelds ablege, und sämtliche Tags extrahieren. Dann die Cursorpostion bestimmen (SelStart) und auf das RichEdit übertragen. Gleiches mit der Länge. Das könnt klappen... mal probieren :) |
Re: Memo -> RichEdit mit FormatÜbergabe
also... soweit gehts erstmal
Delphi-Quellcode:
nur bleibt mein Programm jetzt immer stehen... Kann jemand sagen warum?
temp := memoEingabe.Text;
repeat IF temp[1] = '[' then flag := 1 else flag := 0; if flag = 0 then begin k := Pos('[COLOR=', temp); richVorschau.Lines.Add(Copy(temp, 1, k - 1)); Delete(temp, 1, k - 1); flag := 1; memoEingabe.Text := temp; end else if flag = 1 then begin tempAus := Copy(temp, Pos('[COLOR=Rot]', temp) + 11, Pos('[/COLOR]', temp) - 12); j := Length(tempAus); richVorschau.Text := richVorschau.Text + (tempAus); richVorschau.SelStart := Length(richVorschau.Text) - j; richVorschau.SelLength := j; richVorschau.SelAttributes.Color := clRed; richVorschau.Repaint; Delete(temp, 1, Pos('[/COLOR]', temp) + 8); memoEingabe.Text := tempAus; memoEingabe.Repaint; end; until temp = ''; Ich denke mal es liegt an Until Temp = ''; aber mit Until Length(Temp) <= 0; gehts auch nicht. Jemand ne Idee? |
Re: Memo -> RichEdit mit FormatÜbergabe
Wenn du dich eingehender mit Syntax Highlighting (nicht direkt dein Problem, aber sehr nahe) beschäftigen willst, dann empfehle ich dir
![]() |
Re: Memo -> RichEdit mit FormatÜbergabe
<< ..ne, sorry, hatte mich geirrt (mit diesem post hier). >>
|
Re: Memo -> RichEdit mit FormatÜbergabe
Danke Stevie!
Mich in den Artikel einzuarbeiten, dazu war ich dann doch zufaul... lieber ne Nacht drüber schlafen, und folgendes produziert :D Jetzt muss ich nur noch die Farben und Formate einpflegen, und der Parser steht... in seinen Grundzügen :)
Delphi-Quellcode:
procedure Tf_main.Button1Click(Sender: TObject);
var eingabe, format, temp : String; begin // abc[COLOR=BLUE]TEsdfdsXT[/COLOR]abc[COLOR=RED]TE3432332rsdfXT[/COLOR] repeat // IF-SCHLEIFE UM UNFORMARTIERTEN TEXT DIREKT AN DIE RICHEDIT-K WEITER ZU GEBEN if Copy(memo.Text, 1, 1) = '[' then begin eingabe := Copy( memo.Text, Pos(']', memo.Text) + 1, Pos('/', memo.Text) - (Pos(']', memo.Text) + 2)); temp := richVorschau.Text; richVorschau.lines.Add(eingabe); richVorschau.SelStart := length(temp); richVorschau.SelLength := length(eingabe); format := Copy(memo.Text, Pos('[', memo.Text) + 1, 1); if format = 'C' then begin format := Copy(memo.Text, Pos('=', memo.Text) + 1, Pos(']', memo.Text) - 8); if format = 'BLUE' then richVorschau.SelAttributes.Color := clBlue; if format = 'RED' then richVorschau.SelAttributes.Color := clRed; end; temp := memo.Text; Delete(temp, Pos('[', temp), Pos(']',temp) + Length(eingabe)); Delete(temp, Pos('[', temp), Pos(']', temp)); memo.Text := temp; i := i + Length(Eingabe); Caption := Format; end else // HIER WIRD DER UNFORMATIERTE TEXT BEHANDELT (IM BEISPIEL OBEN: ABC-TEIL VORNE UND MITTIG) begin eingabe := Copy(memo.Text, 0, Pos('[', memo.Text) - 1); richVorschau.Lines.Add(eingabe); temp := memo.Text; Delete(temp, 1, length(eingabe)); memo.Text := temp; end; until Length(temp) < 1; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:39 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