Hallo zusammen,
ich sitze gerade zusammen mit meiner Schwester vor einem kleinen Problemchen in Lazaerus.
Aufgaben beschreibung sind mal wieder die berühmten Türme von Hanoi, dieses gilt es allerdings grafisch Darzustellen.
Mein Ansatz sieht wie folgt aus:
Eine Klasse für die Logik der Türme und deren Stack.
Eine Klasse die alle drei Türme als Einheit zusammenfügt und die "Logik" der Scheiben beinhaltet.
Soweit funktioniert auch alles, jetzt geht es daran die Sache Grafisch darzustellen:
Dazu habe ich eine Klasse von TPanel abgeleitet die ich jetzt immer mit neuen Panels als Scheiben befüllen will. Das müsste mit den Anchors recht gut funktionieren:
Delphi-Quellcode:
uses
Classes, SysUtils, uBTuerme, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls;
type
{ TVisTower }
TVisTower = class(TPanel)
strict private
private
// std. verstecken ...
constructor Create(AOwner: TComponent); override;
protected
procedure MaleTurm(ATower: TTower);
public
constructor Create(AOwner: TComponent; ATower: TTower; ALeft, ATop, AWidth : Integer);
published
end;
implementation
{ TVisTower }
constructor TVisTower.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
procedure TVisTower.MaleTurm(ATower: TTower);
var
schicht: TPanel;
i: integer;
begin
i := 1;
if (not ATower.IsEmpty) then
begin
repeat
schicht := TPanel.Create(self);
schicht.Anchors := [akBottom];
schicht.Width := self.Width - (i * 4);
schicht.Left := 2;
if ((i mod 2) = 0) then
schicht.Color := clRed
else
schicht.Color := clGreen;
schicht.Caption:= IntToStr(ATower.Get);
inc(i);
until ATower.IsEmpty;
end;
end;
constructor TVisTower.Create(AOwner: TComponent; ATower: TTower; ALeft, ATop, AWidth : Integer);
begin
inherited Create(AOwner);
self.Width:= AWidth;
self.Top:= ATop;
self.Left:= ALeft;
MaleTurm(ATower);
end;
Wenn ich das teil jetzt mit einem Turm (
Delphi-Quellcode:
uses
Classes, SysUtils;
type
TEnumTuerme = (Turm1, Turm2, Turm3);
{ TTower }
TTower =
class
private
Items:
array of integer;
protected
function IsItEmpty: boolean;
public
procedure Add(AItem: integer);
function Get: integer;
function Copy: TTower;
property IsEmpty : boolean
read IsItEmpty;
end;
implementation
{ TTower }
procedure TTower.Add(AItem: integer);
begin
if (IsEmpty)
or (AItem < Items[Length(Items) - 1])
then
begin
SetLength(Items, Length(Items) + 1);
Items[Length(Items) - 1] := AItem;
end
else
raise Exception.Create('
Platte ist zu groß!');
end;
function TTower.Get: integer;
begin
if (
not IsEmpty)
then
begin
Result := Items[Length(Items) - 1];
// letztes löschen
SetLength(Items, Length(Items) - 1);
end
else
raise EOutOfResources.Create('
Tower stack is empty!');
end;
function TTower.IsItEmpty: boolean;
begin
Result := (Length(Items) = 0);
end;
function TTower.Copy: TTower;
var
i: integer;
begin
Result := TTower.Create;
for i
in Items
do
Result.Add(i);
end;
Lade läuf auch alles ohne Fehler durch ... allerdings bekomme ich das Panel nicht auf das Formular:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Hanoi : THanio;
begin
Hanoi := THanio.Create(5);
// AOwner: TComponent; ATower: TTower; ALeft, ATop, AWidth : Integer
FTurm1 := TVisTower.Create(self, Hanoi.Turm1, 0, 420,200); ;
FTurm1.Repaint();
self.Repaint;
end;
Muss ich noch irgendwas wichtiges neu zeichnen? Irgendwo nen
Handle übergeben oder habe ich an irgendeiner Stelle etwas wichtiges vergessen?
Vielen Dank für eure Ratschläge,
Tobi
EDIT:
Fixed
FTurm1.Parent := self;