Informationen aus einem ClientDataSet auslesen
Hallo DPler,
Ich schreibe gerade ein Programm, welches XML Daten herausliest.
Delphi-Quellcode:
Jetzt habe ich mehrere Buttons, womit ich die die Anzahl von einem Produkt ändern möchte. Jedoch hat jeder Name eigene Kosten, was dazu führt, dass ich den Namen,z.B 'Banane' mit einer If-Anweisung abfragen muss.
for u := 0 to XMLbezahlen.DocumentElement.ChildNodes.Count - 1 do begin
bnode := XMLbezahlen.DocumentElement.ChildNodes.Get(i); 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; Ein Beispiel: Wenn der Name 'Banane' ist sollen die Kosten herausgelesen werden. Ich weiß wie man dies in einer Schleife macht, aber nicht wie ich dies mit Buttons programmieren soll. Kann mir jemand Tipps geben? Mit freundlichen Grüßen |
AW: Informationen aus einem ClientDataSet auslesen
Zitat:
Könntest Du versuchen, das nochmals zu formulieren? (Falls Deutsch nicht Deine Muttersprache ist, vllt. in Englisch?) Gruß K-H |
AW: Informationen aus einem ClientDataSet auslesen
Ich versuche es einmal richtig zu formulieren.
Ich schreibe mit Delphi XE6 eine APP für ein Kino, welches schon die Images und die Titel mithilfe eines Grids ausgibt. Danach wird man weitergeleitet.Dies geschieht mit einem Tabcontrol und mehreren Tabitems. In dem neuen TabItem werden alle Vorstellungen mit Datum und Uhrzeit in einem Grid ausgegeben. Wenn man auf das Grid klickt wird man in ein Login weitergeleitet, wo man sich regestrieren oder einloggen kann.Wenn man auf den Button Anmelden klickt soll mithilfe eines Clientdatasets eine ID,der Name der Kosten,die Position und die Kosten geladen werden. Die Daten bekomme ich aus dem Internet. Mein Problem besteht jetzt darin, dass wenn ich auf ein neues Tabcontrol weitergeleitet werde, mithilfe eines Buttons die Kosten ermitteln möchte, die im Client DataSet vorhanden sind. Dafür brauche ich den Namen(z.B 'standard'), mit dem ich diese Kosten für eine Standartkarte herauslesen kann.Dies soll alles Dynamisch verlaufen,bzw. wenn ich auf den Button klicke.Ich schicke einfach den Quelltext mit, den ich für die Anmeldung geschrieben habe.
Delphi-Quellcode:
Bis hierhin läuft alles.
procedure TAppseite1.btnAnmeldenClick(Sender: TObject);
var login : Boolean; lURL,bURL : String; lOutput,bOutput: String; i,u : Integer; lnode,bnode : IXMLNode; lbenutzername : String; lpasswort : String; benutzername : String; passwort : String; postdata : TStringlist; SessionID : String; begin XMLlogin := NewXMLDocument; postdata := TStringList.Create; passwort := edPasswort.Text; benutzername := edBenutzername.Text; lURL := 'http://kinobox.net:11800/1.0/logins?apikey=2013dolphinV8'; postdata.Add('loginname=' + benutzername); postdata.Add('password=' + passwort) ; try lOutput := idHTTP1.Post(lURL,postdata); except on e:exception do begin showmessage('Login fehlgeschlagen' ); exit; end; end; XMLlogin.XML.Text := lOutput; XMLlogin.Active := true; IdHTTP1.ConnectTimeout := 3000; IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.2; rv:9.0.1) Gecko/20100101 Firefox/9.0.1'; lnode := XMLlogin.DocumentElement.ChildNodes.FindNode('SessionID'); SessionID := lnode.Text; showmessage('Login erfolgreich'); postdata.Free; XMLbezahlen := newXMLDocument; bURL := 'http://kinobox.net:11800/1.0/shows/' + InttoStr(ShowID) + '/tickets?apikey=2013dolphinV8'; bOutput := idHTTP1.Get(bURL); XMLbezahlen.XML.Text := bOutput; XMLbezahlen.Active := true; IdHTTP1.ConnectTimeout := 3000; IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.2; rv:9.0.1) Gecko/20100101 Firefox/9.0.1'; 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.Post; end; TabItem5.Visible := true; TabItem5.Enabled := true; TabItem2.Visible := false; TabItem2.Enabled := false; Tabcontrol1.ActiveTab := TabItem5; Tabcontrol1.TabIndex := TabItem5.Index; lblSessionID.Text := SessionID; end; Jetzt stelle ich mir auch noch die Frage, wie ich es realisieren soll,dass mein Programm automatisch die 'Namen' generieren soll. Dies brauche ich zum Beispiel, wenn die Seite ein Angebot macht. (Beispiel: Alle 8 Jährigen kommen für 6 Euro in diesen Film: Name:'spezialangebot',u:7,Kosten:8,ID:...). Es sollen 2 Buttons und ein label erstellt werden. (Button1:zurück,Label1:0,Button2:vor)Wenn ich auf Button 2 gehe, soll Label1 auf 1 gehen, der Name lokalisiert werden und der Preis herausgelesen werden. Wie bekomme ich dies hin Ich hoffe das reicht dir an Informationen Mit freundlichen Grüßen |
AW: Informationen aus einem ClientDataSet auslesen
Was ich noch vergessen habe ist, dass die beiden Buttons und das label automatisch generiert werden sollen. Weiß jemand wie ich dies realisiert bekomme?
|
AW: Informationen aus einem ClientDataSet auslesen
Hat niemand die Antwort auf mein Problem??
|
AW: Informationen aus einem ClientDataSet auslesen
Ich habe mir dein Problem jetzt mehrere male durchgelesen und verstehe das Problem nicht.
Ich schreibe mal, was ich bisher meine verstanden zu haben. Du hast ein ClientDataSet. Das wird von dir selbst gefüllt. Dort stehen alle Daten drin, die du benötigst. Du willst auf einen Button klicken und dann einen bestimmten Datensatz bekommen. Was hindert dich daran, diesen Datensatz im ClientDataSet zu finden? Das hat nichts mit Schleifen zu tun. Man muss nur wissen, wie man mit einem ClientDataSet umgeht. Oder habe ich immer noch nichts von dem verstanden, was du eigentlich möchtest? |
AW: Informationen aus einem ClientDataSet auslesen
Delphi-Quellcode:
Ich hole die Daten aus dem Internet.
XMLlogin := NewXMLDocument;
postdata := TStringList.Create; passwort := edPasswort.Text; benutzername := edBenutzername.Text; lURL := 'http://kinobox.net:11800/1.0/logins?apikey=2013dolphinV8'; Ich habe die Namen und die Preise , die im Client DataSet stehen. Jetzt möchte ich z.B durch ein Grid die Namen ausgeben.Zu jeder Zeile sollen automatisch 2 Buttons gesetzt werden. Das Grid ist so aufgebaut : Button1(Muss automatisch erstellt weren)-Name-Anzahl-Button2(Muss automatisch erstellt werden). Zuerst möchte ich die Buttons automatisch generieren.Also wenn Rowcount 20 ist sollen 40 Buttons automatisch erzeugt werden. Wie geht das? Ich versuche mal die Aufgabe Step by Step zu lösen. Hast du mein Problem jetzt verstanden? Danke für deine Hilfe :wink: Mit freundlichen Grußen: |
AW: Informationen aus einem ClientDataSet auslesen
Das ist machbar, aber relativ aufwändig.
Spätestens wenn du mehr Datensätze hast, als auf den Bildschirm passen, musst du auch noch das Scrollen im Grid berücksichtigen und die Buttons entsprechend löschen und neu erstellen oder die Positionen mit-scrollen. Wie schon geschrieben: Machbar aber wenn es nicht verpflichtend ist, würde ich es lassen. Vielleicht gibt es aber auch irgendwo eine Grid-Komponente, die diese Funktionalität von Haus aus mitbringt. Müsstest du dann mal googeln. Eventuell kannst du auch zwei Dummy-Spalten im Grid anlegen, die du wie Buttons aussehen lässt. Beim OnClick des Grids musst du dann prüfen, ob eine diese Spalten angeklickt wurde und entsprechend reagieren. Das hätte auch den Vorteil, dass du gleich auf dem richtigen Datensatz stehst. Oder mache es wie in den meisten Anwendungen. Erstelle einfach 2 Button unter oder neben dem Grid und verwende nur diese beiden. Nachteil: Der Anwender muss zweimal klicken. Einmal den Datensatz auswählen und dann den entsprechenden Button. |
AW: Informationen aus einem ClientDataSet auslesen
Dies soll eine App werden, was bedeutet,dass diese gut aussehen muss aber auch sehr einfach zu bedienen sein muss. Also muss ich es mit 2 Buttons machen. Die Anzahl der Namen wird auch nicht Größer als 7 werden, was heißt, dass alles auf den Bildschirm passt. Wie setzt man das mit dem automatischen generieren um? Kannst du mir das erklären?
Danke für deine schnelle Antwort. Mit freundlichen Grüßen: |
AW: Informationen aus einem ClientDataSet auslesen
Code:
Button := TButton.Create(Self);
Button.Parent := self; Button.Left := 10; Button.Top := 10; |
AW: Informationen aus einem ClientDataSet auslesen
Koloss hat ja schon die Basis für die Erstellung geschrieben. Die Positionen und Größen musst du natürlich noch berechnen.
Dazu musst du noch dem OnClick eine Methode zuweisen, die deine Aktionen ausführt. Das kann ich aber nicht aus dem Kopf. Aber es wird sich sicher jemand im Forum bereit finden, das kurz zu erläutern. Ist auch kein Hexenwerk. Ich habe das nur schon länger nicht mehr gemacht. |
AW: Informationen aus einem ClientDataSet auslesen
Easy:
Delphi-Quellcode:
Button := TButton.Create(Self);
Button.Parent := self; Button.Left := 10; Button.Top := 10; Button.OnClick := MyOnClick; //Edit: Gib die ID oder den Name des Tickets Button.Name := 'Button'+cdsBezahlen.FieldByName('Name').AsString;
Delphi-Quellcode:
procedure TMyForm.MyOnClick(Sender: TObject)
var MyString : String; begin //MyProc //Edit: //Hier kannst du mit Hilfe des Namens des Buttons die gewünschten Inhalte identifizieren MyString := TButton(Sender).Name; //MyString = 'Button....' end |
AW: Informationen aus einem ClientDataSet auslesen
Delphi-Quellcode:
Button := TButton.Create(Self);
Button.Parent := self; Button.Left := 10; Button.Top := 10; Button.OnClick := MyOnClick Button.Name := 'Button' + IntToStr(Nummer);
Delphi-Quellcode:
procedure TMyForm.MyOnClick(Sender: TObject)
begin //MyProc end procedure TMyForm.FormDestroy(Sender: TObject) var i : Integer; begin for i := 0 to 19 do // 19 = ButtonAnzahl - 1 begin Button := TButton(FindComponent('Button' + IntToStr(Nummer))); if Button <> nil then Button.Free; end; end |
AW: Informationen aus einem ClientDataSet auslesen
@Koloss
Es ist absolut überflüssig die Buttons explizit zu löschen, denn bei der Erzeugung hast du die Kontrolle (Angabe des Owners) doch schon abgegeben und der Owner (hier die Form) kümmert sich schon um die Freigabe. Selbst wenn der Owner nicht angegeben wird, braucht ein Control ja einen Parent, damit es angezeigt werden kann. Und wenn kein Owner gesetzt, dann kümmert sich der Parent um die Freigabe ;) |
AW: Informationen aus einem ClientDataSet auslesen
Stimmt! Diese Problem hat mich jetzt im Firemonkey erschlagen. Siehe mein Problem, halb gelöst!
http://www.delphipraxis.net/181049-c...ml#post1265175 |
AW: Informationen aus einem ClientDataSet auslesen
Zum generellen Ansatz des dynamischen Erzeugen von Controls, die mit irgendetwas interagieren sollen, bieten sich eigentlich Frames eher an. Der Code wird erheblich übersichtlicher.
Delphi-Quellcode:
Und für die Erzeugung und Verwaltung
TItemFrame = class( TFrame )
Button1 : TButton; procedure Button1Click( Sender : TObject ); private FItem : TItem; procedure SetItem( const Value : TItem ); public property Item : TItem read FItem write SetItem; end; procedure TItemFrame.SetItem( const Value : TItem ); begin FItem := Value; Button1.Enabled := Assigned( FItem ); end; procedure TItemFrame.Button1Click( Sender : TObject ); begin // Was auch immer nun mit dem Item machen DoSomethingWith( FItem ); // oder wenn das Item etwas schlauer ist FItem.DoSomething; end;
Delphi-Quellcode:
Das ist prinzipiell der gesamte Code um die Items darzustellen und auch mit Aktionen zu verknüpfen.
LItemFrames.Clear;
for LItem in FItems do begin LItemFrame := TItemFrame.Create( nil ); try LItemFrame.Item := LItem; LItemFrame.Parent := ItemsScrollBox; // halt den Container für die Items // Positionieren LItemFrame.Top := ... LItemFrame.Left := ... // In einer Liste merken FItemFrames.Add( LItemFrame ); LItemFrame := nil; finally LItemFrame.Free; end; end; Werden die Aktionen umfangreicher, dann wird das Frame umfangreicher (mehr Buttons, mehr Controls, mehr Farbe, mehr BlingBling), der Code zur Verwaltung bleibt meistens exakt gleich |
AW: Informationen aus einem ClientDataSet auslesen
Vielen Dank euch allen!
Ich probiere es jetzt direkt aus und hoffe, dass alles klappt. Können auch bestimmte Anweisungen für den generierten Button erstellt werden. z.b. wie in meinem Fall dass die rechten Buttons ein Grid hochzählen lassen und die Kosten, die der angegebene Name hat, ermitteln und auslesen? |
AW: Informationen aus einem ClientDataSet auslesen
Du kannst der entsprechenden Event-Property eine entsprechende Methode zuweisen.
|
AW: Informationen aus einem ClientDataSet auslesen
Zitat:
Ich glaube, dass ich jetzt mein Programm ohne Probleme weiterschreiben kann^^. |
AW: Informationen aus einem ClientDataSet auslesen
Zitat:
|
AW: Informationen aus einem ClientDataSet auslesen
Das macht ja die Methode.
|
AW: Informationen aus einem ClientDataSet auslesen
Zitat:
|
AW: Informationen aus einem ClientDataSet auslesen
Noch eine kurze Frage:
Ich habe ein Grid mit der Funktion value. Aber in meinem ClientDataset sind zwei mal der gleiche Name und der gleiche Preis enthalten. Wie schaffe ich es, dass die Daten nur einmal angezeigt werden?
Delphi-Quellcode:
Man braucht eine For-Schleife, die von dem ersten Value bis zum angezeigten Value zählt und die beiden vergleicht.
if col = 0 then begin
if cdsBezahlen.Locate('Position', Row, []) then value := cdsBezahlen.FieldByName('Name').AsString; end; if col = 1 then begin value := '0'; end; end; Aber wie? PS: Für so eine kleine Frage finde ich soll man keinen neun Threat auf machen, weil eine antwort genügt. |
AW: Informationen aus einem ClientDataSet auslesen
Die Frage ist eher WARUM ist ein deinem ClientDataset ein und der selbe Datensatz zweimal drin. Kommt das so aus der XML-Datei? Und wenn ja, ist das die selbe ID? Und wenn ja, dann mach einfach kein Append, wenn eine ID nochmal kommt.
|
AW: Informationen aus einem ClientDataSet auslesen
Delphi-Quellcode:
Gleich verhindern dass es in die Liste kommt; Wie wäre es damit?
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; |
AW: Informationen aus einem ClientDataSet auslesen
Ja danke^^
|
AW: Informationen aus einem ClientDataSet auslesen
Zitat:
Jetzt fällt mir aber was auf: Welches Feld soll man nun nehmen? Bei meinem Vorschlag wird einfach das erste genommen. Da kann gleich der nächste Fehler daraus resultieren. Vielleicht ist das ein uralter Wert der durch einen aktuelleren ersetzt worden ist. |
AW: Informationen aus einem ClientDataSet auslesen
Ohne die XML-Datei zu kennen reine Spekulation :)
|
AW: Informationen aus einem ClientDataSet auslesen
Der Fehler ist, dass es 2 verschiedene Sitzrheien gibt...
Der preis kann sich unterscheiden, muss es aber nicht. Also habe ich
Delphi-Quellcode:
eingefügt, um die Sitzrheien im Grid extra anzeigen zu lassen :D.
cdsBezahlen.FieldByName('Sitzrheie').AsString := bnode.ChildNodes.FindNode('SeatingCategory').Text;
Daran habe ich nicht gedacht und zu dem Thema ID: Ja sie ist immer um 1 unterschiedlich |
AW: Informationen aus einem ClientDataSet auslesen
Zitat:
Die Unit"Unit1.pas" ist mit dem von diesem Projekt verwendeten Framework FMX nicht kompatibel. Das Hinzufügen könnte zu Compiler-Fehlern oder unerwartetem Verhalten führen.Fortsetzen? Was nun? |
AW: Informationen aus einem ClientDataSet auslesen
Hauptformular und Frame müssen vom selben Framework sein ( VCL oder FMX)
|
AW: Informationen aus einem ClientDataSet auslesen
Zitat:
Wenn ich mir so eine Kinokarte (in Gedanken) anschaue, dann fallen mir da ein paar Informationen auf, die direkt zur Kinokarte gehören:
|
AW: Informationen aus einem ClientDataSet auslesen
Soll ich dir einmal das ganze Programm schicken? Damit bin ich schon fertig :D. Wusstet ihr, dass die vorderen Sitzplätze günstiger sind? ich nicht!
Ich habe jetzt Spinbuttons gefunden, die ich lieber automatisch generieren will. Ich habe nur die einschränkung, dass man mit Firemonkey keine Frames erstellen kann. Kann ich diese Spinbuttons direkt auf ein Column generieren? Beispiel: column1 column2 column3 standart spinb.1 Box Seat Kinder spinb.2 Boc Seat Geht so etwas? |
AW: Informationen aus einem ClientDataSet auslesen
Zitat:
Zitat:
Gruß K-H |
AW: Informationen aus einem ClientDataSet auslesen
Ab Delphi XE4 gibt es aber Frames in FireMonkey :gruebel:
|
AW: Informationen aus einem ClientDataSet auslesen
Wieso soll man keine Frames mit FireMonkey benutzen können?
Ein FireMonkey-Frame geht ganz hervorragend (wenn man auch ein FMX-Frame auswählt) :roll: |
AW: Informationen aus einem ClientDataSet auslesen
Dieses Frame finde ich aber nicht. Muss man etwas extra downloaden?
EDIT: habs gefunden |
AW: Informationen aus einem ClientDataSet auslesen
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe zwar die Pro, sollte bei der Starter aber auch funktionieren
|
AW: Informationen aus einem ClientDataSet auslesen
Ich habe jetzt einen neuen Plan:
Ich erstelle einen Frame mit den Ticketnamen, dem Preis, der Sitzrheie, einer Spinbox und evt. die TicketID. Dann erstelle ich automatisch so viele Frames, wie es Namen gibt. Wie klingt das? Apps sollen ja elegant wirken, sonst benutzt man diese nicht, obwohl es viele Features gibt. Oder hat jemand eine bessere Idee? |
AW: Informationen aus einem ClientDataSet auslesen
Kann man keine Labels in einem Frame anlegen. Es tut mir leid, dass ich sehr viel frage, aber ich habe noch nie mit Frames oder automatischen Generierungen gearbeitet. Und Vielen Dank an alle, die mir helfen:thumb::thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 Uhr. |
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