Problem beim Färben von Schlüsselwörtern
-
Hallo,
ich habe ein fertiges Programm Syntax Colorizer, das nach vorgegebenen Schlüsselwörtern in einer Textdatei sucht u. diese nach belieben einfärbt.
Mein Problem ist folgendes: Sobald unmittelbar hinter dem Schlüsselwort ein Kommentaranfang folgt, so wird dieser nicht erkannt.Erst nach einem Leerzeichen zwischen Schlüsselwort und Kommentaranfang funktioniert es.
Hat jemand einen Idee woran dies liegen kann?
Vielen Dank schonmal!!
-
Hat niemand eine Idee???? :xmas2:
-
Ich würde einfach sagen Du suchst falsch
Und da Du nicht gesagt hast, wie Du suchst, kann ich Dir auch nicht helfen...
-
Also gut, Du wolltest die Suchfunktion haben, hier hast Du sie:
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++; }
-
Kann mir noch jemand weiterhelfen?
-
Schonmal überlegt eine RichEditfeld in Zusammenhang mit CString-Objekten zu benutzen? (pCtrl scheint wohl ein RichEdit zu sein, hm?)
Dann die Funktion CString::Find benutzen?!
Ist vermutlich wesentlich einfacher. Liest den Text Zeile für Zeile aus und schaust nach den Keywords.So finde ich deinen Code momentan nicht überschaubar. Schreib vielleicht noch ein paar Kommentare dran.
-
Beispiel
position = contents.Find("//"); // contents ist ein CString // absPos ist die aktuelle Postion im RichEdit-Feld if (position != -1 && !onlyComment) { cf.crTextColor = RGB(0,150,0); pDoc->m_pRichEdit->SetSel(absPos+position,absPos+contents.GetLength()); pDoc->m_pRichEdit->SetSelectionCharFormat(cf); }
Hier färbt er mir ab "//" alles grün
-
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 einemLPTSTR 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?