Autor Beitrag
Csharp-programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Mi 15.04.15 19:20 
Hallo Leute. Ich habe jetzt eine Möglichkeit gefunden, die Syntax farbig zu machen. Mein Code:
ausblenden C#-Quelltext
1:
private Regex regenhtml = new Regex("<html>|</html>|<head>|</head>|<title>|</title>|<body>|</body>");					

Und in das TextChanged Event:
ausblenden 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 user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 :

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

ausblenden 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)
{
    // Selektion merken
    int selPos = richTextBox1.SelectionStart;
    int selLength = richTextBox1.SelectionLength;

    // Highlighting reseten
    richTextBox1.SelectAll();
    richTextBox1.SelectionColor = Color.Black;

    // neues Highligthing setzen 
    foreach (Match m in regenhtml.Matches(this.richTextBox1.Text))
    {
        richTextBox1.Select(m.Index, m.Length);
        richTextBox1.SelectionColor = Color.Blue;
    }

    // alte Selektion wieder herstellen
    richTextBox1.SelectionStart = selPos;
    richTextBox1.SelectionLength = selLength;
}
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Fr 17.04.15 13:59 
Vielen, vielen Dank. Haut jetzt einwandfrei hin. Supuer :D :) :lol: 8)
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 06.03.16 12:26 
Hallo,

wie Ralf schon schrieb, wird es schwierig das Flackern komplett zu unterbinden, du könntest aber mal die Tipps aus [Artikel] Flackernde Controls und flackerndes Zeichnen vermeiden versuchen.

Eine bessere Komponente für Syntax-Highlighting (und mehr) ist Scintialla.Net.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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 :=)

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 06.03.16 14:20 
Hast du die Scintialla.Net - Wiki gesehen?

PS: Rechts auf der Seite sind auch noch weitere Wiki-Artikel.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 06.03.16 15:38 
Auch das steht auf der von TH69 bereits verlinkten Produktseite github.com/jacobslusser/ScintillaNET