Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#42

AW: Informationen aus einem ClientDataSet auslesen

  Alt 11. Jul 2014, 15:02
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat