In a recent post on his blog, Joel Spolsky writes that you should not "hide or disable menu items". His alternative is to leave all of the menu options in place, and provide messaging to tell the user why an action can't be completed.
I have to respectfully disagree with his assessment. I think that leaving menu items active all the time is actually harder to use and understand. It requires the user to spearfish through the menu and live in fear of clicking the "wrong" menu item that triggers a warning message. Worse, it actually makes it harder to understand what the various options do if they are always available. Take your typical application Edit menu, for example. Many of these will have Undo and Redo options available. If you leave these active all the time, it can even be confusing before the user tries to click. If you've just opened the application, what would Undo actually undo? If you haven't undone any actions, what would Redo actually redo?
Now don't get me wrong, I don't think that hiding menu options that can't be used is any better. Looking for an item in a menu and not seeing it where you expected it to be undermines your ability to get accustomed to how an application works. It derails your mental schema of how the application works, even if the application's behavior hasn't in fact changed at all.
I think the most reasonable way to handle this is to provide the "disabled menu item" design that almost all applications are already using. This can be augmented by visual aids to indicate why an option is not available. A subscript text to say something like "already at oldest change" under a disabled Undo option, or a subscript that says "nothing is selected" under a disabled Cut option.
But if that is not feasible, I think just leaving menu options disabled in the appropriate context is the best compromise. The confusion of seeing a disabled menu item to me is preferable to the uncertainty of not knowing whether clicking a menu option will actually do something, or just pop up a warning message telling me why I can't do that right now.