Zwei Uhren, objektorientiert, Version 1
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 bewusst weitgehend wie in
Uhr 1 festgelegt beibehalten werden. Einige kleine Korrekturen sind jedoch unumgänglich. So muss z.B. das Objekt oUhr in fUhr1 von
private auf
public gesetzt werden, sonst hätte fUhr2 keinen Zugriff.
Objektorientiertes Design
Beim Umgang mit mehreren Units in einem Projekt ist einige Umsicht geboten. So kann problemlos mit Datei/Neu eine Unit oder auch ein Formular mit Unit dem Projekt hinzugefügt werden. Der Speicherort wird aber im Allgemeinen nicht unbedingt der Projekt-Ordner sein, erst ein explizites Speichern unter .. könnte das bewirken. Das Alles kann man schön an der Projekt-Datei *.dpr verfolgen, die aus diesem Grund regelmäßig inspiziert werden sollte. Mit Hilfe der Buttons
kann ebenfalls eine Kontrolle über die Projekt-Dateien ausgeübt werden. So wird man im vorliegenden Fall etwa Unit *.pas und Formularangaben *.dfm für die zweite Uhren-VC (View/Control) durch Kopieren erzeugen und dann in das Projekt einfügen. Hierbei darf natürlich nicht vergessen werden, dem neuen Formularobjekt einen anderen Namen, z.B. fUhr2 zu geben. Außerdem muss die Eigenschaft
Visible auf true gesetzt werden, sonst sieht man das Formular nicht.
Das folgende Package-Diagramm wurde mit Dia erzeugt und zeigt die Abhängigkeiten.
Es folgt der Delphi-Quellcode, wobei das Fachkonzept mit der Klasse TUhr1 in der Unit "mTUhr1.pas", die Benutzeroberflächen in den Units "uUhr1.pas" und "uUhr2.pas" zu finden sind. Man sieht wie oUhr in uUhr1 erzeugt und vernichtet wird.
unit uUhr1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,mTUhr;
type
TfUhr1 = class(TForm)
eH: TEdit;
lDoppelpunkt: TLabel;
eMin: TEdit;
bSetzen: TButton;
bAnfragen: TButton;
lAusgabe: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure bSetzenClick(Sender: TObject);
procedure bAnfragenClick(Sender: TObject);
private
public
oUhr : TUhr;
end;
var
fUhr1: TfUhr1;
implementation
{$R *.DFM}
procedure TfUhr1.FormCreate(Sender: TObject);
begin
oUhr := TUhr.Create;
end;
procedure TfUhr1.FormDestroy(Sender: TObject);
begin
oUhr.Free;
end;
procedure TfUhr1.bSetzenClick(Sender: TObject);
var
h,min : byte;
begin
h := StrToInt(eH.text); min := StrToInt(eMin.text);
oUhr.SetH(h); oUhr.SetMin(min);
end;
procedure TfUhr1.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.
|
Im folgenden Quelltext zu uUhr2 fehlt natürlich die Erzeugung und Vernichtung von oUhr, das wird ja alles in uUhr1 gemacht. Weitere Änderungen zu uUhr1 sind rot hervorgehoben.
unit uUhr2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,uUhr1;
type
TfUhr2 = class(TForm)
eH: TEdit;
lDoppelpunkt: TLabel;
eMin: TEdit;
bSetzen: TButton;
bAnfragen: TButton;
lAusgabe: TLabel;
procedure bSetzenClick(Sender: TObject);
procedure bAnfragenClick(Sender: TObject);
private
public
end;
var
fUhr2: TfUhr2;
implementation
{$R *.DFM}
procedure TfUhr2.bSetzenClick(Sender: TObject);
var
h,min : byte;
begin
h := StrToInt(eH.text); min := StrToInt(eMin.text);
fUhr1.oUhr.SetH(h); fUhr1.oUhr.SetMin(min);
end;
procedure TfUhr2.bAnfragenClick(Sender: TObject);
var
h,min : byte;
sh,smin : string;
begin
h := fUhr1.oUhr.GetH; min := fUhr1.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.
|
Test
Tests ergaben, dass mit dem Programm Setzen und Auslesen bestimmter Zeiten wechselseitig in beliebiger Kombination der Controls und Views möglich ist.