Vyhledání znaků   otázka

VB.NET, Komponenty

Ahoj!

Potřeboval bych prosím poradit zda existuje nějaká jiná možnost

jak vyhledat v Richtextboxu určité znaky a přiřadit jim barvu.

Mám sice něco vymyšleno(doufám,že ne úplný nesmysl),ale v dlouhém textu je to dosti pomalé.

Brzdí to hlavně ten cykl Do While ...Loop

Dá se to řešit nějakým jiným způsobem?

(těch vyhledávaných znaků je více,jenom pro přehlednost jsem to zkrátil na 4)

Děkuji

            Dim f_Text As String = ""
            Dim delka As Integer = 1
            Dim selStart As Integer = -1
            Dim poziceZnaku As Integer = -1
            Dim o As Integer = 0

               For i = 1 To 4
                selStart = -1
                If i = 1 Then
                    f_Text = "G" : barva = My.Settings.colorG
                ElseIf i = 2 Then
                    f_Text = "X" : barva = My.Settings.colorX
                ElseIf i = 3 Then
                    f_Text = "Y" : barva = My.Settings.colorY
                ElseIf i = 4 Then
                    f_Text = "Z" : barva = My.Settings.colorZ
                Else
                    f_Text = barva = Color.Black
                End If

                poziceZnaku = -1
                o = 0
                Do While poziceZnaku <> 0
                    poziceZnaku = RichTextBox1.Find(f_Text, o, RichTextBoxFinds.MatchCase)
                    If poziceZnaku > -1 Or poziceZnaku = 0 Then
                        RichTextBox1.SelectionColor = barva
                        o = poziceZnaku + 1
                        If poziceZnaku = 0 Then poziceZnaku = 1
                    Else
                        Exit Do
                    End If
                Loop
            Next i
     

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud chcete udělat zvýrazňování syntaxe, nebo něco podobného, použijte komponentu ScintillaNET.

Pokud to chcete udělat z nejakého důvodu ručně, udělejte to tak, že ve vlastním vlákně připravte text ve formátu RTF a ten potom jen předhoďte RichTextBoxu do vlastnosti Rtf. Budete muset zjistit tag pro obarvení vybraných znaků, ale to bude něco primitivního podobného HTML.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano,mělo by to vlastně zvýrazňovat určité znaky,či slova v textu.

ScintillaNET vypadá jako velice zajímavá komponenta,něco jsem vyhledal a zkouknul,ale obávám se že je to nad mé schopnosti přizpůsobit to mým potřebám.....

Zkusím ještě hledat dále.Každopádně děkuji za nástřel a rozšíření obzoru.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak ScintillaNET se mi nepodařilo rozchodit,sice komponentu vložím do formulaře ale jak dám Debug tak to nahlásí chybu,že komponenta není definována a zřejmě se to trápí s Frameworkem4.0(Snažil jsem se postupovat dle uváděných postupů,ale výsledek se jaksi nedostavil).

Takže jsem šel druhou cestou přes HTML a v daných znacích mám tagy

určující barvu a následně celý text zobrazuji ve WebBrowseru.

Možná je to trochu komplikované,ale zdá se že funkční a zřejmě i rychlejší než můj původní postup.(Akorát to celé zpětně všechno překopat...).

Nicméně ještě jednou děkuji(alespoň jsem si trochu prostudoval HTML)ani náhodou jsem netušil,že se to dá řešit tímto způsobem.

Doplněno:

Zkusil jsem to spáchat i přes ty tagy v RTF(RichTextbox) a zdá se,že i tudy se dá jít a mohlo by to fungovat.....

nahlásit spamnahlásit spam 0 odpovědětodpovědět

ScintillaNET je wrapper do unmanaged knihovny Scintilla a tu je potřeba zkopírovat kamsi do systému, je to popsané v dokumentaci. Přes WebBrowser bych rozhodně nešel, je zbytečné do toho zatahovat Internet Explorer a HTML.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tu knihovnu SciLexer64.dll jsem zkopíroval do Windows/System,pro W7-64bit,pokud jsem zkopíroval SciLexer.dll do složky System32 tak jsem tu komponentu nedokázal ani natáhnout na Form pokud to bylo ve složce System,tak jsem to do Formu dostal,ale to bylo vše,při debugu to nahlásilo výše uvedenou chybu,nevím co dělám špatně....

2.Načetl jsem ScintillaNET.dll přes Choose Items...

Snažil jsem se to dělat dle dokumentace(dokonce i několikrát),ale....

Takže to spáchám přes ten RTF,protože zpětně když to chci uložit do čitelného .txt bez tagů, tak je to asi jednodušší přes ten richtextbox.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

rychlejší algoritmus nahrazující cyklus Do While..Loop je zde:

Dim casti = RichTextBox1.Text.Split(f_Text)
Dim pozice = 0
For Each c In casti
    pozice = pozice + c.Length
    RichTextBox1.Select(pozice, 1)
    RichTextBox1.SelectionColor = barva
Next c

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Děkuji za příspěvek,zdá se že je to opravdu o něco rychlejší,než

Do While...Loop,ale stále to bylo pomalé.Nejschůdněji to vypadá

přes Rtf.Ale i tak děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě jednou otravuji,ale dostal jsem se do potíží s tím,jak

dostat text(RTF) z jednoho richtextboxu do jiného resp. přidat do jiného(pokud je ještě prázdný...).

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       
        Dim C As String = "{\rtf1 \ansi \ansicpg1250 \deff0 \deflang1029 {\fonttbl{\f5 \fswiss \fcharset238{\*\fname Arial;}Arial CE;}} {\colortbl;\red255 \green0 \blue0;\red0 \green255 \blue0;}" _
         & "\cf2\fs20 Dobrý den \par\cf2 moc mi to nejde\par \cf1\fs18 nashledanou"
   

        RichTextBox2.Rtf = C
        RichTextBox1.Rtf = RichTextBox1.Rtf & RichTextBox2.Rtf
    End Sub

Pokud je RichTextBox1.Rtf stále ještě prázdný tak mi ten poslední příkaz nefunguje.Nevíte prosím kde mám problém.

Přijde mi že se tam nějakým způsobem hádají ty zaváděcí hlavičky,ale nevím....

Doplněno: takto by to asi šlo i s udržením formátování

        RichTextBox2.SelectAll()
        RichTextBox2.Copy()
        RichTextBox1.Select(RichTextBox1.TextLength, 1)
        RichTextBox1.Paste()

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback