HSG

Aktuelle Seite: HSG/Fächer/Informatik/Material

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.

GUI zum Projekt
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.