Autor |
Beitrag |
Knumonmaster
Hält's aus hier
Beiträge: 12
Win 2000, Ubuntu 7.10
Delphi 7 Enterprise, Lazarus
|
Verfasst: Mo 14.01.08 17:27
Hallo
Ich habe ein RichEdit1, in dem Text in clWindowText und Formatierungsangaben, ähnlich BBCode, welche in anderen Farben angegeben sind.
Zum einen benötige ich die Länge der einzelnen Richedit-Zeilen, wobei nur der Text in clWindowText berücksichtigt werden sollte. Die Länge einer Zeile / eines strings kann ich ja mit length() bestimmen.
Zum anderen benötige ich den reinen Text ohne die Formatierungsangaben, als string, um ihn in einem TLabel anzuzeigen.
nun zum Knackpunkt: wie kann ich es machen, dass nur der Text, der in clwindowText geschrieben ist, als string ausgegeben wird?
Ich hoffe, ihr wisst da eine Lösung,
Knumonmaster
Zuletzt bearbeitet von Knumonmaster am Di 12.02.08 15:20, insgesamt 1-mal bearbeitet
|
|
Zorro
      
Beiträge: 76
Win 2000, Win XP Pro
Delphi 7 Architect
|
Verfasst: Mo 14.01.08 18:34
Titel: Re: Text nach Farbe in string kopieren?
Knumonmaster hat folgendes geschrieben: |
nun zum Knackpunkt: wie kann ich es machen, dass nur der Text, der in clwindowText geschrieben ist, als string ausgegeben wird?
|
Klingt danach, als müsstest du dich mit dem RTF-Datenformat auseinandersetzen.
Greetz
Zorro
|
|
Knumonmaster 
Hält's aus hier
Beiträge: 12
Win 2000, Ubuntu 7.10
Delphi 7 Enterprise, Lazarus
|
Verfasst: Mo 28.01.08 22:45
Inzwischen hab ich es so gemacht, dass ich alles in einen string kopiert habe und danach die Formatierungen gelöscht bzw. notgedrungen ersetzt habe ...
Nun ergibt sich aber mit der selben Syntax-Hervorhebung ein weiteres Feature-Problem: Die Syntax soll bereits nach der eingabe gefärbt werden.
ich habe dabei Syntax wie "\c[n]" oder \n[n]", auch simplere "\$", aber auch html-ähnlich "\>s\<" n:Int s:Str
mit FindText geht das färben schon sehr gut:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| while FindText(SearchText, StartPos, Endpos, [stMatchCase])<>-1 do begin Endpos := Length(RichEdit.Text) - startpos; Position := FindText(SearchText, StartPos, Endpos, [stMatchCase]); Inc(StartPos, Length(SearchText)); SelStart := Position; SelLength := Length(SearchText); SelAttributes.Color := clr; end; |
allerdings kann n von 0 bis 9,999 gehen, weshalb diese methodik in verbindung mit einer schleife eher ungeeignet ist ...
zum anderen habe ich eine methodik gefunden, um wie in html alles von zeichen a bis zeichen b zu färben.
allerdings möchte ich z.b. "\c[n]" und "\n[n]" unterschiedlich einfärben ...
eine lösung wäre sicherlich nach "\c[" zu suchen und SelLength dann bis zum "]" zu erweitern ...
aber ich habe keine ahnung wie ich das bewerkstelligen soll ^^;;;
kann mir da jemand weiter helfen?
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Mo 28.01.08 23:03
Titel: beliebig langer ausgelassener Text
Hi,
Ich schreibe gerade an einem Textverarbeitungsprogramm und habe mich bereits mit der Thematik beschäftigt...
also ich werde es glaube ich so machen:
 Du suchst den ersten Textteil mit "Pos" und dann ab der Position des ersten den zweiten Textteil mit "PosEx".
 nun bestimmst du z.B. die Länge bestimmen, etc...
 soweit ich dich verstanden habe steht da eine Nummer(n) immer drin, also würde ich das ganze noch mit trystrtofloat oder trystrtoint prüfen.
viel Erfolg
Am Ende programmierst du es noch aus und ich kann auf deinem code aufbauen, das wäre nützlich
Edit: posEx gibt es glaube ich erst ab Delphi 7, kannst du aber leicht nachschreiben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| function PosEx(const Substr: string; const S: string; Offset: Integer): Integer; begin if Offset <= 0 then Result := 0 else Result := Pos(Substr, Copy(S, Offset, Length(S)));
if Result <> 0 then Result := Result + Offset - 1; end; |
Ab Delphi 7 ist PosEx im StrUtils.
|
|
Knumonmaster 
Hält's aus hier
Beiträge: 12
Win 2000, Ubuntu 7.10
Delphi 7 Enterprise, Lazarus
|
Verfasst: Mo 28.01.08 23:50
btw ich habe Delphi 7 Enterprise (siehe Infos links unter meinem Avatar)
wie suche ich mit Pos bzw. ExPos in einer schleife??
kannst du mir da ein Beispiel geben?
ich hab das jetzt so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| StartPos := 0; with RichEdit1 do begin Endpos := Length(RichEdit1.Text); Lines.BeginUpdate; Position := FindText('\c[', StartPos, EndPos, [stMatchCase]); ExPosition := FindText(']', Position, EndPos, [stMatchCase]); SelStart := Position; SelLength := ExPosition-Position+1; SelAttributes.Color := clRed; SelLength := 0; Lines.EndUpdate; end; |
wenn ich die schleife und Inc auskommentiere, markiert er nur das "]", wenn ichs ohne Inc mache, rechnet er sich zu tode X3
was bedeutet eigentlich das Inc? wofür ist das da? Oo
edit so: fehlt nur noch ne schleife ^^;;
Delphi-Quelltext 1: 2: 3:
| SetFocus; SelStart := Pos('\c[',RichEdit1.Text)-1; SelLength := PosEx(']', RichEdit1.Text,1); |
|
|
Knumonmaster 
Hält's aus hier
Beiträge: 12
Win 2000, Ubuntu 7.10
Delphi 7 Enterprise, Lazarus
|
Verfasst: Di 12.02.08 14:29
so ... ich hab's jetzt endlich geschafft mein Vorhaben zu realisieren.
Ich habe es wieder mit FindText gelöst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| function SOF2(RichEdit: TRichEdit; SearchText: string; ST2: string; clr: TColor): integer; var StartPos, Position, Pos2, Endpos: Integer; begin StartPos := 0; with RichEdit do begin Endpos := Length(RichEdit.Text); while FindText(SearchText, StartPos, Endpos, [stMatchCase])<>-1 do begin Endpos := Length(RichEdit.Text) - startpos; Position := FindText(SearchText, StartPos, Endpos, [stMatchCase]); Pos2 := FindText(ST2, Position, Endpos, [stMatchCase]); Inc(StartPos, Length(SearchText)); SelStart := Position; SelLength := Pos2 - Position + Length(ST2); SelAttributes.Color := clr; end; SelStart := Length(RichEdit.Text); SelLength := 0; Result := SelLength; end; end; |
Nun bräuchte ich allerdings auch so eine Methode, um in einem String '\v[n]' n:=int mit z.B.'0' zu ersetzen.
Dummerweise geht weder StringReplace, noch FindText :/
Weiß da jmd. abhilfe?
LG
Knumon
|
|
|