Hej,
Jeg har et problem med min regexp. Jeg har lavet en funktion, der via regexp søger efter nogle ord i en edit-kontrol, hvorefter den går hen til det ord, markerer det, farver det blåt, og sætter markeringen tilbage, som den var før. Men der er (så vidt jeg kan se, har ikke fundet flere) 2 problemer:
1: Det virker kun, hvis ordet bliver skrevet som det absolut første i edit-kontrollen. Hvis du laver fx et E foran ordet, bliver E'et farvet, og det gør ordet også, med undtagen af et enkelt tegn. Hvis du skriver 2 E'er, bliver begge E'er farvet, men to tegn i ordet forbliver 'ufarvede' osv.
2: Funktionen finder kun den første forekomst af ordet i teksten. Den skal finde alle.
Funktionen:
#include <richedit.h>
#include <sstream>
#include "def.h"
#include "regexp.cpp"
CHARFORMAT cf;
char *KeyWords [] =
{
"echo",
"print"
};
using std::stringstream;
void SetupCF ()
{
memset (&cf, 0, sizeof (CHARFORMAT));
cf.cbSize = sizeof (CHARFORMAT);
cf.dwMask = CFM_COLOR;
}
void SetForeColor (HWND Window, COLORREF Color)
{
cf.crTextColor = Color;
SendMessage (Window, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf);
}
void FindKeyWords (HWND Window, HWND Edit)
{
static reg_exp_class RegExp;
static char szBuffer [100000];
static int Index, Length, Start, End;
static const char *p, *Word;
static stringstream SS;
for (int i = 0; i < sizeof (KeyWords) / sizeof (KeyWords [0]); i++)
{
Word = KeyWords [i];
if (!RegExp.compile (Word))
{
MessageBox (Window, Word, "Kunne ikke søges:", MB_OK);
return;
}
GetDlgItemText (Window, IDD_EDIT, szBuffer, sizeof (szBuffer));
if ((p = RegExp.find (szBuffer, &Length)) != 0)
{
SS << p;
SS >> Index;
SendMessage (Edit, EM_GETSEL, (WPARAM) &Start, (LPARAM) &End);
SendMessage (Edit, EM_SETSEL, Index, Length);
SetForeColor (Edit, RGB (0, 0, 255));
SendMessage (Edit, EM_SETSEL, Start, End);
SetForeColor (Edit, RGB (0, 0, 0));
}
}
}
Det er selvfølgelig FindKeyWords() I skal kigge på.