Oppure

Loading
29/07/10 20:06
TheEngi
Ciao a tutti... ho creato un mio Syntax Highlighter... il problema è che se sulla stessa riga di una richtextbox metto la stessa parola da colorare una me la colora, che è la prima che inserisco, mentre la seconda no:
es: ciao ciao ---> la prima parola ciao viene colorata mentre la seconda no.

vi posto il codice sorgente e le sue relative funzioni:

public void ColorVisibleLines(RichTextBox rtfText)
        {
            int FirstLine = FirstVisibleLine();
            int LastLine = LastVisibleLine();
            int FirstVisibleChar;
            int i = FirstLine;

            if ((FirstLine == 0) & (LastLine == 0))
            {
                                return;  
            }
            else
            {
                while (i < LastLine)
                {
                    FirstVisibleChar = GetCharFromLineIndex(FirstLine);
                    ColorLineNumber(rtfText, FirstLine, FirstVisibleChar);
                    FirstLine += 1;
                    i += 1;
                }
                
            }
        }

        public int FirstVisibleLine()
        {
            return SendMessage(rtfText.Handle.ToInt32(), (int)EditMessages.GetFirstVisibleLine, 0, 0);
        }

        public int GetCharFromLineIndex(int LineIndex)
        {
            return SendMessage(rtfText.Handle.ToInt32(), (int)EditMessages.LineIndex, LineIndex, 0);
        }

        public int LastVisibleLine()
        {
            int LastLine = FirstVisibleLine() + (rtfText.Height / rtfText.Font.Height);
            if (LastLine > rtfText.Lines.Length | LastLine == 0)
            {
                LastLine = rtfText.Lines.Length;
            }
            return LastLine;
        }

        public void ColorRtb(RichTextBox rtftext)
        {
            int FirstVisibleChar;
            int i = 0;

            while (i < rtftext.Lines.Length)
            {
                FirstVisibleChar = GetCharFromLineIndex(i);
                ColorLineNumber(rtftext, i, FirstVisibleChar);
                i += 1;
            }
        }

        public void ColorLineNumber(RichTextBox rtfText, int LineIndex, int lStart)
        {
            string Line = rtfText.Lines[LineIndex].ToLower();
            int i = 0;
            int Instance;
            int SelectionAt = rtfText.SelectionStart;

            // Lock the update 
            LockWindowUpdate(rtfText.Handle.ToInt32());

            // Color the line black to remove any previous coloring 
            rtfText.SelectionStart = lStart;
            rtfText.SelectionLength = Line.Length;
            rtfText.SelectionColor = Color.Black;

            // Find any comments 

            Instance = Line.IndexOf(";") + 1;

            // If there are comments, color them 
            if (Instance != 0)
            {
                rtfText.SelectionStart = (lStart + Instance - 1);
                rtfText.SelectionLength = (Line.Length - Instance + 1);
                rtfText.SelectionColor = Color.Green;
            }
           

            if (Instance == 1)
            {
                // Unlock the update, restore the start and exit 
                rtfText.SelectionStart = SelectionAt;
                rtfText.SelectionLength = 0;
                LockWindowUpdate(0);
                return; // TODO: might not be correct. Was : Exit Sub 
            }
        

            // Loop through all the Keywords 
            while (i < Words.Length)
            {

                // See if the word is in the Line 
                Instance = Line.IndexOf(Words[i].Word) + 1;

                // If the lines contains the word, color it 
                if (Instance != 0)
                {
                    rtfText.SelectionStart = (lStart + Instance - 1);
                    rtfText.SelectionLength = Words[i].Word.Length;
                    rtfText.SelectionColor = Words[i].Color;
                }

                i += 1;
            }
           

            // Restore the selectionstart 
            rtfText.SelectionStart = SelectionAt;
            rtfText.SelectionLength = 0;

            // Unlock the update 
            LockWindowUpdate(0);
        }



qualcuno mi può aiutare??? se ne avete bisogno vi posto tutto il progetto!!!
Grazie a tutti quelli che mi aiuteranno!
Ultima modifica effettuata da Il Totem 30/07/10 7:34
aaa
30/07/10 7:38
Il Totem
Certo, l'hai creato e non sai nemmeno come funziona... Quel codice è copiato da codeguru.com. E' una variante, o la versione originale, di questo:
pietschsoft.com/Blog/…
Che è proprio quello che utilizzo sul mio sito per esemplificare il syntax highlightning.

Detto ciò, mi sembra abbastanza ovvio che il problema sia qui:
// See if the word is in the Line 
Instance = Line.IndexOf(Words[i].Word) + 1;

// If the lines contains the word, color it 
if (Instance != 0)
{
   rtfText.SelectionStart = (lStart + Instance - 1);
   rtfText.SelectionLength = Words[i].Word.Length;
   rtfText.SelectionColor = Words[i].Color;
}

i += 1;

Infatti io vedo solo un if e non un ciclo, come sarebbe utile fare se ci si aspettasse la stessa parola più volte nella stessa linea.
aaa
30/07/10 15:13
TheEngi
No... questo codice non l'ho copiato da quel sito... io l'ho creato basandomi su una guida passatami da un mio amico... nella quale, per ogni passaggio, veniva inserito il codice migliore da usare... io poi ho apportato delle modifiche...

Come dovrei sistemare quel frammento di codice... che tipo di ciclo devo usare secondo te?
aaa
30/07/10 20:06
Gianluca87
Postato originariamente da TheEngi:

No... questo codice non l'ho copiato da quel sito... io l'ho creato basandomi su una guida passatami da un mio amico...

aggiungerei...."nel lontano 1968 quando ancora Billy era uno sconosciuto e Steve ci dava con l'lsd...."
Postato originariamente da TheEngi:
nella quale, per ogni passaggio, veniva inserito il codice migliore da usare... io poi ho apportato delle modifiche...

e quì invece aggiungerei...."senza avere la minima idea di quello che sto facendo..."

Postato originariamente da TheEngi:
Come dovrei sistemare quel frammento di codice... che tipo di ciclo devo usare secondo te?

la risposta E' TRE!
treciclo....
A CASA!!!!!

Scherzi a parte...non prendiamoci in giro... il codice è praticamente identico...
lo hai copiato e ci hai smanettato sopra...

Le altre ipotesi sono :

Il tuo "amico" l'ha copiato a sua volta:
Conclusione : Come accade con gli antichi testi e le parabole...passando di mano in mano perdono il loro significato, e per ogno passaggio perdono di comprensione e utilità...

Stai reinventando la ruota :
Ti è venuta un idea...ma qualcuno ci ha già pensato, sicuramente la ruota + rotonda non riesci a farla senza aggiungere altri problemi...

Hai copiato il codice:
Stai cercando quacuno che te lo faccia funzionare dato che l'esempio che hai copiato non è funzionate o ti manca qualcosa per comprendere come utilizzarlo ...
aaa
31/07/10 7:32
Il Totem
Io mi riferivo a questo post in particolare:
codeguru.com/forum/…
E tu scrivi anche i commenti in inglese, proprio uguali a quelli di quel post.

Comunque, si risolve usando il Do Loop (fino a che esiste la parola da cercare nella riga corrente).
aaa
31/07/10 10:05
Denis442
Beh se Il_Totem ha detto
Infatti io vedo solo un if e non un ciclo, come sarebbe utile fare se ci si aspettasse la stessa parola più volte nella stessa linea.
si presume che dovresti creare un ciclo while
aaa