I have encoured problem like this with one application, I start doing the following:
- Define main classes for most general logic in the code.
- In each form, move the code that process the business logic inside the events as function / procedures in that form.
- Then Move these functions/procedures to those classes as static methods.
- Finally make only the needed code inside forms like validation UI, and calls to the classes.
- For the global variables try to omit as much as you can, and just pass the values as parameters to the methods.
I used static methods, because it's easier for you to remove the code from events and just call them without requiring to Create/Free object for each operation. The original design was not designed to separate the forms from business logic code.
The final application was not full OO, but it least it was easier to test the methods without requiring interacting with the forms and events like before.
Sometimes you feel if you redesign the application from scratch it will be easier than to made changes to make it real OO design.