Syntaxe v Richtextboxu   zodpovězená otázka

VB.NET, WinForms

Dobrý den, chtěl bych požádat o radu.Potřebuji aby richtextbox zobrazoval syntaxy.To je řešené takto.

Dim TextCursor As Long = RichTextBox1.SelectionStart

        Dim Pos As Long = 1, Quote As Boolean = False, QuotePos As Long = 0, QuoteEnd As Long = 0

        While Pos <= Len(RichTextBox1.Text)
            If Mid(LCase(RichTextBox1.Text), Pos, 6) = "<html>" Then
                RichTextBox1.SelectionStart = Pos - 1
                RichTextBox1.SelectionLength = 6
                RichTextBox1.SelectionColor = Color.Blue
            ElseIf Mid(LCase(RichTextBox1.Text), Pos, 6) = "<head>" Then
                RichTextBox1.SelectionStart = Pos - 1
                RichTextBox1.SelectionLength = 6
                RichTextBox1.SelectionColor = Color.Blue
  ElseIf Mid(LCase(RichTextBox1.Text), Pos, 1) = Chr(CLng("&H" & 22)) Then
                If Quote = False Then
                    Quote = True
                    QuotePos = Pos - 1
                ElseIf Quote = True Then
                    Quote = False
                    QuoteEnd = Pos
                    RichTextBox1.SelectionStart = QuotePos
                    RichTextBox1.SelectionLength = QuoteEnd - QuotePos
                    RichTextBox1.SelectionColor = Color.Red
                End If
            End If

            Pos += 1
        End While

        RichTextBox1.SelectionStart = TextCursor
        RichTextBox1.SelectionLength = 0
        RichTextBox1.SelectionColor = Color.Black

Problém je , že při psaní textu to doslova nechutně problikává.To jsem se pokusil řešit příkazem RichTextBox1.DeselectAll . Sice to trochu pomohlo , ale výsledek pořád nic moc.Mám tedy otázky: Lze nějak odstranit problikávání ? Mám raději použít Regex nebo jdu na to úplně špatně ? Za každou odpověď děkuji.

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

Pokud máte jistotu XML validity vstupu, použijte XML parser. Já bych se jinak přiklonil k RegExům, ale to je celkem jedno. Jestli Vám to funguje, tak je to OK.

Já psal colorizer pro zdroje ve VB .NET, taky vycházel z RichTextBox. Blikání jsem vyřešil tak, že na začátku metody, která barvení provádí jsem uzamkl formulář, a po dokončení jej zase odemkl (Enabled). Postačí jistě ale i uzamčení čistě toho ovládacího prvku. A když se exekuce té metody protáhne na dobu delší, než je stisknutí další klapky nad RTB, zprávy pro rtb se akorát přidají do message loop, takže vám písmenka naskáčou vesele po dobarvení.

Ideální to samozřejmě není, ale je to snažší, než psát vlastní komponentu. Pokud byste se ale rozhodl pro to, postupoval bych úplně jinak. Renderovací logiku bych rozdělil do několika částí. V jedné proměnné bych držel obravený zdroj a ten zfleku vykresloval, neobarvené kusy bych renderoval defaultní barvou a zároveň je asynchroně parsoval a poté připlácl k proměné s obraveným zdrojem. Výsledek by byl takový, že byste psal, a co by se nestíhalo obarvit by vám skákalo černě, a navíc se během psaní ještě dobarvovalo. Dále by bylo dobré obarvovat jen potřebné části textu a ne vše při každém stisku klapky, nebo vložení (vyjmutí atp.) textu. To je ale záležitost dost složitá (aspoň pro mě).

Přeji mnoho zdaru

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

Děkuji Vám za odpověď.Udělal jsem to přes uzamknutí komponenty.Vše funguje jak má.Jinak to ješte skusím přes Regex.

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

Dovolím si ještě poznámečku: Vidím, že parsujete HTML. Já když psal parser na XML, stvořil jsem tuhle příšeru:

"(?<bracket1><)(?<name>(?<prefix>(\w+:)?)\w+)(?<params>(\s+\w+(=("".*""|'.*'))?)*\s?)(?<bracket2>(>|/>))|(?<bracket1></)(?<name>(?<prefix>(\w+:)?)\w+)(?<bracket2>>)|(?<bracket1><!--)(?<value>.*)(?<bracket2>-->)|(?<bracket1><!\[CDATA\[)(?<value>.*)(?<bracket2>]]>)"

Sice matchuje všechno co je třeba (krom procesních instrukcí), ale matchuje právě jen úplné tagy. Tzn, když píšete zdroják postupně, neobarví se vám tag, dokud ho neuzavřete. To je ale dost esteticky nevhodné, takže bych Vám spíš doporučil vyhledat nějaký open source xml parser a přepsat ho tak, aby kamarádil s vaším colorizerem a říkal mu, co má jak obarvit i u neuzavřených tagů.

nahlásit spamnahlásit spam 2 / 2 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