AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Memo -> RichEdit mit FormatÜbergabe

Ein Thema von Tyler · begonnen am 6. Sep 2004 · letzter Beitrag vom 13. Sep 2004
Antwort Antwort
Benutzerbild von Tyler
Tyler

Registriert seit: 19. Jun 2003
Ort: Berlin
241 Beiträge
 
#1

Memo -> RichEdit mit FormatÜbergabe

  Alt 6. Sep 2004, 19:41
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:
  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] = 'Cthen k := 2;
      if Text[i] = 'Othen k := 3;
      if Text[i] = 'Lthen k := 4;
      if Text[i] = 'Othen k := 5;
      if Text[i] = 'Rthen 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; }
sieht sehr wirr aus, ich weiss.... aber dürfte seinen Dienst schonmal verrichten, glaub ich....

jemand ne Idee wie ich das bewerkstelligen könnte?

Bin für jeden Tip dankbar

tyler
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Memo -> RichEdit mit FormatÜbergabe

  Alt 6. Sep 2004, 23:32
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.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von Tyler
Tyler

Registriert seit: 19. Jun 2003
Ort: Berlin
241 Beiträge
 
#3

Re: Memo -> RichEdit mit FormatÜbergabe

  Alt 7. Sep 2004, 13:22
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
  Mit Zitat antworten Zitat
Benutzerbild von Tyler
Tyler

Registriert seit: 19. Jun 2003
Ort: Berlin
241 Beiträge
 
#4

Re: Memo -> RichEdit mit FormatÜbergabe

  Alt 7. Sep 2004, 14:18
also... soweit gehts erstmal

Delphi-Quellcode:
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 = '';
nur bleibt mein Programm jetzt immer stehen... Kann jemand sagen warum?

Ich denke mal es liegt an

Until Temp = '';

aber mit

Until Length(Temp) <= 0;

gehts auch nicht.

Jemand ne Idee?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

Re: Memo -> RichEdit mit FormatÜbergabe

  Alt 7. Sep 2004, 14:55
Wenn du dich eingehender mit Syntax Highlighting (nicht direkt dein Problem, aber sehr nahe) beschäftigen willst, dann empfehle ich dir diesen englischen Artikel über diesen Thema. Speziell die Methode, das ganze nicht über das Markieren im RichEdit zu lösen, sondern über das interne RTF-Format, dürfte sehr interessant sein.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Memo -> RichEdit mit FormatÜbergabe

  Alt 8. Sep 2004, 22:59
<< ..ne, sorry, hatte mich geirrt (mit diesem post hier). >>
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von Tyler
Tyler

Registriert seit: 19. Jun 2003
Ort: Berlin
241 Beiträge
 
#7

Re: Memo -> RichEdit mit FormatÜbergabe

  Alt 13. Sep 2004, 18:00
Danke Stevie!

Mich in den Artikel einzuarbeiten, dazu war ich dann doch zufaul... lieber ne Nacht drüber schlafen, und folgendes produziert

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 = 'Cthen
      begin
        format := Copy(memo.Text, Pos('=', memo.Text) + 1, Pos(']', memo.Text) - 8);
        if format = 'BLUEthen 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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz