Hace una semana se respondió una pregunta muy similar, aunque aquella solución estaba limitada a una sólo fila. Vamos a ver como se podría hacer para todas las filas.
Utiliza fuente Courier New para la columna "descripcion". Crea una columna calculada "co_truco" (ojo, una 'computed column' en el retrieve, no un 'computed field') con una cadena vacía, de igual tamaño que "descripcion", con el color de fondo transparente, con fuente Courier New, negrita y de color azul.
Sitúa co_truco "encima" de descripcion, de forma que co_truco tape a descripcion, aunque por tener fondo transparente la dejará ver.
Luego, y por código, después del Retrieve(), recorre con un bucle todas las filas devueltas y por cada fila: extrae la descripción de cada fila y establece el valor de co_truco substituyendo por espacios en blanco todo lo que no coincida con la subcadena buscada en la descripción:
FOR ll_Fila = 1 TO ll_TotalFilas
ls_Descripcion = dw.GetItemString(ll_Fila, "descripcion")
ls_Truco = ""
ll_Pos = Pos(ls_Descripcion, ls_Subcadena, 1)
WHILE ll_Pos > 0
ls_Truco += Space(ll_Pos - Len(ls_Truco) ) + ls_Subcadena
ll_Pos = Pos(ls_Descripcion, ls_Subcadena, ll_Pos + Len(ls_Subcadena) )
LOOP
dw.SetItem(ll_Fila, "co_truco", ls_Truco)
NEXT
Espero haberme explicado mejor esta vez.
Saludos, Juan
P.D. El código no está probado, lo he escrito aquí directamente