I rewrote your project to use MVC.
The main project file:
var Model: TModel; Controller: TController; begin Application.Initialize; Application.CreateForm(TMainForm, MainForm); Model := TModel.Create; Controller := TController.Create(Model, MainForm); Application.Run; Controller.Free; Model.Free; end.
Model:
TModel = class(TSubject) private FData: TStrings; public constructor Create; destructor Destroy(); override; procedure AddLine(AText: string); property Data: TStrings read FData;
Controller:
TController = class(TObserver) private FModel: TModel; FView: TMainForm; public constructor Create(const AModel: TModel; AView: TMainForm); destructor Destroy(); override; procedure ButtonClick(Sender: TObject); procedure Refresh(ASubject: TSubject); override; end;
The main form works as a view, I deleted everything from it.
The controller is registered as an observer and performs all the logic:
constructor TController.Create(const AModel: TModel; AView: TMainForm); begin inherited Create(); FModel := AModel; FView := AView; FModel.Register(Self); FView.Button1.OnClick := ButtonClick; FView.Button2.OnClick := ButtonClick; FView.Button3.OnClick := ButtonClick; end; destructor TController.Destroy; begin FModel.UnRegister(Self); FView.Button1.OnClick := nil; FView.Button2.OnClick := nil; FView.Button3.OnClick := nil; inherited; end; procedure TController.Refresh(ASubject: TSubject); begin FView.ListBox1.Items.BeginUpdate; try FView.ListBox1.Items.Assign(FModel.Data); finally FView.ListBox1.Items.EndUpdate; end; end; procedure TController.ButtonClick(Sender: TObject); begin if Sender = FView.Button1 then begin FModel.AddLine('Hello'); end else if Sender = FView.Button2 then begin FModel.AddLine('Hello World!'); end else if Sender = FView.Button3 then begin FModel.AddLine(DateToStr(Now)); end end;
I changed the View โ Controller attitude a bit, but you should get a general idea :).
- The controller has links to View and Model.
- The View knows nothing about the model.
- The model does not know anything from the view.
PS: diagram for MVC pattern (dashed lines represent Observer / Subject relationships):

source share