eigener Syntaxhighlighter

dNIL

Mitglied
Hi,

ich bin gerade dabei, einen Syntaxhighlighter zu basteln. Er hebt mir auch alles gewünschte hervor.
Code:
//Schlüsselworte:
	enum HighlightWorte {alter,end,begin,where,Else,create,delete,update,Set,If,insert,into,then,Is,Null,exit,or,and,xor,select,values,declare,variable};
	//Prozedur dazu:
	private void syntaxhighlighter(int anfangZeichen, int endZeichen)
	{
	                     Type HighlightListe = typeof(HighlightWorte);
		Font schrift = new Font("Courier New", 10, FontStyle.Bold);
		foreach (string s in Enum.GetNames(HighlightListe))
		{
			int anfang = anfangZeichen-1;
			int ende = endZeichen;
			while (anfang>=0)
				{
				anfang = richTextBox1.Find(s,anfang+1,RichTextBoxFinds.WholeWord);
					richTextBox1.SelectionColor = Color.Blue;
					richTextBox1.SelectionFont = schrift;
		}
	}
		}

Doch nur auf Knopfdruck. Nun soll aber während des Adrbeitens das gerade geschreibene Wort überprüft und bearbeitet werden. Die Funktion von Anfang bis ende durchlaufen zu lasse ist zu langsam. Nun dachte ich mir, dass ich einfach nach einem Keypress die aktuelle Cursorposition raussuche und dann 10 Stellen davor anfange zu suchen und 10 Stellen danach aufhöre.
Code:
private void richTextBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
	int aktuellepos = richTextBox1.SelectionStart;
	syntaxhighlighter(aktuellepos-10,aktuellepos+10);
	richTextBox1.SelectionStart = aktuellepos;
}


Doch das ist genau so langsam wie wenn ich alles machen würde, außerdem verschwindet dabei fast immer auch anderer Text...

Wie kann ich das machen?


Gruß
dNIL
 
Zuletzt bearbeitet:
Ich würde sowas über einen Thread realisieren. Dieser scannt einfach immer wieder die Textbox und färbt die bekannten Schlüsselworte einfach ein.
Damit brauchst Du Dir keine Gedanken machen, wo der Cursor sich gerade befindet.

Ist nur so eine spontane Idee ohne sehr lange darüber nachgedacht zu haben!
 
Original geschrieben von goela
Ich würde sowas über einen Thread realisieren. Dieser scannt einfach immer wieder die Textbox und färbt die bekannten Schlüsselworte einfach ein.
Damit brauchst Du Dir keine Gedanken machen, wo der Cursor sich gerade befindet.
Das dumme ist, dass richTextBox.Find den Text markiert und ich zum Farbändern auch den Text markieren muss, sodass der Cursor dann nicht mehr dort bleibt, wo er sollte.

Oder kann ich Text auch ändern (Farbe,...) ohne ihn markieren zu müssen?
 
Habe mich mit diesem Problem leider noch nie auseinander gesetzt! Aber eine mögliche Alternative oder Lösung wäre folgende:

1. Aktuelle Cursorposition merken
2. Text aus RichTextbox lesen
3. Im Speicher Inhalt der Textbox verändern - sprich Schlüsselworte einfärben
4. Formatierten Text in Textbox zurückschreiben
5. Cursor wieder an alte Stelle setzen.

Was ich nun aber gerade nicht weiss ist, ob die Formatierungen ebenfalls ausgelesen werden können (Farbinformationen). Diese müssen aber irgendwo hinterlegt sein. Dies habe ich jetzt nicht nachgeschaut!
 
Die RichTextBox ist dafür ohnehin zu überzogen, denk ich mal.

Ein anderer Vorschlag wäre, von der Textbox abzuleiten und dir Deine eigene Box zusammen zu bauen, mit allen notwendigen Methoden. Die neue Textbox kann ja dann gleich selber im Hintergrund (Thread) die einzelnen Worte formatieren etc.

Ist vielleicht ein wenig mehr Aufwand, kannst dann aber einfachst in andere Programme übernehmen bzw. erweitern.

Norbert
 
Original geschrieben von erik s.
Man könnte sich aber auch mal den Quellcode von SharpDevelop ansehen, ist ja Open Source.
Da bin ich auch gerade dran

Original geschrieben von Norbert Eder
Die RichTextBox ist dafür ohnehin zu überzogen, denk ich mal.
Die RichTextBox ist in der Tat etwas ungeeignet dafür. Die kann/macht, was sie überhaupt nicht soll und was man dann braucht, kann sie nicht...

Mal sehen, was wird...


Gruß
dNIL
 
Zuletzt bearbeitet:
Wenn du die Idee mit dem gerade geschrieben Wort, beibehälts würde ich immer im KeyPress nur bei Leertaste, Tab, NewLine etc. das Wort scannen.
 
Original geschrieben von mage
Wenn du die Idee mit dem gerade geschrieben Wort, beibehälts würde ich immer im KeyPress nur bei Leertaste, Tab, NewLine etc. das Wort scannen.
"Meine" Version läuft soweit ganz OK. Nur Rückgängig geht nicht. Ich prüfe nur bei Leer, Enter und so und dann etwa die letzten beiden Worte.

Bei SharpDevelop hab ich nun die Textbox eingebunden, die kann auch schon ganz schön (Sonderzeichen anzeigen, Zeilennummern...). Mal sehen, wie ich das mit dem Syntax-Higlighting nun hinbekomme...
 

Neue Beiträge

Zurück