MVC durch Polling
Das MVC-Konzept verlangt, dass die Modell-Klassen die GUI-Klassen (view/controller) nicht kennen. Nichtsdestotrotz soll eine Änderung im Modell sich auf die Views auswirken. Die einfachste Art, das zu bewirken, ist das regelmäßige Abfragen (
Polling) des Modells durch die Views. Dadurch, dass sich das Modell nicht selbstständig meldet, kann natürlich eine Änderung unentdeckt bleiben.
In dem kleinen Demo-Projekt wird das Zahl-Objekt a nach dem "Bauplan" (Klasse)
TZahl im
Modell (in der Unit uModel) durch einen
Controller (bestehend aus der Edit-Komponente e_ein und dem Button b_setze) beschrieben. Nach dem Beschreiben ist eventuell eine Änderung eingetreten, so dass der Inhalt des Objekts ausgelesen wird und in einem
View (bestehend aus dem Label l_aus) angezeigt wird.
Zur Benutzung des Objekts a sind die Schritte
- Einbindung der Unit uModel (damit die Klasse TZahl verfügbar wird)
- Deklaration einer Referenz-Variablen (hier a : TZahl)
- Aufruf des Konstruktors (Klassenmethode, reserviert und initialisiert Speicher,
stellt Zeiger auf das Objekt zur Verfügung, hier: Zeiger in a)
- Nutzung des Objekts durch Botschaften (SetZahl, GetZahl,...)
- Aufruf des Destruktors (Objektmethode, reservierter Speicherplatz wird
freigegeben)
erforderlich.
Bitte beachten, wie in der Unit uGUI die Referenz-Variablen GUI und in TGUI a deklariert werden, GUI automatisch durch das Delphi-System, a von Hand. Für GUI (und für die Unterobjekte e_ein, b_setze, l_aus usw.) wird anscheinend automatisch Konstruktor und Destruktor aufgefrufen, für a muss das von Hand gemacht werden.
Es folgt der Delphi-Quelltext der beiden Units:
unit uModel; { MVC durch Polling, mk }
interface
type
TZahl = class(TObject)
private
Fz : integer;
public
procedure setZahl(x : integer);
function getZahl : integer;
end;
implementation
procedure TZahl.setZahl(x : integer);
begin
Fz := x;
end;
function TZahl.GetZahl : integer;
begin
result := Fz;
end;
end.
unit uMvc1; { MVC durch Polling, mk }
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, uModel; { 1. Einbindung der Model-Unit }
type
TGUI = class(TForm)
e_ein: TEdit; l_controller: TLabel; b_setze: TButton;
l_view1: TLabel; l_aus: TLabel;
procedure b_setzeClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
a : TZahl; { 2. Deklaration der Referenz-Variablen }
end;
var
GUI : TGUI;
implementation
{$R *.DFM}
procedure TGUI.FormCreate(Sender: TObject);
begin
a := TZahl.Create; { 3. Erzeugung des Model-Objekts }
end;
procedure TGUI.b_setzeClick(Sender: TObject);
var
z : integer;
begin
z := StrToInt(e_ein.text);
a.SetZahl(z); { 4. Schreibzugriff auf Objekt }
z := a.getZahl; { 5. Lesezugriff auf Objekt, Polling }
l_aus.caption := IntToStr(z); { 6. Aktualisieren des Views }
end;
procedure TGUI.FormDestroy(Sender: TObject);
begin
a.Free; { 7. Freigeben des belegten Speichers }
end;
initialization
// a := TZahl.Create; { Alternative für Objekterzeugung }
end.