Zwei Uhren, objektorientiert, Version 2
Gruppe: mk  
Pflichtenheft
Aufbauend auf der Museumsuhr 
Uhr 1 soll in einem (oder
mehreren) zusätzlichen Formularen die zentrale Uhr gesteuert und ausgelesen werden. So
soll etwa die zentrale Uhr von Formular 1 aus gesetzt und von Formular 2 aus ausgelesen
werden. Es ist weiterhin nicht erforderlich, dass die Uhr läuft. Die Struktur der
Anwendung soll in Package-Diagrammen erläutert werden. Der Umgang mit mehreren Formularen
in Delphi soll geübt und dargestellt werden.
Prototyp
Objektorientierte Analyse
Die benötigten Klassen und Objekte sollen ähnlich wie in 
Uhr 1 festgelegt beibehalten werden.   Statt fUhr1 soll hier die Fachkonzept-Unit
mTUhr2 selbst für die Erzeugung und Vernichtung des zentralen Uhr-Objekts oUhr
verantwortlich gemacht werden. Im Package-Diagramm sieht das dann so aus:
Objektorientiertes Design
Zum Umgang mit mehreren Units gilt natürlich das in 
Version 1
 Gesagte weiterhin.
Wie kann eine Unit ein Objekt zum Gebrauch anbieten?
Zunächst ist eine Referenzvariable im Interface-Teil zu deklarieren.
var
  oUhr : TUhr; // Unit stellt Referenzvariable zur Verfügung
 
 | 
Hinter dem Schlüsselwort 
initialization steht der Programmcode, der beim Aufruf der
Unit ausgeführt wird. Hier läßt sich die Objekterzeugung unterbringen.
initialization
  oUhr := TUhr.create;  // Unit kümmert sich um die Erzeugung
 
 | 
Hinter dem Schlüsselwort 
finalization steht der Programmcode, der beim Beenden der
Unit ausgeführt wird. Hier läßt sich die Objektvernichtung unterbringen.
finalization
  oUhr.free;            // Unit kümmert sich um die Vernichtung
 
 | 
Durch diese Architektur müssen sich die GUI-Units nicht um das Objekt oUhr kümmern, sondern
 sie brauchen es nur zu benutzen. Im folgenden Quelltext wird daher auch nur uUhr1 angegeben,
 uUhr2 sieht bis auf einen anderen Namen für das Formular genauso aus.
unit uUhr1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,mTUhr2;
type
  TfUhr1 = class(TForm)
    eH: TEdit;
    lDoppelpunkt: TLabel;
    eMin: TEdit;
    bSetzen: TButton;
    bAnfragen: TButton;
    lAusgabe: TLabel;
    procedure bSetzenClick(Sender: TObject);
    procedure bAnfragenClick(Sender: TObject);
  private
  public
    { Public-Deklarationen }
  end;
var
  fUhr1: TfUhr1;
implementation
{$R *.DFM}
procedure TfUhr2.bSetzenClick(Sender: TObject);
var
  h,min : byte;
begin
  h := StrToInt(eH.text); min := StrToInt(eMin.text);
  oUhr.SetH(h); oUhr.SetMin(min);
end;
procedure TfUhr2.bAnfragenClick(Sender: TObject);
var
  h,min   : byte;
  sh,smin : string;
begin
  h := oUhr.GetH; min := oUhr.GetMin;
  Str(h:2,sh); Str(min:2,smin);
  if sh[1]=' ' then sh[1] := '0'; if smin[1]=' ' then smin[1] := '0';
  lAusgabe.caption := sh+':'+smin;
end;
end.
 | 
Hier folgt der ganze Quelltext der Fachkonzept-Unit mTUhr2.pas
UNIT mTUhr2;
interface
type
   TUhr = CLASS
     // Attribute
     private
        FH : byte;
        FMin : byte;
     // Methoden
     public
        procedure SetH(h : byte);
        procedure SetMin(min : byte);
        function GetH : byte;
        function GetMin : byte;
   end;
var
  oUhr : TUhr; // Unit stellt Referenzvariable zur Verfügung
implementation
//+---------------------------------------------------------------------
//|         TUhr: Methodendefinition
//+---------------------------------------------------------------------
//-------- SetH (public) -----------------------------------------------
procedure TUhr.SetH(h : byte);
begin
  FH := h;
end;
//-------- SetMin (public) ---------------------------------------------
procedure TUhr.SetMin(min : byte);
begin
  FMin := min;
end;
//-------- GetH (public) -----------------------------------------------
function TUhr.GetH : byte;
begin
  result := FH;
end;
//-------- GetMin (public) ---------------------------------------------
function TUhr.GetMin : byte;
begin
  result := FMin;
end;
initialization
  oUhr := TUhr.create;  // Unit kümmert sich um die Erzeugung
finalization
  oUhr.free;            // Unit kümmert sich um die Vernichtung
end.
 | 
Test
Tests ergaben, dass mit dem Programm Setzen und Auslesen bestimmter Zeiten wechselseitig
in beliebiger Kombination der Controls und Views möglich ist.