Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi SyntaxHighlighting (https://www.delphipraxis.net/140885-syntaxhighlighting.html)

AnyKey 28. Sep 2009 10:36


SyntaxHighlighting
 
Hi,

ich muss in einem RichEdit ein Syntaxhighlighting durchführen. Mein bisheriger Code sieht so aus:

Delphi-Quellcode:
Textlen := Edit.GetTextLen;
    Linelen := Edit.Lines.Count;  
    for i := 0 to Linelen do
    begin
      with Edit do
      begin
        x := posex('[',Edit.Text,x)+1;
        SelStart := x-15;
        SelLength := 12;
        SelAttributes.Color := clRed;
        SelAttributes.Style := [fsBold];
        ProgressBar.Position := ProgressBar.Position + 1;
      end;
    end;
    x := 0;
    for i := 0 to Linelen do
    begin
      with Edit do
      begin
        x := posex('[',Edit.Text,x)+1;
        SelStart := posex('[',Edit.Text,x)-1;
        SelLength := 25;
        SelAttributes.Color := clGreen;
        SelAttributes.Style := [fsBold];
        ProgressBar.Position := ProgressBar.Position + 1;
      end;
    end;
Ich hatte also genaue punkte, an denen ich das Syntaxhighlighting durchführen musste, nach denen ich im Text suchen konnte. Jetzt sieht es so aus, dass ich später aus einer XML Datei die Infos bekomme, wie Lang die strings sind, etc. Diese Datensätze sehen dann ungefähr folgendermaßen aus:

Uhrzeit Fehler : FehlertextFehlerquelleFüllzeichenGerätenummerFüllz eichenAuftragsnummerFüllzeichen

Das ganze ist dann so etwa 120 zeichen lang. Jetzt soll folgendes passieren, es sollen Fehler, Fehlertext, Gerätenummer, Auftragsnummer (nur als Beispiel) hervorgehoben werden. Jetzt meine frage, wie schaffe ich es diese Textstellen zu highlighten, wenn ich nicht wie vorher bestimmte Zeichen hab an denen ich fest machen kann wann ich highlighte und wann nicht, sondern nur die Zeichenlänge habe. Ich habe es schon einmal versucht einfach über die Länge und die Position zu machen, allerdings wird das dann nur in der ersten Zeile geändert und nicht im ganzen Text. Weiß jemand wie ich das hinbekomme immer an der stelle zu highlighten wo sich diese Info befindet?

Hoffe mir kann jemand helfen!

Gruß
AnyKey

mkinzler 28. Sep 2009 10:38

Re: SyntaxHighlighting
 
Delphi-Quellcode:
for i := 0 to Linelen-1 do

AnyKey 28. Sep 2009 11:04

Re: SyntaxHighlighting
 
Hi,

danke für deine Antwort, das bringt mich aber leider nicht viel weiter. Er geht ja mit meinem Quellcode auch alles durch, mein problem ist jetzt aber dass ich kein Zeichen mehr als startpunkt nehmen kann so wie im Quelltext im ersten post, sondern dass ich ihm sagen muss an welcher position sich das jetzt befindet (was irgendwie nicht funktinoiert, weil er sich nur in der ersten Zeile damit aurhält).

Machen muss ich aber ungefähr sowas wie hier.

Delphi-Quellcode:
for i := 0 to Linelen-1 do
    begin
      with Edit do
      begin
        SelStart := 13;
        SelLength := 6;
        SelAttributes.Color := clBlue;
        SelAttributes.Style := [fsBold];
        ProgressBar.Position := ProgressBar.Position + 1;
      end;
      with Edit do
      begin
        SelStart := 22;
        SelLength := 2;
        SelAttributes.Color := clBlue;
        SelAttributes.Style := [fsBold];
        ProgressBar.Position := ProgressBar.Position + 1;
      end;
      ...
      ...
Hoffe jemand weiß wie das dann funktioniert.

Gruß
AnyKey

omata 28. Sep 2009 11:22

Re: SyntaxHighlighting
 
Vielleicht hilft dir das hier oder hier weiter.

AnyKey 28. Sep 2009 12:59

Re: SyntaxHighlighting
 
Also falls ihr noch ne andere Idee hättet wäre ich euch sehr dankbar. Dieses RegExpr hilft mir irgendwie nich sehr viel weiter... so wie ich das verstehe sucht der ja auch in dem Text nach bestimmten zeichen und so, die, oder ab denen er etwas markieren soll. Ich weiß aber wie lang die Felder sind und an welcher stelle sie stehen und will sie einfärben. Also, ab Stelle 13 in Zeile 1 färbe für 6 zeichen rot, dann ab Stelle 20 in Zeile 1 färbe für 12 zeichen rot, ab Stelle 13 in Zeile 2 färbe für 6 zeichen rot, usw. versteht ihr wie ich meine?

Hoffe mal ihr könnt mir helfen.

Gruß
AnyKey

AnyKey 29. Sep 2009 10:15

Re: SyntaxHighlighting
 
Hi,

an der Situation hat sich ein wenig verändert, daher werde ich nun die Funktion umschreiben. Ich werde das ganze jetzt so aufziehen, dass ich mir den kompletten Text aus dem Richedit in eine StringList speichere und aus ihr jeden Datensatz (jede zeile) einzeln wieder ins RichEdit schreiben werde und zu diesem Zeitpunkt auch jeweils für diese Zeile das Syntaxhighlighting machen werde. Ich denke dass es so funktionieren sollte. Ich lasse das ganze mal noch als offene Frage stehen, falls ich dabei noch probleme bekommen sollte, wegen dem Highlighting.

Gruß und danke für eure Hilfe!!
AnyKey

AnyKey 1. Okt 2009 14:21

Re: SyntaxHighlighting
 
So,

ich habe jetzt hier den neuen Quelltext, es funktioniert allerdings immer noch nicht nur einen bereich einzufärben wie z.B. in Zeile 1 von Stelle 9 im text 5 zeichen blau, danach wieder schwarz und in Zeile 2 das selbe durchführen.

Delphi-Quellcode:
class function TStringManipulation.SyntaxHighlighting(Edit: TRichEdit; Progressbar: TProgressbar): Bool;
var i          : Integer;
var Linemax    : Integer;
var AResultList : TStringList;
begin
  try
    AResultList := TStringList.Create;
    AResultList.Assign(Edit.Lines);
    Linemax := Edit.Lines.Count-1;
    ProgressBar.Position := 0;
    ProgressBar.Max := Linemax;
    Edit.Lines.Clear;
    for i := 0 to Linemax do
    begin
      with Edit do
      begin
        SelText := AResultList.Strings[i]+sLineBreak;
        SelStart := 9;
        SelLength := 5;
        SelAttributes.Color := clBlue;
        SelAttributes.Style := [fsBold];
      end;
      ProgressBar.Position := Progressbar.Position + 1;
    end;
    FreeAndNil(AResultList);
    result := true;
  except
    FreeAndNil(AResultList);
    result := false;
  end;
end;
Hoffe es hat einer eine Idee wie ich das hinbekommen kann.

Gruß
AnyKey

omata 2. Okt 2009 00:11

Re: SyntaxHighlighting
 
Meine Links hast du ja scheinbar nicht mal im Ansatz angeschaut, deine Problembeschreibung ist eigentlich auch nicht wirklich vorhanden, wie soll man dir eigentlich helfen?

Konkretes Beispiel!

Lannes 2. Okt 2009 11:25

Re: SyntaxHighlighting
 
Hallo,


Dein Code kann auch nicht funktionieren, denn SelStart wird immer auf 9 gesetzt, lass mal die StringList weg, die hilft Dir nicht dabei.

Wenn Du die jeweiligen Zeilenlängen bei SelStart berücksichtigst, sollte es funktionieren.
PseudoCode:
Code:
Zeile 1 -> SelStart := 9
Zeile 2 -> SelStart := SelStart + Länge Zeile 1
Zeile 3 -> SelStart := SelStart + Länge Zeile 2

AnyKey 5. Okt 2009 08:36

Re: SyntaxHighlighting
 
Danke für eure Hilfe!

Werde ich mir wohl selber noch ein paar gedanken drüber machen müssen...

Gruß
AnyKey

cookie22 5. Okt 2009 16:31

Re: SyntaxHighlighting
 
hallo

warum benutzt du nicht z.B. synedit. damit ist jegliches syntaxhighlighting gar kein problem oder muss es selbst gemacht sein?

Lannes 5. Okt 2009 17:56

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?

cookie22 6. Okt 2009 04:23

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.

AnyKey 6. Okt 2009 10:28

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

martin_ 6. Okt 2009 11:11

Re: SyntaxHighlighting
 
Hi,
hier ein kleines Codebeispiel:

Delphi-Quellcode:

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;
diese Procedure kopierst du in einem Button und benennst die Richedit Komponente in 'redt1' um und wundere dich über das Ergebnis...

Lannes 6. Okt 2009 13:19

Re: SyntaxHighlighting
 
Hallo,

Zitat:

Zitat von Lannes
PseudoCode:
Code:
Zeile 1 -> SelStart := 9
Zeile 2 -> SelStart := SelStart + Länge Zeile 1
Zeile 3 -> SelStart := SelStart + Länge Zeile 2

ok, damit Du weiter kommst, den Pseudocode umgesetzt:
Delphi-Quellcode:
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;
Erklärung: Selstart wird immer um die Länge der letzten Zeile weitergeschoben.

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
- ...

AnyKey 8. Okt 2009 13:31

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:
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;
Danke!!

Gruß
AnyKey

Lannes 8. Okt 2009 14:58

Re: SyntaxHighlighting
 
Hallo,

mehrere Fehler :wink:

siehe Kommentare
Delphi-Quellcode:
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;
Ich hatte schon in Beitrag #9 geschrieben: "lass mal die StringList weg, die hilft Dir nicht dabei"

AnyKey 8. Okt 2009 15:04

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:
 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;
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!

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

Lannes 8. Okt 2009 15:54

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.

AnyKey 9. Okt 2009 10:59

Re: SyntaxHighlighting
 
Hi,

noch mal vielen Dank für die Hilfe!

Also ich habs jetzt so gemacht, dass ich das RichEdit für die Zeit, in der das Syntaxhighlighting läuft einfach unsichtbar mache, danach wird es wieder sichtbar gemacht. Sieht zwar ein bisschen komisch aus, aber so ist das Flimmern weg :D zumindest solange bis ich eine bessere Möglichkeit finde!

Gruß und ein schönes Wochenende!
AnyKey

DeddyH 9. Okt 2009 12:22

Re: SyntaxHighlighting
 
Hast Du es mal Edit.Lines.BeginUpdate am Anfang und Edit.Lines.EndUpdate am Ende versucht?
Delphi-Quellcode:
Edit.Lines.BeginUpdate;
try
  //ganz viel Code
finally
  Edit.Lines.EndUpdate;
end;

AnyKey 2. Mär 2010 09:27

SyntaxHighlighting
 
Hi,

ich bins mal wieder, muss das Thema doch noch einmal aufgreifen, weil ich wieder hänge.Hat vielleicht mal jemand ne Idee oder einen Vorschlag wie ich das mit dem Syntaxhighlighting machen kann?

So sieht es im Moment gehighlightet aus:

12:01:01.178 000083 : 61************VTA1-SC16010******************************000000**1198877251663428******************

So solls aussehen:

12:01:01.178 000083 : 61************VTA1-SC16010******************************000000**1198877251663428******************

Habs versucht so zu programmieren wie ich es auch in echt machen würde, also Zeile für Zeile und Zeichen für Zeichen, funktioniert aber nicht wie man sieht.

Hier mal noch der Quellcode:

Delphi-Quellcode:
for j := 0 to RichEdit1.Lines.Count-1 do
begin
  for i := 0 to spaltenZahl-1 do
  begin
    if spaltenInhalt.teltype[i] = StrToInt(copy(Trim(RichEdit1.Lines.Strings[j]),23,2)) then
    begin
      RichEdit1.SelStart := neuStart;
      RichEdit1.SelLength := spaltenInhalt.laenge[i]; //Length(RichEdit1.Lines.Strings[OldLine-1])+2;
      if myColor = clBlack then
      begin
        myColor := clLime;
      end
      else
      begin
        myColor := clBlack;
      end;
      RichEdit1.SelAttributes.Color := myColor;
      if i < spaltenZahl-1 then
      begin
        RichEdit1.SelLength := 0;
        neuStart := neuStart + spaltenInhalt.laenge[i];
      end;
    end;
  end;
end;
ich hab keine Ahnung woran das liegt, vielleicht hat ja jemand eine Idee wie es funktionieren könnte.
Was halt das größte Problem ist, ist dass in jeder Zeile unterschiedlich gehighlightet werden muss, abhängig von einer bestimmten Zehl (die erste die in dem richtigen Beispiel fett markiert ist).

Wäre super wenn mir jemand helfen könnte!

Gruß
AnyKey

omata 2. Mär 2010 13:34

Re: SyntaxHighlighting
 
Liste der Anhänge anzeigen (Anzahl: 1)
Meine Aussagen von damals gelten immer noch!

Wenn du mal in meine angegebenen Beispiele reingeschaut hättest, dann wäre es für dich ein leichtes gewesen eine funktionierende Lösung zu realisieren.

Naja, du braucht deine Einstellung ja nicht ändern, es gibt bestimmt immer wieder solche Deppen wie mich, die deine Arbeit machen.

omata 2. Mär 2010 15:17

Re: SyntaxHighlighting
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier noch ein neuer Versuch, der etwas mehr "Luxus" bietet...

p80286 2. Mär 2010 17:02

Re: SyntaxHighlighting
 
@omata

hübsch! das kann man ja zur not noch extern konfigurieren!

mir gefällts!

Gruß
K-H

AnyKey 4. Mär 2010 12:57

Re: SyntaxHighlighting
 
Hi,

danke für eure Antworten!

@Omata: ich sehs nich so das du nen depp bist der meine Arbeit macht, sondern mir eher ne hilfe bei meiner Arbeit bist.

Der code sieht ja ganz gut aus, aber da es möglicherweise 6 oder mehr verschiedene Telegramme gibt, die alle in einer Datenbank stehen und deren Attribute in ein XML file gelesen werden, aus dem dann das Highlighting gemacht wird blick ich durch die Lösung nich wirklich durch, ist das dann code für jedes einzelne Telegramm oder wie ist das zu verstehen?

naja ich habe hier mal meine eigene Lösung weiter bearbeitet, das ganze funktioniert auch ganz gut, allerdings nur für die ersten beiden Zeilen, hat vielleicht jemand ne Idee wo mein Fehler liegt?

Delphi-Quellcode:
    neuStart := 22;
    for j := 0 to RichEdit1.Lines.Count-1 do
    begin
      for i := 0 to spaltenZahl-1 do
      begin
        if spaltenInhalt.teltype[i] = StrToInt(copy(Trim(RichEdit1.Lines.Strings[j]),23,2)) then
        begin
          RichEdit1.SelStart := neuStart;
          RichEdit1.SelLength := spaltenInhalt.laenge[i];
          if myColor = clBlack then
          begin
            myColor := clLime;
          end
          else
          begin
            myColor := clBlack;
          end;
          RichEdit1.SelAttributes.Color := myColor;
          if i < spaltenZahl-1 then
          begin
            RichEdit1.SelLength := 0;
            neuStart := neuStart + spaltenInhalt.laenge[i];
          end;
        end;
      end;
      neustart := (Length(RichEdit1.Lines.Strings[j])+2)+22;
    end;
Hoff mal ihr könnt mir bei meinem Problem helfen!

Gruß
AnyKey

omata 4. Mär 2010 21:28

Re: SyntaxHighlighting
 
Es beruhigt mich, dass ich dich nicht verscheucht habe (war nämlich auch nicht mein Vorhaben)

Allerdings macht es mich schon sehr traurig, dass du scheinbar lernresistent bist.

Du willst scheinbar gar keine wirkliche Hilfe, zumindest artikulierst du dich hier so.

Was passiert nach der zweiten Zeile? (die wir nicht mal kennen!)

Wie auch immer, ich gebe auf, ich habe dir jetzt schon Beispielcode geliefert. Da du aber von deiner Lösung (die nicht funktioniert) nicht abweichen willst, du versuchst es ja nicht mal und du dir auch gar keine Mühe machst, dein Problem so zu schieldern und auch vorzubereiten, dass andere dir helfen können, kann dir keiner helfen (selbst wenn er wollte).

Warum sollen wir dir hier alles aus der Nase ziehen? Du willst doch was von uns :wall:

Du machst es einem hier echt nicht leicht.

AnyKey 5. Mär 2010 07:13

Re: SyntaxHighlighting
 
Lernresistent bin ich ganz bestimmt nicht! Ich versteh nur nich genau wie ich deine Lösung auf mein Problem anwenden kann, weil ich durch deinen Code und was du da genau machst nich druchblick, aber statt es mir mal zu erklären, damit ich auch auf ne andere Lösung kommen kann, maulst du hier nur rum. Außerdem bin ich der meinung das ich schon viele Infos gegeben habe, du fragst ja auch nich nach dem was ich vergessen habe oder was dich interessieren könnte, woher soll ich denn wissen was dich interessiert um mir zu helfen?

Ich kann dir nur noch einmal sagen, in dem RichEdit befinden sich 50 Datensätze, diese sollen gehighlightet werden, es handelt sich nicht um Quellcode, sondern um Telegramme. Wie die aussehen ist oben schon oft genug erklärt worden. Es gibt keine Ahnung wieviele Telegramm arten, die über die Telegrammnummer gekennzeichnet werden, was also 60, 67, 80, 99, 1, 3, usw. sein kann. Da ich also nicht sagen kann in welcher Zeile welcher Telegrammtyp steht, muss ich es irgendwie herausfinden, also auslesen, für jede Zeile. Jenachdem welcher Typ dann dort steht soll der Text ab dieser Stelle gehighlightet werden. Mein Code macht das auch ganz richtig, allerdings werden nur die ersten zwei zeilen gehighlightet der rest nicht, weiß echt nich was ich dazu noch mehr erklären soll....

Also @omata wenn du mir nich mehr helfen willst dann trotzdem danke bis hier her, wie gesagt dein Quellcode, schön und gut, nur ne kleine erklärung wär nich schlecht. Ich versteh das so, dass du für jedes Telegramm ne eigene funktion schreibst, das wird aber bei 10 oder mehr telegrammen sehr unübersichtlich (finde ich), außerdem habe ich ja extra um das Automatisch durchzuführen diese XML Datei erstellt, in der alle informationen stehen.

Das thema steht noch, wenn mir noch jemand helfen möchte dann bitte ich darum Problem sollte ja jetzt genug erklärt sein, wenn nicht dann fragt halt wenn die infos zu drüftig sind.

Wäre super nett wenn mir jemand helfen könnte, wenn jetzt keiner mehr lust hat auch gut, find ichs ja vielleicht alleine raus.

Edit: noch mal kurz zur erklärung, bei dem was ich mit "die ersten beiden Zeilen" gemeint habe, handelt es sich nicht um Quellcode, sondern um die Zeilen im Richedit! Die interessieren ja aber keinen für die lösung oder?!

Gruß
AnyKey

AnyKey 5. Mär 2010 09:21

Re: SyntaxHighlighting
 
Hi,

also ich weiß jetzt wo mein Fehler liegt!

hier noch mal der Quellcode:
Delphi-Quellcode:
neuStart := 22;
for j := 0 to RichEdit1.Lines.Count-1 do
begin
  for i := 0 to spaltenZahl-1 do
  begin
    if spaltenInhalt.teltype[i] = StrToInt(copy(Trim(RichEdit1.Lines.Strings[j]),23,2)) then
    begin
      RichEdit1.SelStart := neuStart;
      RichEdit1.SelLength := spaltenInhalt.laenge[i]; //Length(RichEdit1.Lines.Strings[OldLine-1])+2;
      if myColor = clBlack then
      begin
        myColor := clLime;
      end
      else
      begin
        myColor := clBlack;
      end;
      RichEdit1.SelAttributes.Color := myColor;
      if i < spaltenZahl-1 then
      begin
        RichEdit1.SelLength := 0;
        neuStart := neuStart + spaltenInhalt.laenge[i];
      end;
    end;
  end;
  neuStart := (Length(RichEdit1.Lines.Strings[j])+2)+22;
end;
In Dieser Zeile ist der Fehler:
Delphi-Quellcode:
neuStart := (Length(RichEdit1.Lines.Strings[j])+2)+22;
Ich nehme hier die Länge der Spalte +2 (wegen Zeilenumbruch) und noch einmal +22 um an die Stelle ab der eingefärbt werden soll zu kommen. Was ich aber eigentlich machen müsste wäre: neuStart = neuStart + ((der Rest der Zeile ab neustart)+2)+22

Der Rest des Codes scheint zu stimmen :)

Edit: Also ich habs geschafft, es scheint jetzt alles richtig zu funktionieren :) Ich hab einfach noch einen Merker eingebaut, der mir die Länge der einzelnen eingefärbten Strings zusammenzählt und dann später von der Gesamtlänge der Zeile abzieht, damit ich dann in der Nächsten Zeile über die Variable neuStart wieder direkt an die Stelle komme, ab der gehighlightet werden soll :-D

Hier noch der richtige Code:

Delphi-Quellcode:
neuStart := 22;
for j := 0 to RichEdit1.Lines.Count-1 do
begin
  LenMerker := 0;
  for i := 0 to spaltenZahl-1 do
  begin
    if spaltenInhalt.teltype[i] = StrToInt(copy(Trim(RichEdit1.Lines.Strings[j]),23,2)) then
    begin
      RichEdit1.SelStart := neuStart;
      RichEdit1.SelLength := spaltenInhalt.laenge[i];
      LenMerker := LenMerker + spaltenInhalt.laenge[i];
      if myColor = clBlack then
      begin
        myColor := clLime;
      end
      else
      begin
        myColor := clBlack;
      end;
      RichEdit1.SelAttributes.Color := myColor;
      if i < spaltenZahl-1 then
      begin
        RichEdit1.SelLength := 0;
        neuStart := neuStart + spaltenInhalt.laenge[i];
      end;
    end;
  end;
  neuStart := neuStart + ((Length(RichEdit1.Lines.Strings[j])-LenMerker)+2);
end;
Danke noch mal allen die mir geholfen haben :)

Gruß
AnyKey


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 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