Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Syntaxhighliter (https://www.delphipraxis.net/52030-syntaxhighliter.html)

faux 22. Aug 2005 22:44


Syntaxhighliter
 
Hallo!

Kann mir mal jemand das Prinzip eines Syntaxhighliters erklären?
Überprüft der, nach jedem Tastenschlag den ganzen Text?
Wie zum Beispiel findet der alle Wörter namens "self" oder "Self" bzw "SELF", also woher weiß der, dass er "self." highlighten muss, "mySelf" jedoch nicht?
Wie highlitet man zum beispiel alle Strings in dem Beispiel:
Code:
myVar = [color=grey]"Der"[/color]+[color=grey]" "[/color]+[color=grey]"Text"[/color];
Danke schon mal.
Grüße
Faux

Matze 22. Aug 2005 22:46

Re: Syntaxhighliter
 
Auch wenn du dir wohl nicht eine solche Antwort erhoffst, doch du könntest dir die Source-Codes der SynEdit-Komponenten näher ansehen, evtl. lässt sich das Prinzip ohne größere Einarbeitung herauslesen.

faux 22. Aug 2005 22:52

Re: Syntaxhighliter
 
Aha, ok. Ich habe garnicht gewusst, dass es sowas bereits gibt... ;)

Danke, werd mal schauen...

Nachtrag:
Zitat:

Zitat von Matze
Auch wenn du dir wohl nicht eine solche Antwort erhoffst[...]

Ich habe mir auch nicht erhofft, dass mir jetzt irgendwer ein Beispiel postet, sondern einen Google-Link oder so... ;)

yankee 22. Aug 2005 23:04

Re: Syntaxhighliter
 
Zitat:

Zitat von Matze
Auch wenn du dir wohl nicht eine solche Antwort erhoffst, doch du könntest dir die Source-Codes der SynEdit-Komponenten näher ansehen, evtl. lässt sich das Prinzip ohne größere Einarbeitung herauslesen.

*lol*, nee, wirklich incht. Aber mich würde das auch mal interessieren. Ich habe selber mal einen Highlighter mit RichEdit geschrieben, bevor ich von der existenz von SynEdit wusste:
http://www.delphipraxis.net/internal...er=asc&start=0
Ich muss leider gerade feststellen, dass das Programm ninchtmehr auf dem webspace liegt und ich momenatn da auch incht dran komme. Sonst hätte ich dir den gerne mal zu demo gegeben.
Aber mal vom Prinzip her ing der so vor, dass der jedesmal, wenn ein Bustabe gedrückt wurde eben einfach der umliegende Text geprüft wurde. Allerdings konnte der auch nicht mehr, als bei HTML das Zeug in den die tags (<ab>) fett zu drucken und wenn noch was dehinter steht (<ab dahinter="bla">) dieses grün zu drucken. Da ist es natürlich einfacher, weil ich einfach nur geprüft habe, ob der vorhergehende Buchstabe fett oder grün oder normal war und auch nicht gerade ein >.
Also eigentlich konnte der garnicht wirklich viel, obwohl einige da ziemlich begeistert waren und meinten zum Beispiel: "also ich danek erstmal SUPER CODE" oder "ansonsten super Porgramm!!! danke für den Code... ein Teil davon ist höchstinterressant!". Ok, hat beides der selbe Typ geschriben, aber trotzdem würde imch jetzt im Nachhinein doch mla interessieren, was der eigentlich so toll daran fand. Leider ist der inchtmehr in der DP...

bigg 22. Aug 2005 23:11

Re: Syntaxhighliter
 
Zitat:

Überprüft der, nach jedem Tastenschlag den ganzen Text?
Nein, nur den Text, den du auch auf dem Bildschirm sieht's.

Zitat:

Wie zum Beispiel findet der alle Wörter namens "self" oder "Self" bzw "SELF", also woher weiß der, dass er "self." highlighten muss, "mySelf" jedoch nicht?
Zunächst einmal werden alle Suchbegriffe nach UpperCase oder LowerCase in einer Liste gespeichert, konvertiert und sortiert. Dein String /deine StringList wird dann durchlaufen und in einer Case-Schleife durch Regeln auf dem Schirm gezeichnet.

Das lässt sich leider nicht so kurz beschreiben, ist aber leichter als es aussieht.
SynEdit oder UniSynEdit sind da sehr gute Beispiele.

xaromz 22. Aug 2005 23:16

Re: Syntaxhighliter
 
Hallo,

da verweise ich doch ganz dreist auf mein Memo :mrgreen: .
Das macht so eine Art Highlighting bei der Rechtschreibprüfung. Weil ich faul bin prüft meine Komponente immer den gesamten Text. Aber wichtig ist für Dich wahrscheinlich das Filtern der einzelnen Bestandteile (Wörter). Dabei musst Du einfach von der Cursorposition zurück gehen, bis Du einen Wortanfang findest (Leerzeichen, Punkt, Zeilenanfang...) und dann das gleiche für das Wortende nach hinten machen. Das Wort prüfst Du dann mit Deiner Liste und entscheidest dann, ob Du es highlightest oder nicht.
Wie gesagt, meine Komponente macht das (momentan) immer für den ganzen Text, aber wichtig ist natürlich nur das aktuelle Wort.

Gruß
xaromz

faux 23. Aug 2005 07:29

Re: Syntaxhighliter
 
Danke für die Antworten.
Ich werd mir das alles mal durchsehen.

Ich hab vor ein paar Monaten mal einen SQL-Syntaxhighliter in PHP gemacht. Der machte alles zwischen " und " und ' und ' grün und alles zwischen ` und ` orange. Dann konnte er noch alle Schlüsselwörter hervorgen, jedoch nur wenn vor und nach ihnen weder ein Zeichen noch der Zeilenanfang stand, was zB Probleme macht, wenn man VALUES( schreibt, also kein Leerzeichen ließ. Gescheitert bin ich außerdem noch beim Highliten aller Zahlen (rot) und aller Kommentare (grün). Besonders Mehrzeilige Kommentare. Also das Highliten der Kommentare selbst ist ja nicht weiter schwer, aber er darf ja dann nix anderes mehr Highliten. Also weder Zahl, noch String, noch ein Schlüsselwort.
Nur hab ich den leider weggeschmissen, weil... weiß ich nichtmehr... :oops:

Nya, und jetzt will ich sowas halt in C# oder Delphi.NET machen...

Grüße
Faux

Flocke 23. Aug 2005 08:38

Re: Syntaxhighliter
 
Wichtig ist, dass du von vorne nach hinten durchgehst und dabei jeweils auf alle Möglichkeiten prüfst. Also suchst du z.B. für Pascal immer nach dem ersten
- Kommentaranfang '{' oder '(*' oder '//' oder
- Stringanfang '"' oder '''' oder
- Anfang eines Schlüsselwortes 'a' bis 'z'.
Das darfst du nicht separat machen, denn sonst können Dinge wie
Delphi-Quellcode:
begin // hier gehts los bis end
deinen "Parser" hereinlegen wenn du erst alle Schlüsselwörter, dann alle Zeichenketten und danach erst alle Kommentare behandelst. Und wenn du die Reihenfolge änderst, dann kann man ihn mit
Delphi-Quellcode:
a := 'begin // hier gehts los bis end';
hereinlegen.

Ich habe kürzlich einen in PHP geschrieben (hier), der dort natürlich die ohnehin schon gegebenen Möglichkeiten regulärer Ausdrücke nutzt. Da kannst du mal in den Quelltext schauen. Für Pascal nehmen ich (vereinfacht) den regulären Ausdruck:
Code:
[[:<:]][a-zA-Z_]|'|//|{|\(\*
Allerdings bin ich zu wenig drin in .NET um zu wissen, ob's da auch reguläre Ausdrücke gibt :stupid:

Chewie 23. Aug 2005 08:46

Re: Syntaxhighliter
 
Zitat:

Zitat von Flocke
Allerdings bin ich zu wenig drin in .NET um zu wissen, ob's da auch reguläre Ausdrücke gibt :stupid:

Klar gibts die ;)

Obwohl ich mich mit Compilerbau nicht auskenne, würd ich doch einen etwas akademischeren Ansatz wählen und erstmal einen Tokenizer drüberlaufen lassen, der alle Tokens erfasst, unabhängig von den Whitespaces. Diese Tokens kann man dann kategorisieren und entsprechend einfärben.
Ist vielleicht anfangs etwas mehr Code, aber man kann leichter Änderungen dranmachen.

yankee 23. Aug 2005 09:46

Re: Syntaxhighliter
 
Zitat:

Zitat von faux
Nya, und jetzt will ich sowas halt in C# oder Delphi.NET machen...

Also wenn du es einfach haben willst, dann nimmst du einfach Synedit, denn da ist schon alles dabei, was du für SQL-Higjhlighting brauchst und das ganze in 3 Klicks.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 Uhr.
Seite 1 von 2  1 2      

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