You might want to take a look at zur MVP pattern:
https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenterBasically you Hey to model your system in an abstract Model. Like if you have a chess game, you have a unit "game" which has types and functions to store, manage and modify the state of the board pieces and other game state (whos turn it is, if a castling can be performed etc)
Then your form class is in the mvp model the presenter, it just reacts to the user inputs and "tells" the model to perform the moves. Note that all the logic if the move is valid or not is in the model, so if the user tries an invalid move the model tells the presenter that it cannot be performed and no state has been changed
Lastly the view is basically the lcl form managed by the widgetset so the connection between presenter and view is simply modifying the parameters of the lcl classes