AGB  ·  Datenschutz  ·  Impressum  







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

SyntaxHighlighting

Ein Thema von AnyKey · begonnen am 28. Sep 2009 · letzter Beitrag vom 5. Mär 2010
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von cookie22
cookie22

Registriert seit: 28. Jun 2006
Ort: Düsseldorf
936 Beiträge
 
Delphi XE2 Professional
 
#11

Re: SyntaxHighlighting

  Alt 5. Okt 2009, 17:31
hallo

warum benutzt du nicht z.B. synedit. damit ist jegliches syntaxhighlighting gar kein problem oder muss es selbst gemacht sein?
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#12

Re: SyntaxHighlighting

  Alt 5. Okt 2009, 18:56
Hallo,

kenn synedit nicht im Detail(nutze es nicht), aber auch dann muss doch angegeben(vorgegeben) werden, was eingefärbt werden soll, oder?
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Benutzerbild von cookie22
cookie22

Registriert seit: 28. Jun 2006
Ort: Düsseldorf
936 Beiträge
 
Delphi XE2 Professional
 
#13

Re: SyntaxHighlighting

  Alt 6. Okt 2009, 05:23
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.
  Mit Zitat antworten Zitat
AnyKey

Registriert seit: 15. Apr 2008
173 Beiträge
 
#14

Re: SyntaxHighlighting

  Alt 6. Okt 2009, 11:28
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
  Mit Zitat antworten Zitat
martin_

Registriert seit: 19. Mai 2008
Ort: Österreich
89 Beiträge
 
#15

Re: SyntaxHighlighting

  Alt 6. Okt 2009, 12:11
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...
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#16

Re: SyntaxHighlighting

  Alt 6. Okt 2009, 14:19
Hallo,

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
- ...
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
AnyKey

Registriert seit: 15. Apr 2008
173 Beiträge
 
#17

Re: SyntaxHighlighting

  Alt 8. Okt 2009, 14:31
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
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#18

Re: SyntaxHighlighting

  Alt 8. Okt 2009, 15:58
Hallo,

mehrere Fehler

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"
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
AnyKey

Registriert seit: 15. Apr 2008
173 Beiträge
 
#19

Re: SyntaxHighlighting

  Alt 8. Okt 2009, 16:04
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
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#20

Re: SyntaxHighlighting

  Alt 8. Okt 2009, 16:54
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.
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 20:39 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