Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Array Button auslesen (https://www.delphipraxis.net/185286-array-button-auslesen.html)

akio87 28. Mai 2015 08:13

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:
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;
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 {})

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

Mavarik 28. Mai 2015 10:03

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?

akio87 28. Mai 2015 10:33

AW: Array Button auslesen
 
meine Arrays sind wie folgt definiert:

Code:
    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;
Wie würdest du es anders gestalten? Da die Abfragen zum SQL Server auch nicht super schnell sind, dauert alles immer ein wenig Zeitversetzt...

mkinzler 28. Mai 2015 10:42

AW: Array Button auslesen
 
Ich würde dynamische Arrays verwenden.

akio87 28. Mai 2015 11:01

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?

mkinzler 28. Mai 2015 11:06

AW: Array Button auslesen
 
Die Grenzen kann man mit Low() und High() ermitteln

Mavarik 28. Mai 2015 11:09

AW: Array Button auslesen
 
+ Das Ganze in einen Record packen

akio87 28. Mai 2015 11:35

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?

Jumpy 28. Mai 2015 14:40

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?

akio87 28. Mai 2015 14:49

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 15:25 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