Die Flaschen sind nicht rechteckig, nur im Bild 3 nimmt jede Flasche eine rechteckige Fläche ein.
Es ist anzunehmen, dass nur jeweils eine Flaschengröße sortenrein eingelagert werden kann.
Konzept:
Man könnte das Lager durch jeweils eine Klasse für jede einzelne Flaschengröße simulieren.
Bei Programmstart erzeugt man das Lager für die gewünschte Flaschengröße und Lagerfläche.
Um eine Flasche hinzu zu fügen, fragt man eine freie Lagerposition ab.
Ist diese vorhanden (<> nil), setzt man für diese die Eigenschaft Besetzt.
Delphi-Quellcode:
TLagerPosition = class
x: Integer;
y: Integer;
Besetzt: Boolean;
end;
TLagerPositionen = class(TObjectList<TLagerPosition>)
end;
TCustomLager = class
protected
FItems: TLagerPositionen;
procedure ErzeugePositionen(ARect: TRect); virtual; abstract;
public
constructor Create(ARect: TRect);
destructor Destroy; override;
function GibFreieLagerPosition: TLagerPosition;
end;
{konkrete Lagerklassen für Flaschengröße A, B und C}
TLagerA = class(TCustomLager)
protected
procedure ErzeugePositionen(ARect: TRect); override;
end;
TLagerB = class(TCustomLager)
protected
procedure ErzeugePositionen(ARect: TRect); override;
end;
TLagerC = class(TCustomLager)
protected
procedure ErzeugePositionen(ARect: TRect); override;
end;
implementation
constructor TCustomLager.Create(ARect: TRect);
begin
inherited Create;
FItems := TLagerPositionen.Create;
ErzeugePositionen(ARect);
end;
destructor TCustomLager.Destroy;
begin
FItems.Free;
inherited;
end;
function TCustomLager.GibFreieLagerPosition: TLagerPosition;
var
lItem: TLagerPosition;
begin
for lItem in FItems do
begin
if not lItem.Besetzt then
begin
Result := lItem;
Exit;
end;
end;
Result = nil;
end;