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.