![]() |
Re: SyntaxHighlighting
hallo
warum benutzt du nicht z.B. ![]() |
Re: SyntaxHighlighting
Hallo,
kenn synedit nicht im Detail(nutze es nicht), aber auch dann muss doch angegeben(vorgegeben) werden, was eingefärbt werden soll, oder? |
Re: SyntaxHighlighting
wenn ich mich recht erinnere kann man dort filter erstellen die angeben was gefärbt werden soll. auf jeden fall wäre ein blick in den source code wohl interessant.
|
Re: SyntaxHighlighting
Hi,
danke für den Tipp mit dem Synedit. Ja, leider muss das selber gemacht sein... Also vielleicht schildere ich mal genau das Problem das ich hab. Ich habe eine Datei (ist ein logfile) in der Datei stehen viele verschiedene "Telegramme" also irgendwelche aufträge, Fehler, etc. dann habe ich eine XML Datei (existiert noch nicht, wollte erst das Grundgerüst schaffen), aus dieser XML geht dann hervor welcher Telegrammtyp wie gehighlightet wird. Kann dann also sein dass ich von zeichen 9, 5 zeichen Blau mache und beim nächsten Telegramm (nächste Zeile) dann aber von zeichen 5, 2 zeichen blau machen muss. Ich habe leider keinen Anhaltspunkt bei dem ich sagen kann z.B. ab < bis > blau oder von [ bis ] grün oder wie auch immer. Ich kann das wirklich nur über die Position des Wortes und die Länge machen (was im XML steht). Nur leider bekomm ich das nicht gebacken. :( Gruß AnyKey |
Re: SyntaxHighlighting
Hi,
hier ein kleines Codebeispiel:
Delphi-Quellcode:
diese Procedure kopierst du in einem Button und benennst die Richedit Komponente in 'redt1' um und wundere dich über das Ergebnis...procedure ...... var i : Integer; begin for i := 0 to Length(redt1.text) -1 do begin redt1.SelStart := i; redt1.SelLength := 1; if i mod 2 = 0 then begin redt1.SelAttributes.Color := clBlue; end else begin redt1.SelAttributes.Color := clRed; end; end; end; |
Re: SyntaxHighlighting
Hallo,
Zitat:
Delphi-Quellcode:
Erklärung: Selstart wird immer um die Länge der letzten Zeile weitergeschoben.
var z, Offset, Count, LineLength: Integer;
begin Offset:= 5; //kommt später aus XML Count := 2; //kommt später aus XML LineLength := 0; //initialisieren //Offset-1 => Index 0 ist SelStart-Index für erstes Zeichen RichEdit.SelStart := Offset-1; //initialisieren for z := 0 to RichEdit.Lines.Count-1 do begin RichEdit.SelStart := RichEdit1.SelStart + LineLength; RichEdit.SelLength := Count; RichEdit.SelAttributes.Color := clRed; LineLength := Length(RichEdit.Lines[z]) +2; //+2 = Zeilenumbruch berücksichtigen end; Der Code funktioniert natürlich nur zur Einfärbung eines Teilbereichs jeder Zeile, die Erweiterung auf mehrere Teilbereiche überlass ich Dir. Als auch die berücksichtigung von Randbedingungen, als da wären: -leere Zeilen im RichEdit -Zeilen die kürzer als Offset + Count sind - ... |
Re: SyntaxHighlighting
Hi,
habs jetzt mal so versucht, er färbt allerdings immer noch alle Zeilen Blau ein, hier mal der Quelltext, wäre schön wenn mal kurz einer drüber gucken könnte ob doch noch ein fehler drin ist.
Delphi-Quellcode:
Danke!!
class function TStringManipulation.SyntaxHighlighting(Edit: TRichEdit; Progressbar: TProgressbar): Bool;
var AResultList : TStringList; var Linelength : Integer; var Linemax : Integer; var Offset : Integer; var Count : Integer; var i : Integer; begin try Offset := 9; // später aus XML Count := 5; // später aus XML LineLength := 0; AResultList := TStringList.Create; AResultList.Assign(Edit.Lines); Linemax := Edit.Lines.Count-1; ProgressBar.Position := 0; ProgressBar.Max := Linemax; Edit.Lines.Clear; Edit.SelStart := Offset-1; for i := 0 to Linemax do begin with Edit do begin SelText := AResultList.Strings[i]+sLineBreak; SelStart := Edit.SelStart + Linelength; SelLength := Count; SelAttributes.Color := clBlue; SelAttributes.Style := [fsBold]; end; Linelength := Length(Edit.Lines[i])+2; //+2 wegen Zeilenumbruch! ProgressBar.Position := Progressbar.Position + 1; end; FreeAndNil(AResultList); result := true; except FreeAndNil(AResultList); result := false; end; end; Gruß AnyKey |
Re: SyntaxHighlighting
Hallo,
mehrere Fehler :wink: siehe Kommentare
Delphi-Quellcode:
Ich hatte schon in Beitrag #9 geschrieben: "lass mal die StringList weg, die hilft Dir nicht dabei"
class function TStringManipulation.SyntaxHighlighting(Edit: TRichEdit; Progressbar: TProgressbar): Bool;
var AResultList : TStringList; var Linelength : Integer; var Linemax : Integer; var Offset : Integer; var Count : Integer; var i : Integer; begin try Offset := 9; // später aus XML Count := 5; // später aus XML LineLength := 0; AResultList := TStringList.Create;//warum StringList ? AResultList.Assign(Edit.Lines); Linemax := Edit.Lines.Count-1; ProgressBar.Position := 0; ProgressBar.Max := Linemax; Edit.Lines.Clear; //löschen, um nachher wieder einzufügen ? Edit.SelStart := Offset-1; //RichEdit ist leer, Selstart bleibt 0 for i := 0 to Linemax do begin with Edit do begin //im vorigen Durchlauf eingefärbten Text überschreiben? SelText := AResultList.Strings[i]+sLineBreak; SelStart := Edit.SelStart + Linelength; SelLength := Count; SelAttributes.Color := clBlue; SelAttributes.Style := [fsBold]; end; Linelength := Length(Edit.Lines[i])+2; //+2 wegen Zeilenumbruch! ProgressBar.Position := Progressbar.Position + 1; end; FreeAndNil(AResultList); result := true; except FreeAndNil(AResultList); result := false; end; end; |
Re: SyntaxHighlighting
Hi,
danke für die Antwort ;) Ich lade das deshalb in eine StringList und leere das RichEdit weil das ganze sonst flimmert wenn ich das syntaxhighlighting mache. Mich würd das nich weiter stöhren aber die leute für die ich das mache finden das nich so prickelnd :) Und deswegen war meine Anweisung dann das so zu machen...
Delphi-Quellcode:
Diese Stelle soll ja eigetntlich nur die Zeilen aus der StringList wieder ins Richedit schreiben und die eingefügte Zeile dann formatieren. Ich steh da echt nen bisschen aufm schlauch... Ich hatte es ja mal so weit das es ging, aber dann wurde halt das mit dem Flimmern bemängelt und jetzt steh ich wieder da und es funktioniert nix. Bin froh das ihr mir helfen könnt!
with Edit do
begin //im vorigen Durchlauf eingefärbten Text überschreiben? SelText := AResultList.Strings[i]+sLineBreak; SelStart := Edit.SelStart + Linelength; SelLength := Count; SelAttributes.Color := clBlue; SelAttributes.Style := [fsBold]; end; Edit: hab das ganze jetzt mal geändert, also das mit der Stringlist rausgenommen, das funktioniert auch. allerdings tritt dann leider wieder dieses besagte flimmern auf :( -> und bei 100 Datensätzen/Zeilen sieht das wirklich ein bisschen doof aus. Gruß AnyKey |
Re: SyntaxHighlighting
Hallo,
damit würdest Du das Flackern aber nicht unterbinden, vermutlich eher vermehren. Die Menge dessen was eingefärbt werden muss wird doch dadurch nicht weniger. Ich würde dann das einfärben im Hintergrund realisieren, in einem nicht sichtbares RichEdit vornehmen oder den RTF-Code als Text zusammen basteln, und dann in das Anzeige-RichEdit übertragen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 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