Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Syntax Highlight C#.Net (Problema ripetizione Parole)
Forum - C# / VB.NET - Syntax Highlight C#.Net (Problema ripetizione Parole)

Avatar
TheEngi (Ex-Member)
Pro


Messaggi: 145
Iscritto: 30/08/2009

Segnala al moderatore
Postato alle 22:06
Giovedì, 29/07/2010
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:

Codice sorgente - presumibilmente C++

  1. public void ColorVisibleLines(RichTextBox rtfText)
  2.         {
  3.             int FirstLine = FirstVisibleLine();
  4.             int LastLine = LastVisibleLine();
  5.             int FirstVisibleChar;
  6.             int i = FirstLine;
  7.  
  8.             if ((FirstLine == 0) & (LastLine == 0))
  9.             {
  10.                                 return;  
  11.             }
  12.             else
  13.             {
  14.                 while (i < LastLine)
  15.                 {
  16.                     FirstVisibleChar = GetCharFromLineIndex(FirstLine);
  17.                     ColorLineNumber(rtfText, FirstLine, FirstVisibleChar);
  18.                     FirstLine += 1;
  19.                     i += 1;
  20.                 }
  21.                
  22.             }
  23.         }
  24.  
  25.         public int FirstVisibleLine()
  26.         {
  27.             return SendMessage(rtfText.Handle.ToInt32(), (int)EditMessages.GetFirstVisibleLine, 0, 0);
  28.         }
  29.  
  30.         public int GetCharFromLineIndex(int LineIndex)
  31.         {
  32.             return SendMessage(rtfText.Handle.ToInt32(), (int)EditMessages.LineIndex, LineIndex, 0);
  33.         }
  34.  
  35.         public int LastVisibleLine()
  36.         {
  37.             int LastLine = FirstVisibleLine() + (rtfText.Height / rtfText.Font.Height);
  38.             if (LastLine > rtfText.Lines.Length | LastLine == 0)
  39.             {
  40.                 LastLine = rtfText.Lines.Length;
  41.             }
  42.             return LastLine;
  43.         }
  44.  
  45.         public void ColorRtb(RichTextBox rtftext)
  46.         {
  47.             int FirstVisibleChar;
  48.             int i = 0;
  49.  
  50.             while (i < rtftext.Lines.Length)
  51.             {
  52.                 FirstVisibleChar = GetCharFromLineIndex(i);
  53.                 ColorLineNumber(rtftext, i, FirstVisibleChar);
  54.                 i += 1;
  55.             }
  56.         }
  57.  
  58.         public void ColorLineNumber(RichTextBox rtfText, int LineIndex, int lStart)
  59.         {
  60.             string Line = rtfText.Lines[LineIndex].ToLower();
  61.             int i = 0;
  62.             int Instance;
  63.             int SelectionAt = rtfText.SelectionStart;
  64.  
  65.             // Lock the update
  66.             LockWindowUpdate(rtfText.Handle.ToInt32());
  67.  
  68.             // Color the line black to remove any previous coloring
  69.             rtfText.SelectionStart = lStart;
  70.             rtfText.SelectionLength = Line.Length;
  71.             rtfText.SelectionColor = Color.Black;
  72.  
  73.             // Find any comments
  74.  
  75.             Instance = Line.IndexOf(";") + 1;
  76.  
  77.             // If there are comments, color them
  78.             if (Instance != 0)
  79.             {
  80.                 rtfText.SelectionStart = (lStart + Instance - 1);
  81.                 rtfText.SelectionLength = (Line.Length - Instance + 1);
  82.                 rtfText.SelectionColor = Color.Green;
  83.             }
  84.            
  85.  
  86.             if (Instance == 1)
  87.             {
  88.                 // Unlock the update, restore the start and exit
  89.                 rtfText.SelectionStart = SelectionAt;
  90.                 rtfText.SelectionLength = 0;
  91.                 LockWindowUpdate(0);
  92.                 return; // TODO: might not be correct. Was : Exit Sub
  93.             }
  94.        
  95.  
  96.             // Loop through all the Keywords
  97.             while (i < Words.Length)
  98.             {
  99.  
  100.                 // See if the word is in the Line
  101.                 Instance = Line.IndexOf(Words[i].Word) + 1;
  102.  
  103.                 // If the lines contains the word, color it
  104.                 if (Instance != 0)
  105.                 {
  106.                     rtfText.SelectionStart = (lStart + Instance - 1);
  107.                     rtfText.SelectionLength = Words[i].Word.Length;
  108.                     rtfText.SelectionColor = Words[i].Color;
  109.                 }
  110.  
  111.                 i += 1;
  112.             }
  113.            
  114.  
  115.             // Restore the selectionstart
  116.             rtfText.SelectionStart = SelectionAt;
  117.             rtfText.SelectionLength = 0;
  118.  
  119.             // Unlock the update
  120.             LockWindowUpdate(0);
  121.         }



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 il 30/07/2010 alle 9:34
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:38
Venerdì, 30/07/2010
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:
http://pietschsoft.com/Blog/Post.aspx?PostID=491
Che è proprio quello che utilizzo sul mio sito per esemplificare il syntax highlightning.

Detto ciò, mi sembra abbastanza ovvio che il problema sia qui:
Codice sorgente - presumibilmente Delphi

  1. // See if the word is in the Line
  2. Instance = Line.IndexOf(Words[i].Word) + 1;
  3.  
  4. // If the lines contains the word, color it
  5. if (Instance != 0)
  6. {
  7.    rtfText.SelectionStart = (lStart + Instance - 1);
  8.    rtfText.SelectionLength = Words[i].Word.Length;
  9.    rtfText.SelectionColor = Words[i].Color;
  10. }
  11.  
  12. 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.

PM Quote
Avatar
TheEngi (Ex-Member)
Pro


Messaggi: 145
Iscritto: 30/08/2009

Segnala al moderatore
Postato alle 17:13
Venerdì, 30/07/2010
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?

PM Quote
Avatar
Gianluca87 (Ex-Member)
Expert


Messaggi: 300
Iscritto: 16/11/2008

Segnala al moderatore
Postato alle 22:06
Venerdì, 30/07/2010
Testo quotato

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...."
Testo quotato

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..."

Testo quotato

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 ...

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:32
Sabato, 31/07/2010
Io mi riferivo a questo post in particolare:
http://www.codeguru.com/forum/showthread.php?t=490597
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).

PM Quote
Avatar
Denis442 (Normal User)
Rookie


Messaggi: 60
Iscritto: 22/09/2009

Segnala al moderatore
Postato alle 12:05
Sabato, 31/07/2010
Beh se Il_Totem ha detto
Codice sorgente - presumibilmente C# / VB.NET

  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.

si presume che dovresti creare un ciclo while

PM Quote