Dave, the Form's BeforeUpdate and AfterUpdate are not interchangeable. The BeforeUpdate runs BEFORE the record is saved and the AfterUpdate runs AFTER the record is saved. You can't cancel the save in the AfterUpdate, it is too late. The record is already saved. Plus, if you dirty the record in the Form's AfterUpdate event, you put Access into a loop. Earlier versions of Access would actually lock up but newer versions seem to recognize the situation when the stack gets too deep and works itself out without freezing.
In general, if the edit or calculation involves a SINGLE field and nulls are allowed, control level events can be used and will give the user more immediate feedback. However, if you need to compare two fields such as to validate a date range or prevent some field from being null if another field has a value, you really must use the Form's BeforeUpdate event. If you try to put the code into individual control events, you will need it in several places and you will still miss nulls if the user never actuall tabs into the control. The BeforeUpdate event is much cleaner and neater.
As to the Dirty event, you would never use it for something like this. As Dave mentioned, it only runs ONCE for the entire form and it runs when the first character is typed so you simply can't use it as a place for validation code.
I would use it to check credentials. If some users were allowed to update and others were not, I would verify that in the Dirty event. This keeps you from having to run code in the current event to lock a form for some users/conditions and unlock it for others. I know the point is subtle but having worked in environments that had to process thousands of transactions a second, I am quite sensitive to efficiencies like this. Since most people will not attempt to edit data if they know they are not supposed to, you don't need to run the code to lock everything for every record. All you need to do is to intercept the change attempt and stop it. So instead of running the code a thousand times, you run it once.
"Immediately" is the trigger word in the question. What does that mean? Is it as soon as a single character is typed? (Dirty) Is it as soon as a single field is entered? (control's BeforeUpdate), Is it as soon as all the necessary fields are entered? (form's BeforeUpdate)