Der Plan hört sich schon mal gut an.
Wenn du jetzt jedem Frame auch noch einen Kontext zuweist aus dem er sich bedienen kann, dann hast du quasi fast alles geschafft.
Die Form selber hat einen Kontext in
ViewModel
liegen. Dort befindet sich eine Liste
ViewModel.Items
mit dem Kontext für jeden Frame.
Die Frames werden in einer Liste
FItems : TObjectList<TWarenkorbEintragFrame>;
verwaltet.
Jeder Frame bekommt nun diesen Kontext zugewiesen:
Delphi-Quellcode:
procedure TForm1.LoadFromModel;
var
LIdx : Integer;
begin
// Kein ViewModel, dann alles weg
if not Assigned( ViewModel )
then
begin
FItems.Clear;
Summe_Label.Caption := '';
Exit;
end;
// Anzahl der Frames anpassen
AdjustItems;
// Zuweisen des Kontexts an die Frames
for LIdx := 0 to ViewModel.Items.Count - 1 do
FItems[LIdx].ViewModel := ViewModel.Items[LIdx];
Summe_Label.Caption := CurrToStrF( ViewModel.Summe, ffCurrency, 2 );
end;
Damit die Anzahl der Frames zur Anzahl der Items passt, hier die Methode um die Frames zu entfernen oder zu erzeugen:
Delphi-Quellcode:
procedure TForm1.AdjustItems;
var
LFrameItem : TWarenkorbEintragFrame;
LIdx : Integer;
LTop : Integer;
LDiff : Integer;
begin
// Wenn die Anzahl der Frames nicht mit der Anzahl der Einträge übereinstimmt,
// dann müssen wir hier tätig werden
if FItems.Count <> ViewModel.Items.Count
then
begin
// Überflüssige Frames entsorgen
if FItems.Count > ViewModel.Items.Count
then
begin
LDiff := FItems.Count - ViewModel.Items.Count;
FItems.DeleteRange( FItems.Count - LDiff, LDiff );
end;
// Fehlende Frames hinzufügen
while FItems.Count < ViewModel.Items.Count do
begin
LFrameItem := TWarenkorbEintragFrame.Create( nil );
LFrameItem.Parent := ScrollBox1;
FItems.Add( LFrameItem );
end;
// Frames positionieren
LTop := -ScrollBox1.VertScrollBar.Position;
for LIdx := 0 to ViewModel.Items.Count - 1 do
begin
LFrameItem := FItems[LIdx];
LFrameItem.ViewModel := ViewModel.Items[LIdx];
LFrameItem.Top := LTop;
LFrameItem.Left := 0;
LFrameItem.Width := ScrollBox1.ClientWidth;
LFrameItem.Anchors := [akLeft, akTop, akRight];
LTop := LTop + LFrameItem.Height;
end;
end;
end;