Problem beim Färben von Schlüsselwörtern



  • Paul_C. schrieb:

    position		= contents.Find("//"); // contents ist ein CString
    

    Ups, die Code-Tags sind kaputt. 😃



  • Jep, wie kann das passieren?
    In einem anderen Thread ging das schon auch nicht. 😕



  • Vielen Dank für den Tip!

    Das Problem ist nur, dass ich in einer Textdatei beliebig viele Multiline-Kommentaranfänge({) bzw. Multiline-Kommentarende(}) und Singleline-Kommentaranfänge(!) färben und finden muß. 😞



  • Vielleicht komme ich nachher noch dazu, dir ausführlicher zu helfen.
    Ich habe sowas nämlich auch schon gemacht. Sobald du ein '{' gefunden hast
    setze eine Variable, die dir angibt, ob dieser Kommentar noch weiter geht.
    Wenn du dann die nächste Zeile einliest dann kannst du mit ihrer Hilfe bestimmen, ob du erst nach dem Kommentarende suchen musst.

    Hoffe das ist einigermaßen verständlich. 😉



  • Morgen!
    Vielen Dank für Deine Unterstützung.
    Im benutze ein funktionierendes Programm (Syntax Colorizer) von Code Guru, dass alle vorher genannten Suchfunktionen ausführt.
    Leider wird ein Kommentaranfang unmittelbar nach einem gefärbten Schlüsselwort nicht erkannt.Erst wenn ich ein Leerzeichen einfüge,funktioniert es.
    Die Suchfunktion ist leider zu umfangreich um sie hier zu veröffentlichen. 😞



  • Color schrieb:

    Die Suchfunktion ist leider zu umfangreich um sie hier zu veröffentlichen. 😞

    Hier wurden schon komplette Programme gepostet, weil der Fragesteller unfähig war, den Fehler auch nur einzukreisen. 😃
    Also wird dich schon niemand erschlagen, wenn du einen längeren Code postest. 😉

    Wenn du das von Code Guru hast und es ohne Veränderungen schon nicht klappt, dann gib uns doch den Link, wo du es her hast.

    Ich hatte aber gerade ne kleine Schnapsidee:

    strText.Replace("//", " //");
    

    Aber dann ist es nicht mehr der Originaltext. 😞



  • Das ist eine sehr gute Idee!
    Ich habe den Fensterinhalt in einem

    LPTSTR lpszBuf
    

    abgelegt. Diesen habe ich in einen CString kopiert u. mit dem Replace-Befehl deinen Tip befolgt. Leider lässt sich danach der CString nicht zurück in den LPTSTR konvertieren. Eine Idee?? 😮



  • Color schrieb:

    Das ist eine sehr gute Idee!

    Danke 😃

    Leider lässt sich danach der CString nicht zurück in den LPTSTR konvertieren. Eine Idee?? 😮

    Es steht bestimmt schon 1000 mal hier im Forum - ich weiß es trotzdem wieder nicht. 😞

    Die Suche hat mir das hier gebracht, hilft es?



  • Nach langem Probieren bin ich leider immer noch nicht weitergekommen.
    Das mit der Replace Funktion ist nicht schlecht, allerdings wird dann die Färbung in den Schlüsselwörtern um 2Stellen verschoben.
    Ich poste hier mal die Colorize-Funktion aus meinem Programm. Vielleicht findest
    Du die Ursache für mein Problem. Ich wäre Dir dafür sehr dankbar!!! 😉

    void CSyntaxColorizer::colorize(LPTSTR lpszBuf, CRichEditCtrl *pCtrl, long iOffset /*=0*/)
    {
    	//setup some vars
    	CHARFORMAT2 cf;
    	LPTSTR lpszTemp;
    	long iStart;
    	long x = 0;
    	SKeyword* pskTemp = m_pskKeyword;
    	unsigned char* pTable = m_pTableZero;
    
    	//do the work
    	while(lpszBuf[x])
    	{
    		switch(pTable[lpszBuf[x]])
    		{
    		case DQSTART:
    			pTable = m_pTableOne;
    			iStart = iOffset + x;
    			break;
    		case SQSTART:
    			pTable = m_pTableTwo;
    			iStart = iOffset + x;
    			break;
    		case CMSTART:
    			if(lpszBuf[x+1] == '/')
    			{
    				pTable = m_pTableThree;
    				iStart = iOffset + x;
    				x++;
    			}
    			else if(lpszBuf[x+1] == '*')
    			{
    				pTable = m_pTableFour;
    				iStart = iOffset + x;
    				x++;
    			}
    			else if(lpszBuf[x] == '\'')
    			{
    				pTable = m_pTableThree;
    				iStart = iOffset + x;
    				x++;
    			}
    
    			break;
    		case MLEND:
    			if(lpszBuf[x+1] == '/')
    			{
    				x++;
    				pTable = m_pTableZero;
    				pCtrl->SetSel(iStart,iOffset + x+1);
    				pCtrl->SetSelectionCharFormat(m_cfComment);
    			}
    			break;
    		case SLEND:
    			if(lpszBuf[x-2] != '\n') // line continuation character
    			{
    				pTable = m_pTableZero;
    				pCtrl->SetSel(iStart,iOffset + x+1);
    				pCtrl->SetSelectionCharFormat(m_cfComment);
    			}
    			break;
    		case DQEND:
    			pTable = m_pTableZero;
    			pCtrl->SetSel(iStart,iOffset + x+1);
    			pCtrl->SetSelectionCharFormat(m_cfString);
    			break;
    		case SQEND:
    			if(lpszBuf[x-1] == '\\' && lpszBuf[x+1] == '\'')
    				break;
    			pTable = m_pTableZero;
    			pCtrl->SetSel(iStart,iOffset + x+1);
    			pCtrl->SetSelectionCharFormat(m_cfString);
    			break;
    		case KEYWORD:
    			lpszTemp = lpszBuf+x;
    			while(pskTemp != NULL)
    			{
    				if(pskTemp->keyword[0] == lpszTemp[0])
    				{
    					int x1=0,y1=0;iStart = iOffset + x;
    					while(pskTemp->keyword[x1])
    					{
    						y1 += lpszTemp[x1] ^ pskTemp->keyword[x1];
    						x1++;
    					}
    					if(y1 == 0 && (*(m_pAllowable + (lpszBuf[x-1])) && 
    							*(m_pAllowable + (lpszBuf[x+pskTemp->keylen]))))
    					{
    						if(_stricmp(pskTemp->keyword,"rem") == 0)
    						{
    							pTable = m_pTableThree;
    						}
    						else 
    						{
    							x += pskTemp->keylen;
    							pCtrl->SetSel(iStart,iOffset + x);
    							pCtrl->SetSelectionCharFormat(pskTemp->cf);
    						}
    					}
    				}
    				pskTemp = pskTemp->pNext;
    			}
    			pskTemp = m_pskKeyword;
    			break;
    		case SKIP:;
    		}
    		x++;
    	}
    


  • Das mit der Replace Funktion ist nicht schlecht, allerdings wird dann die Färbung in den Schlüsselwörtern um 2Stellen verschoben.

    Hattest du vielleicht 2 mal // im Teststring?



  • estartu schrieb:

    Hattest du vielleicht 2 mal // im Teststring?

    Was meinst Du damit? In meinem Textfile kommt das Zeichen nicht vor.



  • Schade, denn wenn er zweimal 2 Zeichen durch 3 ersetzt hätte, hätte das die Verschiebung erklärt.

    Die Funktion ist ein bisserl heftig um da mal eben nen Fehler zu finden, sorry da muss ich passen.



  • Trotzdem vielen Dank für Deine Hilfe!

    Vielleicht gibt es ja noch weitere Profis die mir helfen können? 😕


Anmelden zum Antworten