Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Informationen aus einem ClientDataSet auslesen (https://www.delphipraxis.net/181047-informationen-aus-einem-clientdataset-auslesen.html)

mkinzler 11. Jul 2014 14:01

AW: Informationen aus einem ClientDataSet auslesen
 
Warum sollte man das nicht können?

Sir Rufo 11. Jul 2014 14:02

AW: Informationen aus einem ClientDataSet auslesen
 
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
Delphi-Quellcode:
ViewModel
liegen. Dort befindet sich eine Liste
Delphi-Quellcode:
ViewModel.Items
mit dem Kontext für jeden Frame.

Die Frames werden in einer Liste
Delphi-Quellcode:
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;

ChristianG 11. Jul 2014 15:01

AW: Informationen aus einem ClientDataSet auslesen
 
Ich bin dabei es so zu lösen:
Delphi-Quellcode:
 for u := 0 to XMLbezahlen.DocumentElement.ChildNodes.Count - 1 do begin
       bnode := XMLbezahlen.DocumentElement.ChildNodes.Get(u);

       cdsBezahlen.Append;
       cdsBezahlen.FieldByName('Position').asInteger := u;
       cdsBezahlen.FieldByName('ID').AsString       := bnode.ChildNodes.FindNode('ID').Text;
       cdsBezahlen.FieldByName('Name').AsString     := bnode.ChildNodes.FindNode('Name').Text;
       cdsBezahlen.FieldByName('Kosten').AsString   := bnode.ChildNodes.FindNode('Price').Text;
       cdsBezahlen.FieldByName('Sitzrheie').AsString := bnode.ChildNodes.FindNode('SeatingCategory').Text;
       cdsBezahlen.Post;


       myFrame := TFrameTicket.Create(self);
       myFrame.Parent := TabItem5;
       myFrame.SetBounds(10, y, 237, 40);
       myFrame.Visible := true;
        y := y + 100;

       myFrame.TicketName := cdsBezahlen.FieldByName('Name').AsString ;
       myFrame.Category  := cdsBezahlen.FieldByName('Sitzrheie').AsString ;
       myFrame.Preis    := cdsBezahlen.FieldByName('Kosten').AsCurrency;

       end;
Jetzt steht die Medung, dass es eine Bezeichnung mit dem Namen FrameTickets schon gibt...

mkinzler 11. Jul 2014 15:05

AW: Informationen aus einem ClientDataSet auslesen
 
Gib den Frames einfach verschiedene Namen
Delphi-Quellcode:
myFrame := TFrameTicket.Create(self);
myFrame.Name := Format( 'fr%s', u);

DeddyH 11. Jul 2014 15:14

AW: Informationen aus einem ClientDataSet auslesen
 
Oder man lässt die Namen ganz weg, wenn man die Frames nicht darüber ansprechen will/muss.

ChristianG 11. Jul 2014 15:20

AW: Informationen aus einem ClientDataSet auslesen
 
Zitat:

Zitat von DeddyH (Beitrag 1265240)
Oder man lässt die Namen ganz weg, wenn man die Frames nicht darüber ansprechen will/muss.

Genau dann kommt die Fehlermeldung. Dies bedeutet, dass ich den Namen brauche und den auch immer verändern muss.
mkinzer: Dein Vorschlag ist gut, dennoch funktioniert er nicht, weil man Format nicht unter diesen umständen nicht aufrufen kann


Die [] zwischen dem u fehlen :D.

mkinzler 11. Jul 2014 15:31

AW: Informationen aus einem ClientDataSet auslesen
 
Das Format ist falsch, ist ja ein Integer und kein String. :oops:

ChristianG 11. Jul 2014 15:37

AW: Informationen aus einem ClientDataSet auslesen
 
Zitat:

Zitat von mkinzler (Beitrag 1265246)
Das Format ist falsch, ist ja ein Integer und kein String. :oops:

Delphi-Quellcode:
myFrame.Name :=Format( 'fr%s',[InttoStr(u)]);

Sir Rufo 11. Jul 2014 15:39

AW: Informationen aus einem ClientDataSet auslesen
 
Zitat:

Zitat von ChristianG (Beitrag 1265248)
Zitat:

Zitat von mkinzler (Beitrag 1265246)
Das Format ist falsch, ist ja ein Integer und kein String. :oops:

Delphi-Quellcode:
myFrame.Name :=Format( 'fr%s',[InttoStr(u)]);

Aua, my eyes are bleeding

Delphi-Quellcode:
Format( 'fr%d', [ u ] )

mkinzler 11. Jul 2014 15:40

AW: Informationen aus einem ClientDataSet auslesen
 
Besser

Delphi-Quellcode:
myFrame.Name :=Format( 'fr%d',[u]);

Sir Rufo 11. Jul 2014 15:44

AW: Informationen aus einem ClientDataSet auslesen
 
Zitat:

Zitat von mkinzler (Beitrag 1265251)
Besser

Delphi-Quellcode:
myFrame.Name :=Format( 'fr%d',[u]);

Besser wäre es den Frames einfach keinen Owner mitzugeben, dann interessiert der Name nämlich nicht
Delphi-Quellcode:
myFrame := TMyFrame.Create( nil );
myFrame.Parent := TabItem5;
Jetzt kümmert sich der Parent um das Aufräumen

himitsu 11. Jul 2014 15:46

AW: Informationen aus einem ClientDataSet auslesen
 
Zitat:

Zitat von Photoner (Beitrag 1265189)
Delphi-Quellcode:
 for u := 0 to XMLbezahlen.DocumentElement.ChildNodes.Count - 1 do begin
       bnode := XMLbezahlen.DocumentElement.ChildNodes.Get(i);

       for p := u-1 downto 0 do begin
         if
          (bnode.ChildNodes.FindNode('Name').Text = {...Name von Element mit Index "p"}) and (bnode.ChildNodes.FindNode('Name').Price = {...Preis von Element mit Index "p"})
         then
          break;
       end;

       if p>=0 then begin
        cdsBezahlen.Append;
        cdsBezahlen.FieldByName('Position').asInteger := i;
        cdsBezahlen.FieldByName('ID').AsString := bnode.ChildNodes.FindNode('ID').Text;
        cdsBezahlen.FieldByName('Name').AsString := bnode.ChildNodes.FindNode('Name').Text;
        cdsBezahlen.FieldByName('Kosten').AsString := bnode.ChildNodes.FindNode('Price').Text;
        cdsBezahlen.Post;
       end else continue;
Gleich verhindern dass es in die Liste kommt; Wie wäre es damit?

XPath

Gleich nur das suchen, was man haben will.

ChristianG 11. Jul 2014 15:47

AW: Informationen aus einem ClientDataSet auslesen
 
jetzt habe ich die ganzen Frames geladen. Nur die Frames gehen unter das Formular. Hier kann ich das Formular vergrößern, aber bei einer App geht dies ja nicht. Deshalb brauche ich irgendetwas zum scrollen. Geht ein Panel?
ps: Danke für eure Hilfe. Ich hatte nur 1 Jahr Schuldelphi und muss noch einiges lernen.

ChristianG 11. Jul 2014 15:49

AW: Informationen aus einem ClientDataSet auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1265253)
Zitat:

Zitat von Photoner (Beitrag 1265189)
Delphi-Quellcode:
 for u := 0 to XMLbezahlen.DocumentElement.ChildNodes.Count - 1 do begin
       bnode := XMLbezahlen.DocumentElement.ChildNodes.Get(i);

       for p := u-1 downto 0 do begin
         if
          (bnode.ChildNodes.FindNode('Name').Text = {...Name von Element mit Index "p"}) and (bnode.ChildNodes.FindNode('Name').Price = {...Preis von Element mit Index "p"})
         then
          break;
       end;

       if p>=0 then begin
        cdsBezahlen.Append;
        cdsBezahlen.FieldByName('Position').asInteger := i;
        cdsBezahlen.FieldByName('ID').AsString := bnode.ChildNodes.FindNode('ID').Text;
        cdsBezahlen.FieldByName('Name').AsString := bnode.ChildNodes.FindNode('Name').Text;
        cdsBezahlen.FieldByName('Kosten').AsString := bnode.ChildNodes.FindNode('Price').Text;
        cdsBezahlen.Post;
       end else continue;
Gleich verhindern dass es in die Liste kommt; Wie wäre es damit?

XPath

Gleich nur das suchen, was man haben will.

So geht es auch
Delphi-Quellcode:
 for u := 0 to XMLbezahlen.DocumentElement.ChildNodes.Count - 1 do begin
       bnode := XMLbezahlen.DocumentElement.ChildNodes.Get(u);

       cdsBezahlen.Append;
       cdsBezahlen.FieldByName('Position').asInteger := u;
       cdsBezahlen.FieldByName('ID').AsString       := bnode.ChildNodes.FindNode('ID').Text;
       cdsBezahlen.FieldByName('Name').AsString     := bnode.ChildNodes.FindNode('Name').Text;
       cdsBezahlen.FieldByName('Kosten').AsString   := bnode.ChildNodes.FindNode('Price').Text;
       cdsBezahlen.FieldByName('Sitzrheie').AsString := bnode.ChildNodes.FindNode('SeatingCategory').Text;
       cdsBezahlen.Post;


       myFrame := TFrameTicket.Create(self);
       myFrame.Name :=Format( 'fr%s',[InttoStr(u)]);
       myFrame.Parent := TabItem5;
       myFrame.SetBounds(10, y, 237, 40);
       myFrame.Visible := true;
        y := y + 100;

       myFrame.TicketName := cdsBezahlen.FieldByName('Name').AsString ;
       myFrame.Category  := cdsBezahlen.FieldByName('Sitzrheie').AsString ;
       myFrame.Preis    := cdsBezahlen.FieldByName('Kosten').AsCurrency;

       end;

Sir Rufo 11. Jul 2014 15:50

AW: Informationen aus einem ClientDataSet auslesen
 
Geht auch eine Delphi-Referenz durchsuchenFMX.Layouts.TScrollBox?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz