I have a TPanel. When I change its color and caption, I trigger repaint via
TPanel.Repaint.
Changing a panel's color (or caption) triggers repainting. No additional manually added triggers are needed.
Is your application multithreaded?
If not, as winni states above, an Application.ProcessMessages call may be needed to allow the OS breathing time to respond to the paint messages.
If you want to "do something" whenever you change the panel's color or caption, invoke your own DoSomething procedure at that point. Don't make DoSomething depend on paint messages, which are the OS's responsibility and except in very rare circumstances should be completely ignored.
Otherwise you will quickly discover you are making endless recursive calls to Paint, and you will lock up your application.