akio Posted October 8, 2015 Posted October 8, 2015 Hallo, ich arbeite mit Delphi XE8 und möchte einen Intranet Onlineshop aufbauen... Soweit so gut, funktioniert alles, bisher ohne Probleme... Doch leider bekomme ich des öfteren eine Fehlermeldung, wenn ich meinen Button "in Warenkorb" zwei mal, etwas schneller nach Programmstart, betätige... Leider kann ich mir aus der Fehlermeldung auch keinen Zusammenhang erschließen, was das sein könnte :/ Fehler: "EAssertionFailed : TUniDBGrid.MoveToRow(): Unexpected Row number. (H:\Framework\uniGUI\uniDBGrid.pas, Zeile 1929)" Sobald ich diese Meldung erhalte, scheint der Artikel auch nicht im Warenkorb. Nach Erhalt dieser Fehlermeldung, kommt diese auch nie wieder, und kann so oft und so schnell die Button "in Warenkorb" drücken wie ich will... Alles ohne Probleme... Außer beim Ersten Login zum Shop: 1. Der Erste Artikel im Warenkorb legen - geht 2. Den gleichen oder einen anderen Artikel im Warenkorb legen, das gaanz schnell danach - FEHLER! - Wenn ich mir 3-5 Sekunden Zeit lasse, kommt sie nicht. 3. Die nachfolgenden Artikel, wie gesagt, alles ohne Probleme, und so schnell wie ich will... Ich hoffe, ihr könnt mir folgen^^ Ansonsten gerne Fragen... Hier mal der Code: Das ist der Button, welchen ich betätige: procedure Tfmstart1.ButtonZumWarenkorbClick(Sender: TObject); begin if (Sender is TUniButton) then begin try UniMainModule.Artikel := TUniButton(Sender).Hint; fmProdukt1.UniNumberEdit1.Text := MengenArray[TUniButton(Sender).Tag].Text; fmProdukt1.UniButton1.Click; except on E : Exception do ShowMessage(E.Message); end; end; end; Das ist die procedure in der Produktansicht (andere Form), welcher im Anschluss dann in den Warenkorb gelegt wird: procedure Tfmprodukt1.UniButton1Click(Sender: TObject); var preis, VK1, Kondition: String; menge: Integer; sl:TStringList; begin UniMainModule.mySQLQuery1.SQL.Clear; UniMainModule.mySQLQuery1.SQL.Add('select a.ArtNr, b.Hersteller, b.ArtName, b.ArtBZ, a.VK1, b.ArtPreis, a.Kondition, b.class'); UniMainModule.mySQLQuery1.SQL.Add('from'); UniMainModule.mySQLQuery1.SQL.Add('userartikel a'); UniMainModule.mySQLQuery1.SQL.Add('inner join artikelliste b'); UniMainModule.mySQLQuery1.SQL.Add('on b.ArtNr = a.ArtNr'); UniMainModule.mySQLQuery1.SQL.Add('where a.ident = ' + IntToStr(UniMainModule.Ident)); UniMainModule.mySQLQuery1.SQL.Add('AND b.ArtNr like "' + UniMainModule.Artikel + '";'); UniMainModule.mySQLQuery1.Open; fmwarenkorb.UniStringGrid1.RowCount := fmwarenkorb.UniStringGrid1.RowCount +1; fmwarenkorb.UniStringGrid1.Cells[0,UniMainModule.Row] := UniMainModule.mySQLQuery1.fieldByName('ArtNr').AsString; fmwarenkorb.UniStringGrid1.Cells[1,UniMainModule.Row] := UniMainModule.mySQLQuery1.fieldByName('Hersteller').AsString + ' ' + UniMainModule.mySQLQuery1.fieldByName('ArtName').AsString; fmwarenkorb.UniStringGrid1.Cells[5,UniMainModule.Row] := ' > Entfernen <'; fmwarenkorb.UniStringGrid1.Cells[6,UniMainModule.Row] := ' -'; fmwarenkorb.UniStringGrid1.Cells[7,UniMainModule.Row] := ' +'; //Preisberechnung: VK1 := UniMainModule.mySQLQuery1.fieldByName('VK1').AsString; Preis := UniMainModule.mySQLQuery1.fieldByName('ArtPreis').AsString; //Listenpreis kondition := UniMainModule.mySQLQuery1.fieldByName('Kondition').AsString; if (VK1 = '') or (VK1 = '0') then begin if (Kondition = '') or (Kondition = '0') then begin //Listenpreis end else begin //Prozente abrechnen Preis := UniMainModule.mySQLQuery1.fieldByName('ArtPreis').AsString; Preis := FloatToStr(StrToFloat(Preis) - (StrToFloat(Preis) / 100) * StrToFloat(Kondition)); end; end else begin //Festen VK übernehmen Preis := VK1; end; menge := StrToInt(UniNumberEdit1.Text); fmwarenkorb.UniStringGrid1.Cells[2,UniMainModule.Row] := IntToStr(menge); fmwarenkorb.UniStringGrid1.Cells[3,UniMainModule.Row] := FormatFloat(',.00',StrToFloat(preis)) + ' EUR'; preis := FloatToStr(StrToFloat(preis) * Menge); fmwarenkorb.UniStringGrid1.Cells[4,UniMainModule.Row] := FormatFloat(',.00',StrToFloat(preis)) + ' EUR'; UniMainModule.row := UniMainModule.row +1; close; end; Ich hoffe, ihr habt einen passenden Rat. Ich freue mich auf ein Feedback. LG Karsten Quote
erich.wanker Posted October 9, 2015 Posted October 9, 2015 Hallo Karsten, kurze Frage: Wenn ich dich richtig verstehe ist der "Fehler" nur bei mehrfachem Klick ? Was passiert, wenn du bei "ButtonZumWarenkorbClick" in der ersten Zeile ButtonZumWarenkorb.enabled:=false; und nach deiner Preisberechnung: ButtonZumWarenkorb.enabled:=true; reinschreibst? Lg Erich Quote
akio Posted October 9, 2015 Author Posted October 9, 2015 Hallo Erich, das Problem tritt nur EINMAL auf, und zwar beim 2. Klick "in Warenkorb". Danach ist das kein Problem mehr - Ich klicke und klicke so schnell und oft wie ich will. Aber ich teste es gerne auf den Nachmittag und kann Dir dann ein Feedback geben. Vielleicht brauch der beim Programmstart etwas länger, um den Code abzuarbeiten, keine Ahnung LG Karsten Quote
Administrators Farshad Mohajeri Posted October 9, 2015 Administrators Posted October 9, 2015 Hi, You seem to be using an older version of uniGUI. Please specify your edition and version. Quote
akio Posted October 9, 2015 Author Posted October 9, 2015 Hi, yes, I use somewhat an older version of UniGui (0.99.0 build 1169) with Delphi XE8. Best regard Karsten Quote
Administrators Farshad Mohajeri Posted October 9, 2015 Administrators Posted October 9, 2015 Hi, yes, I use some an older version of UniGui (0.99.0 build 1169) with Delphi XE8. Best regard Karsten Trial edition? Quote
akio Posted October 9, 2015 Author Posted October 9, 2015 German: das muss etwas am Programmstart zutun haben. Nach dem ich, statt "in Warenkorb" etwas anderes mache, wie z.B. "Produkt infos anzeigen", und im Anschluss dann ganz oft "in Warenkorb" bestätige, passiert nichts... Alles ohne eine Fehlermeldung. Schon irgendwie merkwürdig. Google Translater in english that must have some intervention at program start. After I, instead of "add to cart" doing something else, such as "More info Show", and after then quite often "add to cart" confirm, nothing happens ... all without an error message. Already somehow strange. Quote
erich.wanker Posted October 9, 2015 Posted October 9, 2015 Was hast du im onCreate und im OnShow des Fensters ? Verwendest du irgendwelche uniTimer? Hast du irgendwo ButtonZumWarenkorb.OnClick(self) verwendet ? Quote
Administrators Farshad Mohajeri Posted October 9, 2015 Administrators Posted October 9, 2015 oh sorry, yes, Trial VersionPlease upgrade to latest build otherwise we are unable to support your edition. Quote
akio Posted October 9, 2015 Author Posted October 9, 2015 @Admin ok, I will soon make an update. @Erich Leider hat es nichts gebracht. Die Fehlermeldung kommt auch dann, nachdem ich den Ersten Artikel im Warenkorb gelegt habe und anschließend den Warenkorb öffnen möchte O.o Also das verstehe ich nun gar nicht... Warenkorb anzeigen: procedure Tfmstart1.UniButton10Click(Sender: TObject); begin if fmWarenkorb.UniStringGrid1.RowCount > 1 then // begin fmWarenkorb.ShowModal(); end else begin ShowMessage('Es befindet sich kein Artikel im Warenkorb!'); end; end; onCreate: procedure Tfmstart1.UniFormCreate(Sender: TObject); var ini: TIniFile; filename: String; begin UniMainModule.Row := 1; UniScrollbox1.Left := screen.Width div 2 - UniScrollbox1.Width div 2; UniEdit1.Left := UniScrollbox1.Left; UniButton1.Left := UniEdit1.Left + UniEdit1.Width + 10; UniImage1.Left := screen.Width div 2 - UniImage1.Width div 2; UniImage2.Left := UniImage1.Left + UniImage1.Width -5; //Alle Produkte anzeigen: UniButton11.Click; //Admin //UniButton2.Visible := UniMainModule.Admin; //RR Adresse = Auftraggeber UniMemo2.Clear; UniMemo2.Lines.Add(UniMainModule.Firma); if UniMainModule.Adress1 <> '' then UniMemo2.Lines.Add(UniMainModule.Adress1); if UniMainModule.Adress2 <> '' then UniMemo2.Lines.Add(UniMainModule.Adress2); UniMemo2.Lines.Add(UniMainModule.Straße); UniMemo2.Lines.Add(UniMainModule.PLZ + ' ' + UniMainModule.Ort); UniMemo2.Lines.Add(UniMainModule.Land); fmwarenkorb.UniMemo1.Lines.Text := UniMemo2.Lines.Text; //In Warenkorb anzeigen lassen //LS Adresse = Auftraggeber UniMemo3.Lines.Text := UniMemo2.Lines.Text; fmwarenkorb.UniMemo2.Lines.Text := UniMemo3.Lines.Text; //In Warenkorb anzeigen lassen //RR Adresse in Variablen packen UniMainModule.RRFirma := UniMainModule.Firma; UniMainModule.RRAdress1 := UniMainModule.Adress1; UniMainModule.RRAdress2 := UniMainModule.Adress2; UniMainModule.RRStraße := UniMainModule.Straße; UniMainModule.RRPLZ := UniMainModule.PLZ; UniMainModule.RROrt := UniMainModule.Ort; UniMainModule.RRLand := UniMainModule.Land; //LS Adresse in Variablen packen UniMainModule.LSFirma := UniMainModule.Firma; UniMainModule.LSAdress1 := UniMainModule.Adress1; UniMainModule.LSAdress2 := UniMainModule.Adress2; UniMainModule.LSStraße := UniMainModule.Straße; UniMainModule.LSPLZ := UniMainModule.PLZ; UniMainModule.LSOrt := UniMainModule.Ort; UniMainModule.LSLand := UniMainModule.Land; //Ansprechpartner anzeigen: //UniPanel4.Caption := UniMainModule.Betreuer; UniPanel4.Top := 0; UniPanel4.Left := screen.Width - UniPanel4.Width; //daten laden ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + '\files\Betreuer\Betreuer.ini'); try UniImage3.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + '\files\Betreuer\' + UniMainModule.Betreuer + '.jpg'); UniLabel9.Caption := ini.ReadString(UniMainModule.Betreuer, 'Name', ''); UniLabel10.Caption := ini.ReadString(UniMainModule.Betreuer, 'Tel', ''); UniLabel11.Caption := ini.ReadString(UniMainModule.Betreuer, 'Mail', ''); UniLabel12.Caption := ini.ReadString(UniMainModule.Betreuer, 'Zitat', ''); finally ini.Free; end; end; UniButton11: "Alle Produkte anzeigen:" procedure Tfmstart1.UniButton11Click(Sender: TObject); begin UniMainModule.mySQLQuery1.SQL.Clear; UniMainModule.mySQLQuery1.SQL.Add('select a.ArtNr, b.Hersteller, b.ArtName, b.ArtBZ, a.VK1, b.ArtPreis, a.Kondition, b.class'); UniMainModule.mySQLQuery1.SQL.Add('from userartikel a'); UniMainModule.mySQLQuery1.SQL.Add('inner join artikelliste b'); UniMainModule.mySQLQuery1.SQL.Add('on b.ArtNr = a.ArtNr'); UniMainModule.mySQLQuery1.SQL.Add('where a.ident = ' + IntToStr(UniMainModule.Ident)); UniButton6.Click; //Ausführen end; UniButton6.Click: //Ausführen procedure Tfmstart1.UniButton6Click(Sender: TObject); var i, n, count, acount: Integer; VK1, ArtPreis, kondition, Preis, str_, test: String; begin try //UniMainModule.mySQLQuery1.SQL.Text := UniMemo1.Lines.Text; UniMainModule.mySQLQuery1.Open; count := UniMainModule.mySQLQuery1.RecordCount; //Versand erst einmal auf o setzen UniMainModule.Versand := '8,30'; // Panels freigeben for i := Low(PanelArray) to StrToInt(UniEdit2.Text) do //High(PanelArray) do begin PanelArray[i].Free; end; UniEdit2.Text := IntToStr(count); UniPanel1.Height := 0; n:= 1; For i := 1 to count do begin //ShowMessage(test); test := UniMainModule.mySQLQuery1.FieldByName('ArtNr').AsString; if test = '69789789' then //Versandartikel begin if UniMainModule.mySQLQuery1.fieldByName('VK1').AsString <> '' then begin UniMainModule.Versand := UniMainModule.mySQLQuery1.fieldByName('VK1').AsString; end; end else 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); //WarenkorbButton auf erstellten Panel erstellen WarenkorbButtonArray[n] := TUniButton.Create(self); WarenkorbButtonArray[n].Parent := PanelArray[n]; WarenkorbButtonArray[n].SetBounds(PanelArray[n].Width - 100 , PanelArray[n].Height - 30 ,96,25); WarenkorbButtonArray[n].Caption := 'In Warenkorb'; WarenkorbButtonArray[n].Tag := n; WarenkorbButtonArray[n].Name := 'ArrayWarenkorbButton' + IntToStr(n); WarenkorbButtonArray[n].Hint := UniMainModule.mySQLQuery1.FieldByName('ArtNr').AsString; //UniMainModule.SQLTable1.fieldByName('ArtNr').AsString; WarenkorbButtonArray[n].ScreenMask.Enabled := true; WarenkorbButtonArray[n].OnClick := ButtonZumWarenkorbClick; //MengenEdit auf erstellten Panel erstellen MengenArray[n] := TUniNumberEdit.Create(self); MengenArray[n].Parent := PanelArray[n]; MengenArray[n].SetBounds(PanelArray[n].Width - WarenkorbButtonArray[n].Width-40, PanelArray[n].Height - 30 ,37,25); MengenArray[n].Text := '1'; MengenArray[n].Tag := n; MengenArray[n].Name := 'ArrayMengen' + IntToStr(n); MengenArray[n].Hint := WarenkorbButtonArray[n].Hint; //UniMainModule.SQLTable1.fieldByName('ArtNr').AsString; MengenArray[n].OnKeyPress := MengenKeyPress; MengenArray[n].OnKeyDown := MengenKeyDown; MengenArray[n].OnExit := MengenExit; //ProduktButton auf erstellten Panel erstellen ButtonArray[n] := TUniButton.Create(self); ButtonArray[n].Parent := PanelArray[n]; ButtonArray[n].SetBounds(PanelArray[n].Width - 80 - WarenkorbButtonArray[n].Width -5 - MengenArray[n].Width -5 , PanelArray[n].Height - 30 ,75,25); ButtonArray[n].Caption := 'Anzeigen...'; ButtonArray[n].Tag := n; ButtonArray[n].Name := 'ArrayButton' + IntToStr(n); ButtonArray[n].Hint := WarenkorbButtonArray[n].Hint; //UniMainModule.SQLTable1.fieldByName('ArtNr').AsString; ButtonArray[n].ScreenMask.Enabled := true; ButtonArray[n].OnClick := ButtonWarenkorbClick; //Image setzen //Button auf erstellten Panel erstellen ImageArray[n] := TUniImage.Create(self); ImageArray[n].Parent := PanelArray[n]; ImageArray[n].SetBounds(5, 5, 90, 90); ImageArray[n].Center := true; ImageArray[n].Stretch := true; ImageArray[n].Hint := WarenkorbButtonArray[n].Hint; ImageArray[n].Cursor := crHandPoint; ImageArray[n].OnClick := ButtonWarenkorbClick; try ImageArray[n].Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + '\files\pics\ArtNr\' + UniMainModule.mySQLQuery1.fieldByName('ArtNr').AsString + '.jpg'); except //nix end; //ImageArray[n].Url := ExtractFilePath(ParamStr(0)) + '\files\pics\ArtNr\' + UniMainModule.mySQLQuery1.fieldByName('ArtNr').AsString + '.jpg'; //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.mySQLQuery1.fieldByName('Hersteller').AsString + ' ' + UniMainModule.mySQLQuery1.fieldByName('ArtName').AsString; ArtNameArray[n].Hint := WarenkorbButtonArray[n].Hint; ArtNameArray[n].Cursor := crHandPoint; ArtNameArray[n].ScreenMask.Enabled := true; ArtNameArray[n].OnClick := ButtonWarenkorbClick; //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); str_ := UniMainModule.mySQLQuery1.fieldByName('ArtBZ').AsString; if Length(Str_) >= 70 then begin Delete(Str_, 70, Length(Str_)); Str_ := Str_ + ' ...'; end; ArtBZArray[n].Caption := Str_; //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.mySQLQuery1.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; VK1 := UniMainModule.mySQLQuery1.fieldByName('VK1').AsString; Preis := UniMainModule.mySQLQuery1.fieldByName('ArtPreis').AsString; //Listenpreis laden kondition := UniMainModule.mySQLQuery1.fieldByName('Kondition').AsString; if (VK1 = '') or (VK1 = '0') then begin if (Kondition = '') or (Kondition = '0') then begin //Listenpreis end else begin //Konditionen Preis := FloatToStr(StrToFloat(Preis) - (StrToFloat(Preis) / 100) * StrToFloat(Kondition)); end; end else begin Preis := VK1; end; ArtPreisArray[n].Caption := 'Ihr Preis: ' + FormatFloat(',.00',StrToFloat(preis)) + ' EUR'; //TPanel in der höhe erweitern UniPanel1.Height := UniPanel1.Height + PanelArray[n].Height; n := n+1; end; UniMainModule.mySQLQuery1.Next; end; except on E : Exception do ShowMessage(E.Message); end; UniButton1.Enabled := true; end; Quote
akio Posted October 9, 2015 Author Posted October 9, 2015 Boar ich habe glaub DIE LÖSUNG.... In "Ausführen" sage ich ja UniMainModule.mySQLQuery1.next; um den nächsten Datensatz / Artikel zu bearbeiten bzw anzeigen zu lassen ... Jetzt habe ich aus Spaß mal "UniMainModule.mySQLQuery1.First;" in der letzten Zeile unter Button.enabled := true ergänzt, dass er wieder in die erste Zeile springt und siehe da: Es kommt KEINE Fehlermeldung mehr... Man ist das eine schwere Geburt Vielen Dank für die zusätzlichen Denkansätze^^ [gelöst] Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.