![]() |
Array Button auslesen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich möchte eine Art Online-Shop aufbauen... Zur Laufzeit lasse ich die "Anzeigen..." Buttons erstellen (das klappt wunderbar), welcher der Artikel in Detail erscheinen soll...
Code:
Jeder Button ist mit onClick einer Prozedur zugeordnet und sieht wie folgt aus: (ShowMessage ist erst einmal nur zum Testen da, um zu sehen, wie ich die Buttons anspreche, der eigeneliche Code steht in {})
UniMainModule.SQLTable1.Active := false;
UniMainModule.SQLTable1.TableName := 'artikelliste'; UniMainModule.SQLTable1.Active := true; UniMainModule.SQLTable1.Open; UniPanel1.Height := 150; n:= 1; For i := 0 to UniListBox1.Items.Count-1 do begin //SQL Abfrage, String aus sl laden und SQL Tabelle suchen... str := UniListBox1.Items.Strings[i]; if UniMainModule.SQLTable1.Locate('ArtNr', str, []) then begin //Panel erstellen PanelArray[n] := TUniPanel.Create(self); PanelArray[n].Parent := UniPanel1; PanelArray[n].SetBounds(0,100 * n -100,UniPanel1.Width,100); PanelArray[n].Name := 'ArrayPanel' + IntToStr(n); //TPanel in der höhe erweitern UniPanel1.Height := UniPanel1.Height + PanelArray[n].Height; //Button auf erstellten Panel erstellen ButtonArray[n] := TUniButton.Create(self); ButtonArray[n].Parent := PanelArray[n]; ButtonArray[n].SetBounds(PanelArray[n].Width - 80 , PanelArray[n].Height - 30 ,75,25); ButtonArray[n].Caption := 'Anzeigen...'; ButtonArray[n].Tag := n; ButtonArray[n].Name := 'ArrayButton' + IntToStr(n); ButtonArray[n].Hint := UniMainModule.SQLTable1.fieldByName('ArtNr').AsString; ButtonArray[n].OnClick := ButtonWarenkorbClick; //Image setzen //Button auf erstellten Panel erstellen ImageArray[n] := TUniImage.Create(self); ImageArray[n].Parent := PanelArray[n]; ImageArray[n].SetBounds(0, 0, 100, 100); ImageArray[n].Center := true; ImageArray[n].Url := 'kasisystem.esy.es/Bilder/' + UniMainModule.SQLTable1.fieldByName('ArtNr').AsString + '.jpg'; //ShowMessage(ImageArray[i].url); //Label setzen und Namen aus Datenbank definieren ArtNameArray[n] := TUniLabel.Create(self); ArtNameArray[n].Parent := PanelArray[n]; ArtNameArray[n].SetBounds(ImageArray[n].Width + 5, 10 ,100,13); ArtNameArray[n].Font.Style := [fsBold, fsUnderline]; ArtNameArray[n].Caption := UniMainModule.SQLTable1.fieldByName('Hersteller').AsString + ' ' + UniMainModule.SQLTable1.fieldByName('ArtName').AsString; //Label setzen und BZ aus Datenbank definieren ArtBZArray[n] := TUniLabel.Create(self); ArtBZArray[n].Parent := PanelArray[n]; ArtBZArray[n].SetBounds(ImageArray[n].Width + 10, ArtNameArray[n].Top + 20 ,100,13); ArtBZArray[n].Caption := UniMainModule.SQLTable1.fieldByName('ArtBZ').AsString; //Label setzen und ArtNr aus Datenbank definieren ArtNrArray[n] := TUniLabel.Create(self); ArtNrArray[n].Parent := PanelArray[n]; ArtNrArray[n].SetBounds(ImageArray[n].Width + 10, ArtBZArray[n].Top + 20, 50, 13); ArtNrArray[n].Caption := 'Art. Nr.: ' + UniMainModule.SQLTable1.fieldByName('ArtNr').AsString; //Label setzen und ArtPreis aus Datenbank definieren ArtPreisArray[n] := TUniLabel.Create(self); ArtPreisArray[n].Parent := PanelArray[n]; ArtPreisArray[n].SetBounds(ImageArray[n].Width + 10, ArtNrArray[n].Top + 20, 50, 13); ArtPreisArray[n].Font.Style := [fsBold]; ArtPreisArray[n].Font.Color := clTeal; ArtPreisArray[n].Font.Size := 9; preisStr := UniMainModule.SQLTable1.fieldByName('ArtPreis').AsString; ArtPreisArray[n].Caption := 'Ihr Preis: ' + preisStr + ' EUR'; n := n+1; end;
Code:
procedure Tfmstart1.ButtonWarenkorbClick(Sender: TObject);
begin if Sender is TUniButton then begin ShowMessage(TUniButton(Sender).Name); { UniMainModule.SQLTable1.Active := false; UniMainModule.SQLTable1.TableName := 'artikelliste'; UniMainModule.SQLTable1.Active := true; UniMainModule.SQLTable1.Open; if UniMainModule.SQLTable1.Locate('ArtNr', TUniButton(Sender).Hint, []) then begin fmProdukt1.ShowModal(); fmProdukt1.UniLabel1.Caption := UniMainModule.SQLTable1.fieldByName('Hersteller').AsString + ' ' + UniMainModule.SQLTable1.fieldByName('ArtName').AsString; fmProdukt1.UniLabel2.Caption := UniMainModule.SQLTable1.fieldByName('ArtBZ').AsString; fmProdukt1.UniLabel3.Caption := UniMainModule.SQLTable1.fieldByName('ArtNr').AsString; fmProdukt1.UniLabel10.Caption := UniMainModule.SQLTable1.fieldByName('ArtPreis').AsString; //TUniButton(Sender).Caption:='Neuer Titel'; end;} end; end; nun mein Problem: wenn ich nach Programmstart ein ArrayButton anklicke, wird mir auch DIESER Button angezeigt mit allen Infos (Art Name und Co), aber wenn ich den nächsten button anklicke, folgt eine Fehlermeldung, siehe Anhang... Wie kann ich die Buttons so nutzen, dass mir die Artikel angezeigt werden? Ich arbeite mit Delphi XE8 + UniGui (da es eine Webanwendung werden soll) + MySQL Datenbank |
AW: Array Button auslesen
Ich sehe erst mal keinen Fehler im Source... Abgesehen davon, dass ich es anders machen würde - aber egal...
Wie sind die Arrays definiert? |
AW: Array Button auslesen
meine Arrays sind wie folgt definiert:
Code:
Wie würdest du es anders gestalten? Da die Abfragen zum SQL Server auch nicht super schnell sind, dauert alles immer ein wenig Zeitversetzt...
PanelArray: array[1..999] of TUniPanel;
ArtNameArray: array[1..999] of TUniLabel; ArtBZArray: array[1..999] of TUniLabel; ArtNrArray: array[1..999] of TUniLabel; ArtPreisArray: array[1..999] of TUniLabel; ButtonArray: array[1..999] of TUniButton; ImageArray: array[1..999] of TUniImage; |
AW: Array Button auslesen
Ich würde dynamische Arrays verwenden.
|
AW: Array Button auslesen
ja das werd ich später noch anpassen, mit den dynamischen arrays. die schleife, die diese Array freigeben soll, haut mir das Programm um die Ohren bei der dynamische Variante... Das ganze passe ich dann später an:)
nun erst einmal das Problem, die Buttons anzusprechen, um den Inhalt zu definieren. Da eine Idee? Und Anpassung zum Quellcode, was oder wie man die sache besser gestalten könnte, als Online-Shop? |
AW: Array Button auslesen
Die Grenzen kann man mit Low() und High() ermitteln
|
AW: Array Button auslesen
+ Das Ganze in einen Record packen
|
AW: Array Button auslesen
Okay, das mit den Arrays und Records muss ich mir mal genauer anschauen... Die Schleife zur Freigabe der Arrays wird ja mit Low() und High() angewendet, aber es kommt eine Fehlermeldung... Welche kann ich gerne später mal zeigen...
Ich würde gern weiter machen: Gibt es jetzt zu meiner Version eine Lösung, damit ich den Button direkt ansprechen kann und die inhalte laden kann? |
AW: Array Button auslesen
Ich kenn mich jetzt mit UniGui nicht aus, aber die Fehlermeldung schein ja irgendwie aus dem Framework zu kommen. Sollte man vllt. fmProdukt1 jedes mal neu erzeugen und anschließend freigeben?
|
AW: Array Button auslesen
hm, den Part mit fmProdukt1 habe ich ausgeklammert { } und es nur mit ShowMessage() probiert, um zu sehen was er mir ausgibt.
Wenn ich zum Beispiel den 2. Artikel (einen ButtonArray) anklicke, erscheint dieser mit dem name= 'ButtonArray2', so wie es sein soll. Wenn ich mir nun den 3. oder ein anderen Artikel anschauen möchte, kommt diese Fehlermeldung. ABER wenn ich wieder den 2. Artikel anklicke, erscheint wieder ShowMessage 'ButtonArray2', wie es sein soll... nach dem Programmstart kann ich einen ButtonArray auswählen, dann funktioniert es, aber sobald ich danach einen weiteren anklicke, kommt die Fehlermeldung... Hab ich einen Denkfehler? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz