Entwickler-Ecke
WinForms - Syntax Highlighting. Warum markiert der so viel?
Csharp-programmierer - Mi 15.04.15 19:20
Titel: Syntax Highlighting. Warum markiert der so viel?
Hallo Leute. Ich habe jetzt eine Möglichkeit gefunden, die Syntax farbig zu machen. Mein Code:
C#-Quelltext
1:
| private Regex regenhtml = new Regex("<html>|</html>|<head>|</head>|<title>|</title>|<body>|</body>"); |
Und in das TextChanged Event:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| foreach(Match m in regenhtml.Matches(this.richTextBox1.Text)) { richTextBox1.Select(m.Index, m.Length); richTextBox1.SelectionColor = Color.Blue; richTextBox1.SelectionStart = selPos; richTextBox1.SelectionColor = Color.Black; } |
Und das ist mein Problem. Wenn ich nun in HTML arbeite und zwischen den Tags (<body bgcolor="" ...) bin, dass makiert er das zwar blau, aber makiert auch den Text dadrunter. Wo ist hier mein Fehler?
LG :D
Moderiert von
Th69: C#-Tags hinzugefügt
Ralf Jansen - Mi 15.04.15 20:05
Wo ist da "zwischen den Tags"? Ich seh nur ein Tag (body).
Warum markiert er das überhaupt? Wenn du auf <body> matscht sollte <body argument=value> nicht passen. Der Regex ist ein wenig zu simpel.
Ich vermute mal du solltest das Highlighting vor dem gezeigten foreach Code zumindest auf die Standardfarbe des Textes zurücksetzen. Wenn du denn Text <body> änderst so das er nicht mehr matcht würde die Färbung an der entsprechenden Position ja sonst erhalten bleiben da er ja zu deinem Matching Code nicht passt und daher nicht bearbeitet wird. Also vorher ein :
C#-Quelltext
1: 2:
| richTextBox1.SelectAll(); richTextBox1.SelectionColor = Color.Black; |
zum zurücksetzen. Das setzen von SelectionStart mit dem anschließenden setzen von SelectionColor auf Black sollte auch vermutlich nach dem foreach stattfinden und nicht im foreach (warum bei jeder Iteration zurücksetzen?). Ich vermute mal das du nicht nur SelectionStart zurücksetzen willst sondern auch SelectionLength.
Csharp-programmierer - Do 16.04.15 17:48
Also ich habe einen Button, der das HTML- Grundgerüst einfüght. An folgenden Stellen möchte ich etwas schreiben: ...
<html>
<head>
<title>...</title
</head>
<body ...>
</body>
</html>
Wenn ich in diesem Code (der automatisch eingefügt wird), irgendetwas dazu schreiben möchte, dann färbt er das zwar in entsprechender Farbe, aber makiert dafür den Text, der danach kommt. Das ist das Problem. Ihre Idee mit .lenght zurücksätzen wäre gut, jedoch weiß ich nicht, wie man das macht.
LG :)
Ralf Jansen - Do 16.04.15 19:08
Deine Idee. Es heißt deine Idee ;)
Kurzes Beispiel anhand deines Codes wie ich mir das vorstelle.
Das mit dem Regex war deine Idee. Ich bezweifle übrigens das man auch nur bei mittelprächtig komplexen Text so etwas anständiges hin bekommt ohne Pausen beim highlighten oder Geflacker des Controls.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| private Regex regenhtml = new Regex("<html>|</html>|<head>|</head>|<title>|</title>|<body>|</body>");
private void richTextBox1_TextChanged(object sender, EventArgs e) { int selPos = richTextBox1.SelectionStart; int selLength = richTextBox1.SelectionLength;
richTextBox1.SelectAll(); richTextBox1.SelectionColor = Color.Black;
foreach (Match m in regenhtml.Matches(this.richTextBox1.Text)) { richTextBox1.Select(m.Index, m.Length); richTextBox1.SelectionColor = Color.Blue; }
richTextBox1.SelectionStart = selPos; richTextBox1.SelectionLength = selLength; } |
Csharp-programmierer - Fr 17.04.15 13:59
Vielen, vielen Dank. Haut jetzt einwandfrei hin. Supuer :D :) :lol: 8)
Csharp-programmierer - Sa 05.03.16 23:17
Ich merke langsam, dass nun alle Buchstaben "flackern" bei längeren Zeilen. Gibt es hier vielleicht eine bessere / effizientere Variante?
Csharp-programmierer - So 06.03.16 13:21
Ich habe dieses Control nun inplimentiert.
Meine erste und wichtigste Frage ist: wenn ich diese Anwendung (mit Scintilla) veröffentliche, muss ich dann irgendwie darauf verweisen oder wie funktioniert das?
Und nun ein paar Fragen zu dem Control an sich:
1) Wie aktiviere ich das Syntax Highlighting?
2) Kann man Line numbers irgendwie aktivieren (wegen dem kleinen grauen Rand)
Vielen Dank für diesen Tip :=)
Csharp-programmierer - So 06.03.16 14:47
Vielen Dank für den Tip mit dem Steuerelement. Dies ist wirklich haar genau das, was ich brauche. Doch muss ich die Anwendungerweiterung irgendwie mitliefern auf einem anderen PC oder wie funktioniert das?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!