I would recommend optimizing the ondrawitem code as your best option for reducing flicker. Consider only changing the font color instead of font color and the brush color. Only fillrect the part that changes instead of the whole rect area.
Also, look at how you are implementing the rule you mentioned. If you are parsing out values from each item's string, make sure that you only are parsing the values needed for the rule. Consider changing the layout of the unparsed string so that the rule's values are easier to parse out.
These kinds of changes will always help smooth out the display. A few other ideas come to mind, but I don't know if they will help or not...
Once you figured out what style item is to be displayed, check the current values of font.color and brush.color. Only change them if they are not already the value you are seeking. This might speed things up a bit.
Also, every strings property (such has listbox.items) has an binary value associated with each string in the items property. I think it is called itemvalues in Delphi but I don't remember right now. You might want to preload these binary values with the "style" information prior to showing the listbox. That might cut out the parsing and rule calculating delays and make the display even better.
I hope some of this helped.
Peace,
Colt.