The thing about Frames is, they are very useful to split up large Forms into smaller subforms, and this is good. The first lesson of software engineering is to split up tasks, instead of writing one giant block of code, split it up into function. Instead of having one giant file, split it up into units. So why not doing the same for the Form? If I write an e-mail client, I have a section with my folders, a section with all the mails within that folder, a section where te email is previewed, which is subdivided into a header and a body. Why should anyone want to put that all in one giant form instead of having small files for each section individually?
But the issue is, that frames, while being very good for doing that, when non dynamically created, are very bad at doing that. You want to put then together in your main form at design time, so you can see how it looks. But if you do that you run in all kinds of problems. E.g. you want to change something but forget that you need to go into the frames LFM for that, so you change it in the main form, and as a result you now have a disconnect with some changes in the frame and some within the main form, which is terrible for consistency and mainatainability.
On the other hand, if you change things within the frame, after the frame has been applied, anything can happen. Just create a project, add a frame with a button, add that frame to the main form, then delete the button from the frame. Now hell breaks loose, first if you want to run it you get a runtime exception because it can't find class TButton, then when you fix that, and you run again the button you deleted is still there. So changes aren't kept? No if you add another button to the frame, it is added to the main form at runtime. So additions are made to the main form, but deletions not? The worst thing that can happen to you when writing a program is inconsistencies in behavior. You can deal with bad behavior a lot of the times, but inconsistent behavior can not be handled predictably.
Also even though some changes are taken over, the WYSIWYG editor does not update, making it less WYSIWYG and more a torture chamber for anyone trying to understand what is happening.
So once you put a frame on a form, you shouldn't touch it anymore, but taking the comparison to units, this seems ridiculus, imagine you couldn't change a unit after adding it to another units uses clause. This would make units useless.
With frames it's not that bad because you can dynamically create them, but then you loose the ability to look at your form in whole at design time, without having to compile and run the application.
So while they are still incredibly useful, they are not nearly as useful as they could be. The only real alternative I've found so far is to create a package where you create custom controls, which you can then design and use like frames, but thats so much more cumbersome than it would be if frames would be just a bit less bad