Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Algorithmus für Lagerverwaltung

  Alt 18. Okt 2018, 09:33
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;
  Mit Zitat antworten Zitat