Nicht-modale UI-Logik

Erste Erfahrungen mit einem nicht-modalen Programmierstil für die UI-Logik zeigen, dass man sich den Kontroll-Fluss für den User so genauer überlegt. Komplexe Abläufe lagert man gar in eine eigene Klasse aus, so dass die Abläufe vererbbar und einfach parametrisierbar werden.

Nicht-modale Programmierung

Nicht-modaler Programmierstil bedeutet, dass man nirgends in Event-Handlern aktiv auf Reaktionen des Anwenders wartet. Stattdessen zerlegt man den Kontrollfluss für den Anwender in einzelne Teile, die durch Reaktionen des Anwenders wiederum als Event-Handler aufgerufen werden.

Ziel der ganzen Übung war, für Atlas ein Modell zu haben, das sowohl für Win32-UIs wie auch für HTTP tauglich ist.

Kurzes Beispiel

Dieses kurze Beispiel zeigt, wie für einen abstrakten Menü-Punkt Beenden

  1. type
  2.   TSmpBeendenMenuView = class(TSmpBeendenIntMenuView)
  3.   private
  4.     procedure FlowEndTask;
  5.     procedure FlowWarnAboutLongWorkHours;
  6.   protected
  7.     procedure DoClick; override;
  8.   end;
  9.  
  10. procedure TSmpBeendenMenuView.DoClick;
  11.   begin
  12.     Task.ConfirmationMessage( 'Atlas 2 Demo wirklich beenden?'
  13.       , miQuestion
  14.       , FlowEndTask
  15.       , FlowWarnAboutLongWorkHours );
  16.   end;

Task.ConfirmationMessage setzt nun ein kleines Fenster auf, dass die Meldung enthält. Dann geht die Kontrolle an den zentralen Event-Loop zurück. Das kann nun aber genauso gut der HTTP-Server sein, der den aktuellen Fenster-Zustand als HTML-Response an den Client liefert.

  1. procedure TSmpBeendenMenuView.FlowEndTask;
  2.   begin
  3.     Task.Free;
  4.   end;
  5.  
  6. procedure TSmpBeendenMenuView.FlowWarnAboutLongWorkHours;
  7.   begin
  8.     Task.ShowMessage( 'Ok, arbeiten Sie aber nicht zu lange!' );
  9.   end;

Modales Beispiel

  1. type
  2.   TSmpBeendenMenuView = class(TSmpBeendenIntMenuView)
  3.   protected
  4.     procedure DoClick; override;
  5.   end;
  6.  
  7. procedure TSmpBeendenMenuView.DoClick;
  8.   begin
  9.     if Confirmed( 'Atlas 2 Demo wirklich beenden?'
  10.       , miQuestion )
  11.     then begin
  12.       Task.Free;
  13.     end else begin
  14.       Task.ShowMessage( 'Ok, arbeiten Sie aber nicht zu lange!' );
  15.     end;
  16.   end;

wobei Confirmed in sich einen modalen Event-Loop birgt (ShowModal in Delphi).