HSG

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

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.