![]() |
Berechnungsfehler aus Stringgriddaten
Hallo,
habe ein Problem :( ist ne ganz harte nuss zuerst der Quelltext:
Delphi-Quellcode:
unit Paketdienst1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Grids, math; type TForm1 = class(TForm) GroupBox1: TGroupBox; Label1: TLabel; Label2: TLabel; Edit1: TEdit; Edit2: TEdit; Label3: TLabel; Label4: TLabel; Memo1: TMemo; StringGrid1: TStringGrid; BitBtn1: TBitBtn; Button1: TButton; Button2: TButton; Button3: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin stringgrid1.cells[0,0]:='PLZ'; stringgrid1.cells[1,0]:='Gewicht (kg)'; stringgrid1.cells[2,0]:='Länge (cm)'; stringgrid1.cells[3,0]:='Breite (cm)'; stringgrid1.cells[4,0]:='Höhe (cm)'; memo1.Text:=''; end; procedure TForm1.Button1Click(Sender: TObject); var z:integer; begin randomize; for z:=1 to 1000 do begin stringgrid1.Cells[0,z]:=formatfloat('00000', randomrange (1000, 99999)); stringgrid1.Cells[1,z]:=inttostr (randomrange (1, 50)); stringgrid1.Cells[2,z]:=inttostr (randomrange (1, 120)); stringgrid1.Cells[3,z]:=inttostr (randomrange (1, 120)); stringgrid1.Cells[4,z]:=inttostr (randomrange (1, 120)); end; end; procedure TForm1.Button3Click(Sender: TObject); var z:integer; begin edit1.clear; edit2.Clear; for z := 1 to stringgrid1.rowcount - 1 do stringGrid1.cells[0,z]:=(''); for z := 1 to stringgrid1.rowcount - 1 do stringGrid1.cells[1,z]:=(''); for z := 1 to stringgrid1.rowcount - 1 do stringGrid1.cells[2,z]:=(''); for z := 1 to stringgrid1.rowcount - 1 do stringgrid1.cells[3,z]:=(''); for z := 1 to stringgrid1.rowcount - 1 do stringGrid1.cells[4,z]:=(''); for z := 1 to stringgrid1.rowcount - 1 do stringGrid1.cells[5,z]:=(''); memo1.clear; stringgrid1.row:=1; stringgrid1.col:=0; stringgrid1.setfocus; end; procedure TForm1.Button2Click(Sender: TObject); type tdatensatz=record gewicht, volumen:real; pakete, fahrzeuge: integer; end; var plz: array[0..9] of tdatensatz; mg, mv: real; pl, p, x: integer; // mg=maximal_gewicht, mv=maximal_volumen, PLZ=PLZGebiet, pl=PLZ(HilfsVar), p=Postleitzahlgebit(HilfsVar), x=Zählvar(HilfsVar) g, l, b, h, v:Real; //g=gewicht, l=länge, b=breite, h=höhe, v=volumen begin memo1.Clear; if (edit1.Text='') or (edit2.text='') then begin showmessage ('Bitte vollstängige Eingaben'); exit; end; if (strtoint(edit1.text)<=0) or (strtoint(edit2.text)<=0) then begin showmessage ('Bitte vollstängige und korrekte Eingaben'); exit; end; for p:=0 to 9 do begin plz[p].gewicht:=0; plz[p].volumen:=0; plz[p].fahrzeuge:=0; plz[p].pakete:=0; end; mg:=strtofloatdef(edit1.text,-1)*1000; mv:=strtofloatdef(edit2.Text,-1)*1000000; if (mg<0) or (mv<0) then begin showmessage ('Bitte vollstängige und korrekte Eingaben'); exit; end else begin for x:=1 to 1000 do begin pl:=strtointdef(stringgrid1.Cells[0,x],0); g:=strtofloatdef(stringgrid1.Cells[1,x],0); l:=strtofloatdef(stringgrid1.Cells[2,x],0); b:=strtofloatdef(stringgrid1.Cells[2,x],0); h:=strtofloatdef(stringgrid1.Cells[2,x],0); v:=h*b*l; if (pl>=1000) and (pl<=99999) and (g>0) and (v>0) then begin p:=pl div 10000; plz[p].gewicht:=plz[p].gewicht+g; plz[p].volumen:=plz[p].volumen+v; plz[p].pakete:=plz[p].pakete+1; end; end; for p:=0 to 9 do with plz[p] do fahrzeuge:=max (ceil (g/mg), ceil (v/mv)); for p:=0 to 9 do with plz[p] do memo1.lines.add ('PLZ-Gebiet'+inttostr(p)+': '+ inttostr(fahrzeuge)+'Fahrzeug(e), '+ inttostr(pakete)+' Pakete'); end end; end. und zwar geht es darum das ich aus dem Stringgrid die Daten entnehme und damit rechne um die Anzahl der benötigten Fahrzeuge pro PLZ-Gebiet (dabei wird jede PLZ durch 10.000 geteilt und dann durch die anfangsziffer einer gruppe zugeordnet, es gibt als gruppen von 0-9. die anzahl der fahrzeuge wird definiert durch das volumen der pakete in abhängigkeit zum fahrzeug und dem gewicht der pakete zum fahrzeug. Ich hoffe es kann wer was damit anfang und mir helfen. is vermutlich nur ein kleiner fehler, aber ich sitze schon stunden dran den zu finden -.-'' LG Kevin |
Re: Berechnungsfehler aus Stringgriddaten
Was für ein Problem hast du jetzt?
Edit: Wieso hast du so viele unnötige doppelte Schleifen drin?
Delphi-Quellcode:
Wieso nicht so:
Wie z. B. diese:
for p:=0 to 9 do with plz[p] do fahrzeuge:=max (ceil (g/mg), ceil (v/mv)); for p:=0 to 9 do with plz[p] do memo1.lines.add ('PLZ-Gebiet'+inttostr(p)+': '+ inttostr(fahrzeuge)+'Fahrzeug(e), '+ inttostr(pakete)+' Pakete');
Delphi-Quellcode:
(Format eingebaut)for p:=0 to 9 do begin with plz[p] do begin fahrzeuge:=max (ceil (g/mg), ceil (v/mv)); memo1.lines.add (Format('PLZ-Gebiet%d: %d Fahrzeug(e), %dPakete', [p, fahrzeuge, pakete])); end; end; |
Re: Berechnungsfehler aus Stringgriddaten
Was funktioniert den genau nicht? Rücke mal alle blocks so ein, dass begin und end auf gelicher Ebene liegen
|
Re: Berechnungsfehler aus Stringgriddaten
Liste der Anhänge anzeigen (Anzahl: 1)
das problem liegt irgendwo in dieser procedur
procedure TForm1.Button2Click(Sender: TObject); das problem ist, das er zwar die paket anzahl pro plzgruppe korrekt berechnet, aber nicht wieviele fahrzeuge benötigt werden pro gruppe. Da gibt er immer nur 1 fahrzeug pro gruppe aus. ich hab die .exe(natürlich virenfrei ;) ) mal drangehängt zur veranschaulichung. |
Re: Berechnungsfehler aus Stringgriddaten
ist ja ganz klar.
Überleg mal welchen Wert die Variable "fahrzeuge" denn bekommt? Bei deiner Logik immer den Wert des letzten Schleifendurchgangs. Ich hab dir oben eine Änderung für diesen Part dargestellt. [Edit] Sorry - da war Schmarn! fahrzeuge gehört ja zu einem Record. Das ist nur sehr schwer ersichtlich. |
Re: Berechnungsfehler aus Stringgriddaten
Liste der Anhänge anzeigen (Anzahl: 3)
ich dachte schon^^
aber woran kann das denn liegen? [edit] ich hab nochmal die ganze source reingemacht [/edit] |
Re: Berechnungsfehler aus Stringgriddaten
Hast du dir schon mal die berechneten Werte von g, mg, v und mv angeschaut?
Trotzdem möcht ich dir nahelegen, dass du die unnötigen Schleifen entfernst Und nebenbei bemerkt: "Randomize" solltest du nur einmal aufrufen, und das in OnCreate der Form. |
Re: Berechnungsfehler aus Stringgriddaten
die doppelten/überflüssigen schleifen sind weg. randomize im oncreate.
das problem leider noch da :( ich bin am verzweifeln :D |
Re: Berechnungsfehler aus Stringgriddaten
mmh - ich hab mir das mal angeschaut
ich scheint so als schmeisst du die Einheiten total durcheinander. Z. B. Gewicht - in der StringList als kg angegeben - beim Edit als Tonne angegeben. du musst nochmal umrechnen - deine Werte bei ceil ergeben irgendwas mit 0,011 (bei einer Beispielberechnung) |
Re: Berechnungsfehler aus Stringgriddaten
HIER werden die eingaben aus den edit feldern auf das format der stringgrid.cells gebracht, oder nicht?
Delphi-Quellcode:
for p:=0 to 9 do
begin plz[p].gewicht:=0; plz[p].volumen:=0; plz[p].fahrzeuge:=0; plz[p].pakete:=0; end; mg:=strtofloatdef(edit1.text,-1)*1000; // <--- HIER mv:=strtofloatdef(edit2.Text,-1)*1000000; if (mg<0) or (mv<0) then begin sry wenn mein code bissl unübersichtlich ist. :( |
Re: Berechnungsfehler aus Stringgriddaten
ja - habs danach auch gesehen
mal was anderes: Ist das beabsichtigt, dass 3 mal hintereinander die gleiche Zelle gelesen wird:
Delphi-Quellcode:
[Edit]
l:=strtofloatdef(stringgrid1.Cells[2,x],0);
b:=strtofloatdef(stringgrid1.Cells[2,x],0); //müsste das nicht [3,x] heissen? h:=strtofloatdef(stringgrid1.Cells[2,x],0); //müsste das nicht [4,x] heissen? Ich hab mal diese Zeile von:
Delphi-Quellcode:
auf
fahrzeuge:=max (ceil (g/mg), ceil (v/mv));
Delphi-Quellcode:
geändert. Jetzt kommen die Fahrzeuge - aber ich hab jetzt nicht geprüft ob die Rechnung richtig ist.
fahrzeuge:=max (ceil (gewicht/mg), ceil (volumen/mv));
[Edit2] hab dein Button3 OnClick-Ereignis leicht :-) optimiert:
Delphi-Quellcode:
Wie du siehst, gibts jetzt eine 2 dimensionale Schleife
procedure TForm1.Button3Click(Sender: TObject);
var z, i:integer; begin edit1.clear; edit2.Clear; for i := StringGrid1.FixedCols to StringGrid1.ColCount - 1 do begin for z := StringGrid1.FixedRows to stringgrid1.rowcount - 1 do //Fixedrows der ordnungsheitshalber ergänzt stringGrid1.cells[i,z]:=(''); end; memo1.clear; stringgrid1.row:=1; stringgrid1.col:=0; stringgrid1.setfocus; end; die erste schleife (i) läuft über die Spalten - die zweite Schleife (z) über die Zeilen |
Re: Berechnungsfehler aus Stringgriddaten
YIPPIEH :-D
endlich =) DANKE :D ich wusste es is nen einfacher -.-' aber nach stundenlanger suche findet man nie was ^^ ich zumindest nich. ich danke dir sehr. mit rechnung überprüfe ich schon. danke danke dann kann ich ja weiter programmiern jetz =) :coder: mfg kevin |
Re: Berechnungsfehler aus Stringgriddaten
hab oben noch was ergänzt
|
Re: Berechnungsfehler aus Stringgriddaten
danke =)
hab ich ja heute ne ganze menge dazu gelernt :) noch nen paar programme dann probier ich mich mal an was schwierigerem.^^ danke nochmal man sieht sich sicher :) .. bei meinem nächsten Problem :P mfg kevin |
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 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