Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Abschreibungsprogramm
PyroFa - Di 30.11.10 19:51
Titel: Abschreibungsprogramm
Guten Abend,
ich bin zur Zeit dabei, ein Programm zur Berechnung von Abschreibungen zu erstellen. Studiere im 1. Semester Wirtschaftsinformatik und habe bisher nur etwas Erfahrung im Hinblick auf Konsolenanwendungen.
Zur Frage:
Als Leistungsnachweis habe ich einen Abschreibungsrechner programmiert. Das ganze gefällt mir aber so noch nicht (ist aber vom Prof bereits durchgewunken worden). Ich würde gerne für mich das Programm noch grafisch umsetzen. Habe allerdings keine Ahnung davon. Ich habe an dieses Thema die Konsolenanwendung und die ersten Schritte der grafischen Anwendung angefügt. Es wäre sehr nett, wenn mir jemand antworten könnte, wie ich in der grafischen Anwendung die eingegebenen Werte berechnen und mir in den im Programm enthaltenen Groupboxen ausgeben lassen kann.
Zur Info: Als Programmierumgebung nutze ich Lazarus.
Moderiert von
Martok: Topic aus Sonstiges (Delphi) verschoben am Di 30.11.2010 um 21:26
Moderiert von
Narses: Anhang von RAR -> ZIP und inline -> normal
Jakob_Ullmann - Di 30.11.10 20:11
GNOME FileRoller kann RAR wie es ausschaut nicht öffnen (und ich denke nicht, das BZIP oder GNU Zip das unterstützen werden). Aber Werte ausgeben allgemein in irgendeiner Form kannst du z. B. so (wenn du z. B. ein TLabel hast):
Delphi-Quelltext
1: 2: 3:
| lblAnzeige.Caption := 'Hallo'; lblAnzeige.Caption := IntToStr(einInteger); lblAnzeige.Caption := FloatToStr(eineGleitkommazahl); |
Wichtig ist hier halt eine Typumwandlung (nicht verwechseln mit einem Cast!!!), die du bei Write(Ln) nicht brauchst (in C gibt es dafür z. B. Formatstrings, die du in Pascal nicht hast).
PyroFa - Mi 01.12.10 09:52
Habe das ganze noch mal als ZIP-Datei hochgeladen. Aber danke erst mal für die schnelle Antwort
Moderiert von
Narses: Anhang im ersten Post aktualisiert.
Jakob_Ullmann - Mi 01.12.10 18:18
Also viel kann man da ja noch nicht sehen. Außerdem verstehe ich bei mancher Unit nicht ganz, wozu du sie einbindest. Aber ich nehme mal an, du willst die Daten in dein StringGrid schreiben. Das machst du einfach so hier:
Delphi-Quelltext
1: 2:
| StringGrid1.Cells[x, y] := 'Text'; StringGrid1.Cells[x, y] := IntToStr(Wert); |
x und y sind die Spalte und die Zeile der Zelle. Die ersten sind immer 0, die zweiten 1, usw. Auch ausgegraute Spalten und Zeilen (Anzahl legst du mit FixedRows und FixedCols fest) zählen mit und lassen sich beschreiben.
PyroFa - Di 07.12.10 10:18
So nach etwas längerer Zeit eine weitere Frage dazu. Wie kann ich die Anzahl der Reihen in einem TStringGrid dynamisch gestalten? Ich habe ein Edit-Feld (ND) und das TStringGrid soll die Anzahl an Reihen haben, die in ND eingegeben wurden. Wäre nett wenn mir jemand darauf eine Antwort geben könnte :)
MfG
PyroFa
bummi - Di 07.12.10 10:29
meinst Du
?
PyroFa - Di 07.12.10 10:34
Yeeessss... genau das hab ich gesucht. Vielen Dank. Darf der Thread eigentlich weiter auf bleiben? Weil das Programm ist ja an sich noch nicht fertig und ich kenne mich und werde den Thread noch mit weiteren Fragen beglücken ;)
Übrigens der genaue Quellcode war:
Quelltext
1:
| StringGrid1.RowCount := strtoint(ND.Text)+1; |
PyroFa - Di 07.12.10 11:37
Und es ist auch schon soweit! Hab gerade ein Problem damit, den i-Wert einer While-Schleife in die erste Spalte des TStringGrids zu schreiben. Die erste Spalte soll in diesem Fall das Jahr sein.
Anbei einmal der momentane Quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| s1:=AW.text; s3:=ND.Text; i1:=strtofloat(s1); i2:=strtofloat(s3); i1:=i1/i2; s2:=floattostr(i1); Erg.text:=s2;
nud:=strtoint(ND.Text);
StringGrid1.RowCount := strtoint(ND.Text)+1;
while i < nud do begin i:=0; x:=i; y:=0; i:=i+1; StringGrid1.Cells[x, y] := inttostr(i); end; |
Was hab ich denn nun falsch gemacht? Die dynamische Größe des STringGrids funktioniert. Nur das füllen halt momentan noch nicht. Wäre über weitere Hilfe sehr dankbar ;)
MfG
PyroFa
[edit] Hab den Quelltext noch mal angepasst. [/edit]
Delete - Di 07.12.10 11:40
Guck dir mal deine while-Schleife an und richte dein Augenmerk mal auf die Variable i. Macht das Sinn, was du da machst?
Tintenblut - Di 07.12.10 11:42
Ich glaube, deine While-Schleife ist nicht so, wie du es willst ;)
Schau dir mal deine Laufvariable an
Edit:
Luckie war schneller =/
PyroFa - Di 07.12.10 11:43
Gut das ist korrigiert. Sollte natürlich ein kleiner Zeichen sein. Aber dann entsteht ja direkt das nächste Problem. Wie bekomme ich es denn hin, dass immer der I-Wert als X und der Y:=0 Wert genommen wird?
Delete - Di 07.12.10 11:47
PyroFa hat folgendes geschrieben : |
| Gut das ist korrigiert. Sollte natürlich ein kleiner Zeichen sein. |
Das meinte ich nicht:
Delphi-Quelltext
1: 2: 3: 4:
| i := 0; ...; ...; i := i + 1 |
Wie sinnvoll ist dieser Code?
PyroFa - Di 07.12.10 11:49
Meiner Meinung nach sehr sinnvoll. Ich will ja durch das i den StringGrid füllen. Und ohne das i+1 bekomme ich das i doch nicht größer? Oder seh ich gerade den Wald vor lauter Bäumen nicht mehr?
Gausi - Di 07.12.10 11:51
Das erhöhen um 1 ist sicherlich sinnvoll, aber warum setzt du es bei jedem Schleifendurchlauf am Anfang wieder zurück auf 0? Dadurch ist i am Ende der Schleife immer 1.
PyroFa - Di 07.12.10 11:52
Oh das war Dumm von mir. Also i:=0 vor der Schleife setzen. Danke!
Edit: Jetzt läuft es. Hier noch mal der Quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| i:=0;
s1:=AW.text; s3:=ND.Text; i1:=strtofloat(s1); i2:=strtofloat(s3); i1:=i1/i2; s2:=floattostr(i1); Erg.text:=s2;
nud:=strtoint(ND.Text);
StringGrid1.RowCount := strtoint(ND.Text)+1;
while i < nud do begin x:=0; y:=i+1; i:=i+1; StringGrid1.Cells[x, y] := inttostr(i); end; |
Tastaro - Di 07.12.10 12:44
Delphi-Quelltext
1: 2: 3: 4:
| for i := 1 to nud - 1 do begin StringGrid1.Cells[0, i] := inttostr(i); end; |
sollte etwa das gleiche tun wie deine while-Schleife.
Oder als while-Schleife:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| i := 1; while i < nud do begin StringGrid1.Cells[0, i] := inttostr(i); inc(i); end; |
Und dann kann man noch das tun:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| i1 := strtofloat(AW.text); i2 := strtofloat(ND.Text); i1 := i1/i2; Erg.text := floattostr(i1); nud := strtoint(ND.Text); StringGrid1.RowCount := nud + 1; |
Beste Grüße
PyroFa - Di 07.12.10 13:44
| Zitat: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| i := 1; while i < nud do begin StringGrid1.Cells[0, i] := inttostr(i); inc(i); end; |
Und dann kann man noch das tun:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| i1 := strtofloat(AW.text); i2 := strtofloat(ND.Text); i1 := i1/i2; Erg.text := floattostr(i1); nud := strtoint(ND.Text); StringGrid1.RowCount := nud + 1; |
|
Was bewirken die beiden Sachen denn anderes?
PyroFa - Di 14.12.10 09:56
Guten Morgen,
habe mal wieder eine kleine Frage zu meinem Programm. Bis jetzt lief es mit dem Programmieren soweit eigentlich recht easy aber nu komm ich gar nicht mehr weiter. Habe folgenden Quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| while j < nud do begin x:=0; y:=j+1; j:=j+1; StringGrid2.Cells[x, y] := inttostr(j);
x:=1; y:=1; StringGrid2.Cells[x, y] := floattostr(anfbudeg);
x:=2; y:=j; max:=(anfwdeg/i2)*100; dabschrbetrag:=(anfwdeg/i2)*2.5;
if dabschrbetrag > max then begin dabschrbetrag:=max; end; StringGrid2.Cells[x, y] := floattostr(dabschrbetrag);
x:=3; y:=j; restbudeg:=restbudeg-dabschrbetrag; StringGrid3.Cells[x, y] := floattostr(restbudeg); anfwdeg:=restbudeg;
x:=1; y:=j+1; StringGrid3.Cells[x, y] := floattostr(anfwdeg); end; |
In dem StringGrid wird mir allerdings nur der Anfangswert bei X:=0 und Y:=1 ausgegeben und der degressive Abschreibungsbetrag. Alle anderen Grids lassen sich partout nicht füllen.
Wäre nett, wenn sich das mal jemand kurz anschauen könnte und mir schreiben könnte was ich falsch mache.
MfG
PyroFa
Edit: Hat sich erledigt, hab meinen Fehler nun doch gefunden. Jetzt stellt sich mir nur noch die Frage, wie ich die Ergebnisse mit nur zwei Stellen nach dem Komma und evtl. einem Euro-Zeichen ausgeben kann
bummi - Di 14.12.10 10:16
Deine Zelladressierung stimmt nicht, Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5:
| x:=0; y:=j+1; j:=j+1; StringGrid2.Cells[x, y - j] := inttostr(j); |
PyroFa - Di 14.12.10 10:28
Das mit der Adressierung hab ich eben gefunden. Das ist bereits behoben. Aber wie bekomme ich die Werte gerundet. So wie bei Konsolenanwendungen mit Variable:4:2 gehts nicht. Und auch nicht, wenn ich die : durch , ersetze.
MaxWurzel - Di 14.12.10 10:49
bummi - Di 14.12.10 10:52
Oder da Du es als Strings ausgibst per z.B. Format('0.00',value)
PyroFa - Di 14.12.10 11:14
Wie würde das mit dem Format dann genau laufen?
bummi - Di 14.12.10 11:32
Delphi-Quelltext
1:
| Stringrid.Cells[x,y] := Format('0.00 €', DeinFloatWert); |
Du solltest RoundTo trotzdem verwenden um mit den richtigen Werten weiterzurechnen, daß Du z.B. nicht mehr/weniger abziehst als Du anzeigst.
PyroFa - Di 14.12.10 11:36
Ok das so weit ist verstanden. Aber wenn ich jetzt folgenden Code habe:
Delphi-Quelltext
1:
| StringGrid1.Cells[x, y] := Format ('0.00 €', floattostr(anfbuch)); |
so:
StringGrid1.Cells[x, y] := Format ('0.00 €', anfbuch);
gehts übrigens auch nicht :(
bekomme ich folgende Fehlermeldung:
Error: Incompatible type for arg no. 2: Got "AnsiString", expected "Array Of Const"
Was hab ich nu falsch gemacht?
bummi - Di 14.12.10 12:07
Sorry, ich habe gepennt....
hier wird bei 12121.231212 der Floatwert X, nicht FloatToStr(X) erwartet
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin Caption:= Format('%0.2f €', [12121.231212]) end; |
Markier einfach mal Format und drücke auf F1
PyroFa - Di 14.12.10 12:26
Es läuft. Vielen Dank an alle die mitgeholfen haben :)
@Mods: Soll das Projekt hier noch hochgeladen werden?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!