Schonmal ausprobiert es bei einem InvalidateRect() zu belassen und danach nicht ein repaint aufzurufen? Repaint ist eine Kapslung von Invalidate + UpdateWindow() und somit sogar ein doppelter Code.
Auch verhindern das WM_SETDRAW das Zeichnen, aber alle zu zeichnenden Bereiche werden gemerkt und akkumuliert. Von daher sollte das zurücknehmen von WM_SETDRAW ein neuzeichnen auslöen ohne dass du vorher nochmal die einzelnen Elemente invalidieren musst.
Falls nicht, dann würde folgendes reichen:
Delphi-Quellcode:
//*** enable und force redrawing
SendMessage(pnBDMBaseForm.Handle, WM_SETREDRAW, Integer(TRUE), 0);
InvalidateRect(pnBDMBaseForm.Handle, nil, false);
//*** force update of controls:
UpdateWindow(pnBDMBaseForm.Handle);