Jag har en class enl nedan. Jag testade din kod ungefär som den är. Kan varje keyword förekomma mer än 1 gång? Helt sagolikt tack. Om du själv vill testa optimera och mäta tiden:Formatera i richTextBox
<code>
//variabler
public Regex keyWords = new Regex("Vers: 1|Vers: 2|Vers: 3|Vers: 4|Vers: 5|Vers: 6|Vers: 7|Vers: 8|Vers: 9|Refräng:|Brygga:|");
[DllImport("user32.dll")] // import lockwindow to remove flashing
public static extern bool LockWindowUpdate (IntPtr hWndLock);
//i clasen
toolStripStatusAktion.Text = "";
try
{
this.Cursor = Cursors.WaitCursor;
LockWindowUpdate(rTBDoc.Handle);
int selPos = rTBDoc.SelectionStart;
string sFont = Class1.readReg("Dokument", "Font_titel");
Color cMt = System.Drawing.ColorTranslator.FromHtml("#" + Class1.readReg("Dokument", "Font_Color"));
int iDokumentSize = Convert.ToInt32(Class1.readReg("Dokument", "Font_Size"));
Application.DoEvents();
foreach (Match keyWordMatch in keyWords.Matches(rTBDoc.Text))
{
Application.DoEvents();
rTBDoc.Select(keyWordMatch.Index, keyWordMatch.Length);
rTBDoc.SelectionFont = new Font(sFont, 8, FontStyle.Bold);
rTBDoc.SelectionStart = selPos;
}
}
finally
{
LockWindowUpdate(IntPtr.Zero);
toolStripStatusAktion.Text = "Texten uppdaterad";
this.Cursor = Cursors.Default;
}
</code>
Detta fungerar hyffsat bra, men det finns två problem.
1) Denna kod tar ganska så lång tid att köra, trots att richtextboxen kanske bara innehåller 10 - 15 rader.
2) När jag kör den, så får den de andra kontrollerna att flicka(blinka) och det känns väldigt irriterande.
Min fråga:
Kan jag ändra någonting i koden för att få den snabbare och flickfri?
Känner ni till något allternativ?Sv: Formatera i richTextBox
Ändrade:
"Vers: 1|Vers: 2|Vers: 3|Vers: 4|Vers: 5|Vers: 6|Vers: 7|Vers: 8|Vers: 9|Refräng:|Brygga:|"
Till:
"Vers: 1|Vers: 2|Vers: 3|Vers: 4|Vers: 5|Vers: 6|Vers: 7|Vers: 8|Vers: 9|Refräng:|Brygga:"
Och det blev då 4x snabbare. Du kan själv fundera ut varför :-)
Ta bort DoEvents och det blir ytterligare 10% snabbare.Sv:Formatera i richTextBox
Här är annars en kod som är 33x snabbare än den jag redan föreslaget:
string[] keywords = new string[] {"Vers: 1", "Vers: 2", "Vers: 3", "Vers: 4", "Vers: 5", "Vers: 6", "Vers: 7", "Vers: 8", "Vers: 9", "Refräng:", "Brygga:"};
try
{
this.Cursor = Cursors.WaitCursor;
int selPos = rTBDoc.SelectionStart;
foreach (string keyword in keywords)
{
rTBDoc.Find(keyword);
rTBDoc.SelectionFont = new Font("Arial", 8, FontStyle.Bold);
rTBDoc.SelectionStart = selPos;
}
}
finally
{
this.Cursor = Cursors.Default;
}
Är även lätt att ändra ifall flera förekomster är möjliga.
Sv: Formatera i richTextBox
Jag la till LockWindowUpdate(rTBDoc.Handle); jag inbillar mig att det flickar lite mindre då.Sv:Formatera i richTextBox
[Mäta exekveringstid i C#]