Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Code tags umwandeln? (https://www.delphipraxis.net/59133-code-tags-umwandeln.html)

Headi 17. Dez 2005 21:41


Code tags umwandeln?
 
Hallo leute,

kleine frage und zwar habe ich ein richedit, wenn dort jetzt ein spezieller tag vorkommt,
soll der Text unterschiedlich formatiert werden.
Formatierungen sind genaugenommen BBCodes.
Das heisst wenn ich z.B.

Code:
[B]hallo[/B]
eingebe, dann erkennt der das und macht hallo fett.

Ich habe mir mal überlegt wie ich das machen soll. Nur da gibt es noch einige probleme.

Ich habe mal folgenden code:

Delphi-Quellcode:
function SearchForText_AndSelect(RichEdit: TRichEdit; SearchText: string): Boolean;
var
  StartPos, Position, Endpos: Integer;
begin
  StartPos := 0;
  with RichEdit do
  begin
    Endpos := Length(RichEdit.Text);
    Lines.BeginUpdate;
    while FindText(SearchText, StartPos, Endpos, [stMatchCase])<>-1 do
    begin
      Endpos  := Length(RichEdit.Text) - startpos;
      Position := FindText(SearchText, StartPos, Endpos, [stMatchCase]);
      Inc(StartPos, Length(SearchText));
      SetFocus;
      SelStart := Position;
      SelLength := Length(SearchText);
    end;
    Lines.EndUpdate;
  end;
end;

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  SearchForText_AndSelect(RichEdit1, 'Some Text');
end;
nur jetzt stosse ich schon auf das erste problem.
Wie kann ich dem sagen dass er nach * suchen soll?

Delphi-Quellcode:
SearchForText_AndSelect(RichEdit1, '[b]'+*+'[/b]');
geht natürlich nicht, da er * als variable und nicht als "irgend ein beliebiger Text" ansieht.

wie mache ich das am besten?
Und was mache ich wenn ich den text gefunden habe, soll ich den in eine variable speichern dann formatieren und wieder einfügen ohne die tags?

Bitte um hilfe

mfg headi

MasterEvil 17. Dez 2005 23:40

Re: Code tags umwandeln?
 
Nabend,

soll er dabei die Tags gleich entfernen oder soll er einfach nur das zwischen den Tags fett machen?
Mit Pos kriegst du ja raus wo er anfängt und ebenfalls auch wo er aufhört (dort halt +3).
Danach setzt du die selection (glaub jedenfalls das beim RichEdit die Position gleichbedeutend ist mit der Menge der Zeichen) und machst sie mit SelAttributes fett.
Wenn du die Tags weg haben willst, musst du ja die nur entfernen und die Positionen umsetzen.

Ist nur kurz hingekritzelt und ungetestet:
Delphi-Quellcode:
while Pos(RichEdit.Text,'[a]')>0 do
begin
  StartPos:=Pos(RichEdit.Text,'[a]');
  EndPos:=Pos(RichEdit.Text,'[/a]');
  if (StartPos>0) and (EndPos>0) then
  begin
    RichEdit.SelStart:=StartPos+3;
    RichEdit.SelLength:=(EndPos-StartPos)-3;
    //Hier Code zum entfernen der 2 Tags einfügen
  end;
end;
greetz
Steffen

omata 18. Dez 2005 05:07

Re: Code tags umwandeln?
 
Wenn du irgendwann die Lust an RichEdit verloren hast, dann schau dir doch mal SynEdit an.

MfG
Thorsten

Headi 18. Dez 2005 14:36

Re: Code tags umwandeln?
 
Zitat:

Zitat von MasterEvil
Nabend,

soll er dabei die Tags gleich entfernen oder soll er einfach nur das zwischen den Tags fett machen?
Mit Pos kriegst du ja raus wo er anfängt und ebenfalls auch wo er aufhört (dort halt +3).
Danach setzt du die selection (glaub jedenfalls das beim RichEdit die Position gleichbedeutend ist mit der Menge der Zeichen) und machst sie mit SelAttributes fett.
Wenn du die Tags weg haben willst, musst du ja die nur entfernen und die Positionen umsetzen.

Ist nur kurz hingekritzelt und ungetestet:
Delphi-Quellcode:
while Pos(RichEdit.Text,'[a]')>0 do
begin
  StartPos:=Pos(RichEdit.Text,'[a]');
  EndPos:=Pos(RichEdit.Text,'[/a]');
  if (StartPos>0) and (EndPos>0) then
  begin
    RichEdit.SelStart:=StartPos+3;
    RichEdit.SelLength:=(EndPos-StartPos)-3;
    //Hier Code zum entfernen der 2 Tags einfügen
  end;
end;
greetz
Steffen

hmm... das geht irgendwie nicht also es passiert nichts.
was muss ich denn hinzufügen um die tags zu löschen?

Also ich komm da irgendwie nicht so mit den formaten zu recht,
was bekomme ich bei RichEdit.SelLength:=(EndPos-StartPos)-3;

Ich denke mal das ist die länge des Textes der Formatiert werden muss,
Nur wie kann ich den jetzt auch formatieren, oder erst markieren??


@Omata:

SynEdit habe ich mir schon angeschaut, aber versteh das nicht so ganz wie ich da ne eigene liste machen kann...
Hab mir auch schon den SynGen oder wie der heisst angeschauen aber krieg das irgendwie nicht hin.

Lannes 18. Dez 2005 15:38

Re: Code tags umwandeln?
 
Hallo,

der Code färbt alles in der Art '[ B]irgendwas[ /B]' rot und entfernt die Tags.
Der Code ist nicht optimiert, aber man kann die Vorgehensweise gut erkennen.
Delphi-Quellcode:
with RichEdit1 do
  while FindText('[B]', 0, Length(RichEdit1.Text), [stMatchCase])<>-1 do
    begin
    //SelStart auf Anfang '[B]..' setzen
    SelStart := FindText('[B]', 0, Length(RichEdit1.Text), [stMatchCase]);

    //SelLength auf Ende(also +4) '...[/B]' setzen,
    //durch Abzug von Selstart ist genau der String incl. Tags selectiert.
    SelLength := FindText('[/B]', 0, Length(RichEdit1.Text), [stMatchCase])+4-Selstart;

    //selectierten Bereich einfärben
    SelAttributes.Color := clred;

    //selectierten Bereich durch String ohne Tags ersetzen
    SelText := Copy(RichEdit1.Text,SelStart+4,SelLength-7);
    end;

marabu 18. Dez 2005 15:52

Re: Code tags umwandeln?
 
Hallo Headi,

vielleicht bringt dich dieses kurze Code-Beispiel auf fruchtbare Gedanken: klick

Grüße vom marabu

Headi 18. Dez 2005 15:55

Re: Code tags umwandeln?
 
Zitat:

Zitat von Lannes
Hallo,

der Code färbt alles in der Art '[ B]irgendwas[ /B]' rot und entfernt die Tags.
Der Code ist nicht optimiert, aber man kann die Vorgehensweise gut erkennen.
Delphi-Quellcode:
with RichEdit1 do
  while FindText('[B]', 0, Length(RichEdit1.Text), [stMatchCase])<>-1 do
    begin
    //SelStart auf Anfang '[B]..' setzen
    SelStart := FindText('[B]', 0, Length(RichEdit1.Text), [stMatchCase]);

    //SelLength auf Ende(also +4) '...[/B]' setzen,
    //durch Abzug von Selstart ist genau der String incl. Tags selectiert.
    SelLength := FindText('[/B]', 0, Length(RichEdit1.Text), [stMatchCase])+4-Selstart;

    //selectierten Bereich einfärben
    SelAttributes.Color := clred;

    //selectierten Bereich durch String ohne Tags ersetzen
    SelText := Copy(RichEdit1.Text,SelStart+4,SelLength-7);
    end;

vielen dank funktioniert super, nur ein problem bleibt da noch nähmlich wenn der benutzer [b] eingiebt
also b klein dann funktioniert das ganze natürlich nicht.

Warum funktioniert dies eigentlich nicht? :

Delphi-Quellcode:
while FindText('[B]'or'[b]', 0, Length(RichEdit1.Text), [stMatchCase])<>-1 do
Rein theoretisch müsste das doch gehen ? also kann ich nicht einfach

[edit]
achso ich habe jetzt gerade gesehen dass man bei findtext das ja einstellen kann...
muss ich nur noch rausfinden wie.
[/edit]



if a or b =

ich möchte ja nicht immer

if a =
if b =


vielen dank
greez headi

omata 18. Dez 2005 15:59

Re: Code tags umwandeln?
 
Liste der Anhänge anzeigen (Anzahl: 1)
So hier ist ein Beispiel für SynEdit.

Vielleicht gefällt es dir ja.

MfG
Thorsten

Lannes 18. Dez 2005 16:06

Re: Code tags umwandeln?
 
Hallo,

nimm stMatchCase raus, dann wird nicht mehr nach Groß- Kleinschreibung unterschieden:
Delphi-Quellcode:
FindText('[B]', 0, Length(RichEdit1.Text), []);
Du musst aber noch abfangen ob die Tags auch wieder geschlossen wurden!

Headi 18. Dez 2005 16:26

Re: Code tags umwandeln?
 
Zitat:

Zitat von Lannes
Hallo,

nimm stMatchCase raus, dann wird nicht mehr nach Groß- kleinschreibung unterschieden:
Delphi-Quellcode:
FindText('[B]', 0, Length(RichEdit1.Text), []);
Du musst aber noch abfangen ob die Tags auch wieder geschloissen wurden!

vielen dank das funktioniert jetzt super

@Omata:

ja ich seh jetzt dass es so ansatzweise funktioniert,
nur sind da ja noch viele probleme, ich kann immer nur etwas benutzen also fetter kommentar geht bei deinem
beispiel nicht, bei [b ] fett [/b ] werden nur die beiden tags fett und nicht der text, abgesehen davon müssen die tags ja auch noch gelöscht werden.

Könntest du mir vielleicht noch ein bisschen genäuer erklären wie man so eine formatierung definieren kann?

vielen dank euch beiden

greez headi


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 Uhr.
Seite 1 von 2  1 2      

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