unit UCtlView;
// eine VIEW des Labyrinths aus der Vogelperspektive, dient
// auch als CONTROLER, z.B. zum Erstellen des Labyrinths
interface // per Mausklick...
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, UModel;
const ZW=10; XYOFF=20;
type
TCtlView =
class(TForm)
ZeigenBtn: TButton;
procedure ZeigenBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private { Private-Deklarationen }
lab: TLabyrinth;
function Zl(y: integer): integer;
//ZeilenNummer zur Bildschirmposition
function Sp(x: integer): integer;
//SpaltenNr. zur Bildschirmposition
function xWert(s: SpBereich): integer;
// Bildschirmpos. der Spalte
function yWert(z: ZlBereich): integer;
// Bildschirmpos. der Zeile
procedure ZeichneLab;
public { Public-Deklarationen }
end;
var CtlView: TCtlView;
implementation
{$R *.dfm}
function TCtlView.Zl(y: integer): integer;
begin Zl:= (y-XYOFF)
div ZW
end;
function TCtlView.Sp(x: integer): integer;
begin Sp:= (x-XYOFF)
div ZW
end;
function TCtlView.xWert(s: SpBereich): integer;
begin xWert:= s*ZW+XYOFF
end;
function TCtlView.yWert(z: ZlBereich): integer;
begin yWert:= z*ZW+XYOFF
end;
procedure TCtlView.ZeichneLab;
var z: ZlBereich; s: SpBereich;
begin
for z:=0
to zMax
do for s:=0
to sMax
do
begin
if assigned(lab.zelle[s,z])
then Canvas.Brush.Color:=clBtnFace
else Canvas.Brush.Color:=clGray;
Canvas.Pen.Color:=Canvas.Brush.Color;
Canvas.Rectangle(xWert(s),yWert(z),xWert(s)+ZW,yWert(z)+ZW);
end;
end;
procedure TCtlView.ZeigenBtnClick(Sender: TObject);
begin
ZeichneLab;
end;
procedure TCtlView.FormCreate(Sender: TObject);
begin
lab:= TLabyrinth.neuesLabyrinth;
end;
procedure TCtlView.FormDestroy(Sender: TObject);
begin
// erstelltes Labyrinth wieder löschen/freigeben
// das Labyrinth gibt intern die Zellen frei
lab.Free;
end;
procedure TCtlView.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Sp(X)<=SMAX)
and (Sp(X)>=0)
and (Zl(Y)<=ZMAX)
and (Zl(Y)>=0)
and not assigned(lab.Zelle[Sp(X),Zl(Y)])
then
begin
lab.erstelleZelle(Sp(X),Zl(Y));
end;
ZeichneLab;
end;
end.