The following is the way I organise my code:

Create an object-oriented set of classes and put each class into its own, separate file (perhaps more than one per file, but that's usually ill-advised except for very small classes).

Next, create a unit that has various global constants, if you're using any. There should be a unit that declares different, common types if required. Use a unit for common utility functions if required.

I create a folder hierarchy - one called "source", and one called "data".

The source folder contains extra folders ("temp" for .dcu files, "utilities" for extra tools like editors you write, and directories for sub-sections (e.g. Input, Sound, Network, etc.)).

I set the .dcu files to be compiled into the temp directory (keeps things a mite cleaner). This is available under Project Options, Directories/Conditionals, "unit output directory". Keeping your .dcus separate makes things much easier.

I keep my code inside the "source" folder. I use the Project Options, Directories/Conditionals, "output directory" to specify that the exe should go into the parent directory ("..\"). This ensures that the exe is easy enough to find and run - it won't have any crap surrounding it.

The "data" folder contains actual game data (levels, graphics, sounds, scripts, etc.). You can create a sub-directory hierarchy here if you want (I do), although the intention is simply to ensure that the data is separate from the source code, which is separate from the main executable.

Make sense?

I'll try to post a better explanation later, and I'll also link to an example project when I get home. It's time for lunch now though