HSG

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

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.