AGB  ·  Datenschutz  ·  Impressum  







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

Text in RichEdit automatisch formatieren

Ein Thema von oki · begonnen am 4. Jun 2007 · letzter Beitrag vom 19. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

Text in RichEdit automatisch formatieren

  Alt 4. Jun 2007, 17:21
Hi Leute,

ich möchte mir für Log-Dateien meiner Anwendungen einen kleinen Log-Betrachter schreiben um diese besser lesen zu können. Das soll so funzen wie die Syntaxhervorhebung in der IDE oder hier im Forum. Ich lade die Logs als Text in ein RichEdit. Nun fehlt mir aber der Gedankenansatz wie ich entsprechende Schlüsselwörter automatisch formatieren kann ohne in einer Schleife den gesamten Text durchlaufen zu müssen.

Bsp. für eine Passage meines Log's:
Zitat:
{*LogInfoStart*}
[Header]
Stamp=04.06.2007 16:29:58
Sender=TGPRSReceiveServerClientWinSocket
InfoType=GPRSClient
ClientHandle=984640
PhoneNumber=+491609068
AddInfoType=received
Action=Programm
[Message]
ping
Elemente wie "{*LogInfoStart*}" oder die Bezeichner vor "=" möchte ich in Color und Style unterschiedlich hervorheben.

Hat jemand einen Tip wie ich das angehen muß?

gruß oki
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Text in RichEdit automatisch formatieren

  Alt 4. Jun 2007, 18:36
Hallo oki,

wenn ich deinen Auszug aus einer Log-Datei hernehme, dann ist die Syntax für den notwendigen Parser doch recht einfach. Es gibt drei Arten von Zeilen: Sie beginnen mit "{", mit "[" oder "anders". Ich habe mir für die Zerlegung der ersten beiden Zeilenarten eine Funktion Between() geschrieben und für die anderen Zeilen kannst du TStrings.ExtractName() verwenden. Färben musst du ja nur den sichtbaren Teil, so dass sich der Aufwand optimieren lasen sollte.

Grüße vom marabu
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Text in RichEdit automatisch formatieren

  Alt 4. Jun 2007, 18:50
Hallo Marabu,

erst mal Dank für die Antwort. Ich interpretiere deine Antwort so, dass ich alle Vorkommen meiner Schlüsselwerte suche, diese selektiere und dann Formatiere. was meinst du mit deiner Function Between() ?

Gibt es sowas wie ein FormatReplace oder muß ich das selber machen?

da ich die Logs selber schreibe kann ich hier auch noch Optimierungen vornehmen um die Anzeige zu verbessern (in meinem Log Betrachter)

Gruß oki
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Text in RichEdit automatisch formatieren

  Alt 4. Jun 2007, 19:02
Hallo oki,

wenn du die Datei selbst erzeugst, dann schlage ich dir statt deines modifizierten INI-Formates ein XML-Format vor. Du brauchst dann nicht mehr zu parsen, sondern kannst die Datei per CSS direkt im TWebBrowser visualisieren.

Between()

Freundliche Grüße
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Text in RichEdit automatisch formatieren

  Alt 4. Jun 2007, 19:27
Hi Marabu,

bin grad vom Abendbrot zurück. Jo, dass mit dem Between ist mir beim kauen auch so durch den Kopf geschossen. Aber danke für den Beispielcode. werd ihn gerne benutzen.
das mit dem XML ist sicher richtig, aber irgentwie hab ich immer einen Horror davor. Vielleicht mach ich es auch zu umständlich. Aber die Idee find ich gut.

Ich möchte in meinem Betrachter aber noch mehrere Functionen implementieren wie Filter (nach Client, InfoType usw.) und zusätzliche Hilight-Funktionen z.B. für Error-Blöcke. Da komme ich dann um einen eigenen Parser sicher nicht rum.

Aber noch mal Dank und Gruß oki
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Text in RichEdit automatisch formatieren

  Alt 18. Jun 2007, 15:41
Hi Leute,

ich hab jetzt mal folgendes getestet:

Text im RichEdit mit FindText durchsuchen, gesuchten String selektieren und Textattribute setzen. Dann weitersuchen. Das alles bis zum ende des Textes. Das ich das für mehrere Suchstrings mache ist jetzt erst mal nicht weiter von Interesse.
Nun klappt das auch erst mal ordentlich, jedoch die Geschwindigkeit lässt mächtig zu wünschen übrig. Die Logdatei (reiner Text) ist ca. 600K groß.

Meine entsprechenden Methoden zum Finden und Formatieren sehen so aus:
Delphi-Quellcode:
procedure TFormatTypeObj.FormatLogText(RichEdit : TRichEdit);
var TextPos, StartPos, FStrLength : Integer;
begin
  if not Assigned(RichEdit) then Exit;
  if RichEdit.Text = 'then Exit;
  FStrLength := Length(FFormatString);
  StartPos := 0;
  while not (RichEdit.FindText(FFormatString, StartPos, Length(RichEdit.Text) - StartPos, []) = -1) do begin
    TextPos := RichEdit.FindText(FFormatString, StartPos, Length(RichEdit.Text) - StartPos, []);
    Richedit.SelStart := TextPos;
    RichEdit.SelLength := FStrLength;
    FormatText(RichEdit.SelAttributes);
    StartPos := TextPos + FStrLength;
  end;
end;

procedure TFormatTypeObj.FormatText(SelAttributes: TTextAttributes);
begin
  if not assigned(SelAttributes) then Exit;
  SelAttributes.Color := FColor;
  SelAttributes.Charset := FCharSet;
  SelAttributes.Pitch := FPitch;
  SelAttributes.Name := FName;
  SelAttributes.Size := FSize;
  SelAttributes.Style := FStyle;
  SelAttributes.Height := FHeight;
end;
Das ich die Formatierung in eine Klasse ausgelagert habe sei hier noch erwähnt. So kann ich mehrere Strings für unterschiedliche Formatierungen mit ihren Format-Attributen definieren, die jede durch ein eigenes Object repräsentiert werden. Alle diese Objecte werden in einer Liste gehalten. Der Liste wird der zu formatierende Text mittels des haltenden RichEdit übergeben. Diese ruft wiederum die Methode FormatLogText auf und übergibt das RichEdit.

wie gesagt, klappt soweit, aber dauert ewig.

Kann hier jemand einen schnelleren Weg anbieten?

Gruß oki
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Text in RichEdit automatisch formatieren

  Alt 18. Jun 2007, 18:46
Hallo oki,

zwei Dinge stechen mir ins Auge: Der doppelte Aufruf von FindText mit identischen Parametern und die dreifache Ermittlung von RichEdit.Text, eine sehr aufwendige Prozedur.

Ich habe deine Beispieldaten aus Beitrag #1 auf 600 KB vervielfältigt und eine Prozedur von mir ausgemessen:

Delphi-Quellcode:
procedure FormatText(re: TRichEdit; const keyword: string;
    options: TSearchTypes; color: TColor);
var
  iStart, iFound, iLength: Integer;
begin
  iStart := 0;
  re.SelStart := MaxInt;
  iLength := re.SelStart;
  while iStart < (iLength - Length(keyword)) do
  begin
    iFound := re.FindText(keyword, iStart, iLength - iStart, options);
    if iFound = -1
      then Exit
      else iStart := iFound + Length(keyword);
    re.SelStart := iFound;
    re.SelLength := Length(keyword);
    re.SelAttributes.Color := color;
  end;
end;

// FormatText(RichEdit, 'Sender', [stWholeWord, stMatchCase], clRed);
Unter 10 Sekunden läuft das auch nicht - und da ist nur ein Schlüsselwort gefärbt worden.

Ich bleibe bei meinem Vorschlag: Schreibe die Logdaten im XML-Format und verwende die Komponente TWebBrowser als Basis für deinen Viewer. Für die Erstellung der Logdatei brauchst du das XML DOM nicht, es genügen etwa drei kleine Funktionen um Elemente und Attribute mit maskierten Texten auszugeben. Für den Viewer stehen alle benötigten Spezialfunktionen hier in der DP zur Verfügung und die Gestaltung machst du mit CSS.

Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#8

Re: Text in RichEdit automatisch formatieren

  Alt 18. Jun 2007, 22:50
Hi,

hier hab ich mal geschrieben wie man reservierte Woerter hervorheben kann:

Reservierte Woerter hervorheben
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Text in RichEdit automatisch formatieren

  Alt 19. Jun 2007, 07:29
Moin,

@marabu: Erst mal Dank für deine Hilfe. Das mit den Mehrfachaufrufen ist mir dann auch selber aufgefallen. Somit hatte ich die While in eine repeat-schleife geändert. Die Zugriffszeiten sind aber trotzdem unakzeptabel. Trotzdem poste ich hier noch mal meine aktuellste Variante:
Delphi-Quellcode:
procedure TFormatTypeObj.FormatLogText(RichEdit : TRichEdit);
var TextPos, StartPos, FStrLength : Integer;
begin
  FStrLength := Length(FFormatString);
  StartPos := 0;
  TextPos := 0;
  repeat
    TextPos := RichEdit.FindText(FFormatString, StartPos, Length(RichEdit.Text) - StartPos, []);
    if TextPos > -1 then begin
      Richedit.SelStart := TextPos;
      RichEdit.SelLength := FStrLength;
      FormatText(RichEdit.SelAttributes);
      StartPos := TextPos + FStrLength;
      if Assigned(FOnSercheEvent) then
        FOnSercheEvent(self, Format('Bezeichner "%s" an Stelle %d gefunden und formatiert', [FFormatstring, TextPos]));
    end;
  until TextPos = -1;
end;
Da die Funktion in einer eigenen Formatierungsklasse gebunden ist liegen der Formatierungsstring und die Formatierungsattribute als Klassenmember vor (nur noch mal der Vollständigkeit halber).
Wie gesagt, Zugriffszeiten unter der Gürtellinie.
Da mich das aber so langsam kratzt, will ich doch noch nicht locker lassen bevor mit XML anfange. Mann könnte doch ne Menge Zeit spaaren, wenn mann immer nur den sichtbaren Textbereich formatiert. nun hab ich leider noch nichts gefunden, wie man den aktuellen Textbereich der im WinContol angezeigt wird ermittelt. Das bischen kann man dann sicher auch im Repaint formatieren, ohne dass es auffällt.

@Mackhack: Dank für den Link. Ich teste das heute Vormittag mal und geb dir 'ne Info über meine Ergebnisse.

Gruß oki
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Text in RichEdit automatisch formatieren

  Alt 19. Jun 2007, 08:56
Hi oki,

wäre eventuell das SynEdit etwas für Dich? Mit diesem geht das recht einfach und es ist sehr schnell. Du packst Dir ein TSynEdit auf die Form, schreibst Deine eigene Highlighter-Grammatik, lässt über ein Tool eine *.pas-Datei erstellen, bindest diese ins Programm ein und weißt dem SynEdit Deine Grammatik zu, der Rest wird von SynEdit erledigt.

Hört sich auf den ersten Blick nach viel an, ist aber innerhalb von wenigen Minuten geschafft.

SynEdit
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:16 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