is-Logo Zahlenraten -  V. 1.3
         GUI und Fenster   -   Aufgabe und Hinweise

S. Spolwig

[Home | Unterrichtssequenzen]
[Startseite]

GUI-Klasse und Fachklasse verbinden

Das Zusammenspiel der beiden Klassen wird mit 2 GUI-Methoden organisiert:

   DatenAktualisieren und
   FensterAktualisieren.

Diese beiden Methoden tauschen die Botschaften über den jeweils neuesten Stand zwischen den Objekten aus.

Dabei übernimmt Datenaktualisieren alle Benutzereingaben und Fensteraktualisieren alle erforderlichen Anzeigen von Daten und Meldungen.

Der Datenfluss



DatenAktual.
------------>

<------------
FensterAktual.

Für die Implementation sind folgende Schritte erforderlich:
  1. Die Unit uRatespiel in uFenster bekannt machen
    Fügen Sie im Interface bei uses hinter ExtCtrls als zusätzliche Unit ein:  uRatespiel

  2. Das Objekt Ratespiel deklarieren und erzeugen
    -
    Deklarieren Sie zuerst unterhalb var :
      Ratespiel : TRatespiel;

    - Fügen Sie in der Prozedur FormCreate ein:   
      Ratespiel := TRatespiel.Create;


  3. Das Objekt Ratespiel zusammen mit Fenster initialisieren
    Fügen Sie in der Prozedur Init ein:
    Ratespiel.Init;


  4. Prozeduren für den Datentransport zwischen GUI und Fachklasse implementieren
    Deklarieren Sie im Interface-Teil von uFenster die  zwei neuen Prozeduren unter privat:
    DatenAktualisieren und FensterAktualisieren.

    und dann im Implementation-Teil unten die Codierung:
     
    procedure TFensterFrm.DatenAktualisieren;
    // -----------------------------------------------------------------------
    begin
      Ratespiel.SetRatezahl (StrToInt(EingabeEdt.Text));
    end;

    procedure TFensterFrm.FensterAktualisieren;
    // -----------------------------------------------------------------------
    begin
    if Ratespiel.GetStatus = 0
    then MeldePnl.Caption := (' Gratuliere! Richtig geraten! ')
      else
        if Ratespiel.GetStatus = -1
        then MeldePnl.Caption := (' Ratezahl zu niedrig ... ')
        else MeldePnl.Caption := (' Ratezahl zu hoch ... ');
    ZaehlerLbl.Caption:= intToStr(RateSpiel.GetZaehler);
    end;
  1. Die Prozedur RatezahlAnnehmen implementieren
    Wenn der Tip ins Eingabefeld geschrieben ist, wird die Enter-Taste zum 'Abschicken' an das Spielobjekt gedrückt. Damit werden die Daten aktualisiert.
    - EingabeEdt markieren
    - Im Objektinspektor die Registerkarte 'Ereignisse' anklicken
    - OnKeyPress wählen und rechts den Prozedurnamen  RatezahlAnnehmen eintragen
    -
    Die Prozedur implementieren wie unten abgedruckt.

  2. Spiel starten und gewinnen! :)

Kompletter Quellcode der Version 1.3 - Ergänzungen farbig.
 

unit uFensterFrm;
// ***********************************************************************
// K L A S S E : TFensterFrm
// -----------------------------------------------------------------------
// Version     : 1.2
// Autor       : S. Spolwig, OSZ-Handel I,  10997 Berlin
// Aufgabe     : GUI fuer das Ratespiel Zahlenraten, 1 Fachklasse
// Compiler    : DELPHI 6
// Aenderung   : 1.2  - 23-MAR-01
//               1.3  - 18-AUG-02   Status : int
// ***********************************************************************


interface
// =======================================================================
uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   StdCtrls, ExtCtrls,
   uRatespiel;

type
  TFensterFrm = class(TForm)
    EingabeLbl    : TLabel;
    EingabeEdt    : TEdit;
    EndeBtn       : TButton;
    MeldePnl      : TPanel;
    HilfeBtn      : TButton;
    ZaehlerGrpBox : TGroupBox;
    ZaehlerLbl    : TLabel;

    procedure FormCreate(Sender: TObject);
    procedure EndeBtnClick(Sender: TObject);
    procedure RatezahlAnnehmen(Sender: TObject; var Key: Char);
    procedure HilfeBtnClick(Sender: TObject);

  private
   { Private-Deklarationen }
   procedure Init;
   procedure DatenAktualisieren;
   procedure FensterAktualisieren;


  public
    { Public-Deklarationen }
  end;

var
 FensterFrm : TFensterFrm;
 Ratespiel  : TRatespiel;  // hier wird das aktuelle Objekt deklariert


implementation
// =======================================================================
{$R *.DFM}


procedure TFensterFrm.FormCreate(Sender: TObject);
// -----------------------------------------------------------------------
begin
  Ratespiel := TRatespiel.Create;  // Objekt erzeugen
  Init;
end;


procedure TFensterFrm.EndeBtnClick(Sender: TObject);
// -----------------------------------------------------------------------
begin
  Close
end;

procedure TFensterFrm.RatezahlAnnehmen (Sender: TObject; var Key: Char);
// -----------------------------------------------------------------------

var antwort : integer;

begin
  if key = chr(13)
  then
   begin
    DatenAktualisieren;
    FensterAktualisieren;
  end;

  if Ratespiel.IstFertig
  then
   begin
     antwort := Application.Messagebox('Wollen Sie weiterspielen?',
                                        'Systemmeldung',MB_OKCANCEL);
     case antwort of
      IDOK     : Init;
      IDCANCEL : Close;
     end;
   end
end;


procedure TFensterFrm.HilfeBtnClick(Sender: TObject);
// -----------------------------------------------------------------------
begin
  showmessage('Eine Zahl von 1..100 mit möglichst wenigen Versuchen raten.'
                + #13 + 'Tip im Editfeld eingeben!');
end;

// ================= hier beginnen die privaten Methoden =================

procedure TFensterFrm.Init;
// -----------------------------------------------------------------------
begin
  Ratespiel.Init;
  EingabeEdt.Text := '';
  ZaehlerLbl.Caption := inttostr(0);
  MeldePnl.Caption := 'Neues Spiel - neues Glück';
end;

procedure TFensterFrm.DatenAktualisieren;
// -----------------------------------------------------------------------
begin
  Ratespiel.SetRatezahl(strToInt(EingabeEdt.Text));
  Ratespiel.ZaehlerErhoehen;
end;

procedure TFensterFrm.FensterAktualisieren;
// -----------------------------------------------------------------------
begin
  if Ratespiel.GetStatus = 0
  then MeldePnl.Caption  := (' Gratuliere! Richtig geraten! ')
  else
    if Ratespiel.GetStatus = -1
    then  MeldePnl.Caption  := (' Ratezahl zu niedrig ... ')
    else  MeldePnl.Caption  := (' Ratezahl zu hoch ... ');
  ZaehlerLbl.Caption:= intToStr(RateSpiel.GetZaehler);
end;


END. // --------- Unit -------

 


©   05. Oktober 2008    Siegfried Spolwig

page_top