Entwickler-Ecke
Sonstiges (Delphi) - Stromrechnung-Errechnungsprogramm
Maaaaart - Mo 22.03.10 19:08
Titel: Stromrechnung-Errechnungsprogramm
Ich habe beim Lösen der Aufgabe die wir heute im Informatikunterricht aufbekommen haben.
Die Aufgabe lautet wie folgt:
| Zitat: |
Erstelle ein Programm mit dem sich die Kunden des Elektrizitätsunternehmens nach Eingabe des alten und des neuen Zählerstandes die Jahresabrechnung erstellen können.
Berechnungsverfahren:
Grundgebühr: 28,47 €
Bei Verbrauch bis 299 kwh = 0,148 €/kwh
Bei Verbrauch über 299 kwh = 0,133 €/kwh
In diesen Preisen ist die Umsatzsteuer bereits enthalten.
Muss allerdings vom Programm noch einmal gesondert ausgewiesen werden.
Die Vorzahlungssumme (für das nächste Jahr) soll auch ausgewiesen werden.
Diese beträgt 1/6 des Rechnungsbetrages.
Zudem soll das Programm Falscheingaben mit ordentlichen Fehlermeldungen abweisen. |
Ich habe mich also vor knapp zwei Stunden an die Lösung dieser Aufgabe gesetzt und habe erst einmal probiert aus den bisherigen Projekten die wir in der Schule erstellt haben etwas zusammenzubasteln.
Und dachte eigentlich das es ganz gut ist.
Nur jetzt bin ich an einer Stelle an der ich nicht mehr weiterkomme.
Starten lässt sich das Programm noch, aber wenn ich Werte eingebe und dann auf OK klicke dann zeigt es mir einen Fehler an, den ich leider nicht so ganz verstehe.
Der Fehler besagt: "Acces violation at address 004539C0 in module 'StrahlendeZukunftII.exe'. Read of address 00000008.
Leider bin ich nicht so Delphi-gewandt als das ich wüsste was zu tun.
Mir würde riesig geholfen sein, wenn jemand mir mit dem Problem helfen könnte.
Danke im Vorraus!
PS: Das Die Buttons & Labels noch nicht ordentlich beschriftet sind ist mit Absicht, so sieht man den Namen des betreffenden Objekts immer sofort. :)
Moderiert von
Narses: I- in Quote-Tags gewandelt.
Moderiert von
Narses: Binaries aus dem Archiv entfernt.
SvenAbeln - Mo 22.03.10 19:35
Dein TFenster.FormCreate wird nicht aufgerufen, da es nicht beim OnCreate eingetragen ist.
Daher wird dein Objekt Rechnung nicht erzeugt und du bekommst die Accesviolation wenn du versuchst auf Rechnung zuzugreifen.
Außerdem solltest du Rechnung im OnDestroy wieder freigeben.
Narses - Mo 22.03.10 19:54
Moin und :welcome: im Forum!
Warum dein Projekt eine Exception wirft, hat dir
SvenAbeln ja bereits erklärt. Damit sowas erst gar nicht passieren kann, würde ich die Rechnungs-Unit etwas anders aufbauen:
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: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
| unit uRechnung;
interface
type TRechnung = class private FZaehlerAlt, FZaehlerNeu, FVerbrauch: Integer; FPrProkwh, FZaehlergebuehr, FUmsatzsteuer, FVorrauszahlungssumme, FGesamtPr: Double; public procedure init; property ZaehlerAlt: Integer read FZaehlerAlt write FZaehlerAlt; property ZaehlerNeu: Integer read FZaehlerNeu write FZaehlerNeu; property Verbrauch: Integer read FVerbrauch; property PrProkwh: Double read FPrProkwh; property Zaehlergebuehr: Double read FZaehlergebuehr; property Umsatzsteuer: Double read FUmsatzsteuer; property Vorrauszahlungssumme: Double read FVorrauszahlungssumme; property Gesamtpr: Double read FGesamtPr; procedure Berechnen; function EingabeOK: Boolean; end;
var Rechnung :TRechnung;
implementation
procedure TRechnung.init; begin FZaehlerAlt := FZaehlerNeu; FZaehlerNeu := 0; FVerbrauch := 0; FPrProkwh := 0; FZaehlergebuehr := 0; FUmsatzsteuer := 0; FVorrauszahlungssumme := 0; FGesamtPr := 0; end;
procedure TRechnung.Berechnen; begin FVerbrauch := FZaehlerNeu - FZaehlerAlt;
case FVerbrauch of 1..299 : FPrProkwh := 0.148; else FPrProkwh := 0.133; end;
FZaehlergebuehr := 28.47; FGesamtPr := FVerbrauch * FPrProkwh + FZaehlergebuehr; FUmsatzsteuer := FGesamtPr - (FGesamtPr / 1.19); FVorrauszahlungssumme := FGesamtPr / 1.16666; end;
function TRechnung.EingabeOK: Boolean; begin Result := (FZaehlerAlt < FZaehlerNeu) and (FZaehlerAlt >= 0) and (FZaehlerNeu > 0); end;
initialization Rechnung := TRechnung.Create;
finalization Rechnung.Free;
end. |
Ich habe hier die unnützen Getter/Setter durch Properties ersetzt und die Gültigkeitsbedingung gekürzt, das interessantere ist aber das Anlegen der gloablen Variable Rechnung in der Unit und das Erzeugen und Freigeben in den zugehörigen Abschnitten (ganz unten). :idea:
Da du schon ganz ordentlichen Code abgeliefert hast, hier meine überarbeitete Version im Anhang. ;)
cu
Narses
Maaaaart - Mo 22.03.10 20:12
Danke ich bin sehr positiv überrascht wie schnell einem hier geholfen wird.
Echt super. :)
An
SvenAbeln Danke, das hat mein Problem gelöst!
An
Narses Ebenfalls Danke, an sich könnte ich jetzt deinen Quellcode schön kopieren und zufrieden sein, so wie ich es letztes Jahr noch getan hätte. Aber dieses Jahr will ich anders etwas erreichen.
Deshalb überhäufe ich dich nun mit Fragen. (Sorry, aber das muss sein ^^)
1. Was sind Properties?
2. Was bedeutet das "F" vor allen Variablen?
3. Was meinst du mit den letzten Zeilen Quelltext?
Delphi-Quelltext
1: 2: 3: 4: 5:
| initialization Rechnung := TRechnung.Create
finalization Rechnung.Free; |
Ich warte erst einmal auf eine Antwort, und falls ich alles verstehen sollte, dann überlege ich mir ob ich deine Variante nehme, andernfalls würde ich eher die Variante nehmen, die mir mein Lehrer auch zutraut. ;)
elundril - Mo 22.03.10 23:33
ad 1) Properties sind Eigenschaften. Bei visuellen Komponenten siehst du diese Eigenschaften dann auch im Object Inspektor.
ad 2) Das F bedeutet soweit ich weiß Field, also Feld. Damit ist einfach nur gemeint das es eine Variable ist. Diese kann durch die Properties verändert werden und zwar nur durch die Properties. Das hat den Vorteil das man diverse Überprüfungen machen kann wenn die Variable gesetzt wird. (Im Objektorientieren Programmieren wird dies als "Data Hiding", also "Daten Verstecken", genannt, da der Programmierer der das Objekt einsetzt nicht den Zugriff auf die Variable direkt hat)
ad 3) initialization und finalization sind optionale Abschnitte in einer Unit. Bei einem Programmstart werden alle Befehle die in dem Abschnitt initialization in den Units steht ausgeführt und bei finalization vor dem Beenden des Programms. Das macht diese Teile ideal um Objekte zu erzeugen und wieder freizugeben, was wichtig ist damit keine Speicherlecks entstehen.
Ich hoffe ich hab alles erklären können.
lg elundril
platzwart - Mo 22.03.10 23:37
elundril hat folgendes geschrieben : |
| ad 1) Properties sind Eigenschaften. Bei visuellen Komponenten siehst du diese Eigenschaften dann auch im Object Inspektor. |
Aber nur, wenn sie als
published deklariert wurden?!?
elundril - Mo 22.03.10 23:38
Jup, natürlich, hab ich vergessen, danke!
lg elundril
Narses - Mo 22.03.10 23:39
Moin!
Maaaaart hat folgendes geschrieben : |
| Deshalb überhäufe ich dich nun mit Fragen. (Sorry, aber das muss sein ^^) |
Kein Problem, dafür sind wir ja da. :beer:
Maaaaart hat folgendes geschrieben : |
| 1. Was sind Properties? |
Zu deutsch "Eigenschaften" einer Klasse. Du hast den Zugriff auf die privaten Variablen der Klasse nur über Methoden erlaubt, was immer einen Funktionsaufruf notwendig macht. Wenn man allerdings eine Eigenschaft deklariert, kann man diese im Zuweisungskontext verwenden, was sich häufig viel besser lesen lässt. Und nebenbei muss man auch noch nicht mal auf Setter-/Getter-Methoden verzichten, diese kann man nämlich bei der Deklaration statt dem direkten Zugriff auf die Feldvariablen (s.u.) angeben, dann hat man das sogar auch mit drin. So kann man z.B. virtuelle Werte abbilden, also Werte, die nirgendwo in der Klasse gespeichert sind, sondern dynamisch bei jeder Abfrage berechnet werden. :idea:
Da deine Setter-/Getter-Methoden aber primitiv waren (haben nur den Zugriff auf die privaten Variablen ermöglicht), machen sie keinen wirklichen Sinn, sondern nur überflüssigen Quelltext. Deshalb habe ich das auf Eigenschaften umgestellt, da ist das schon eingebaut. ;)
Maaaaart hat folgendes geschrieben : |
| 2. Was bedeutet das "F" vor allen Variablen? |
Hat den ganz praktischen Grund, dass du sonst eine private Variable und eine Eigenschaft des gleichen Namens hättest, was nicht erlaubt ist. Also stellt man den privaten Variablen der Klasse ein "F" voran (für Feldvariable), um sie von den Eigenschaften unterscheiden zu können. ;)
Maaaaart hat folgendes geschrieben : |
3. Was meinst du mit den letzten Zeilen Quelltext?
Delphi-Quelltext 1: 2: 3: 4: 5:
| initialization Rechnung := TRechnung.Create
finalization Rechnung.Free; | |
Ja, genau die meine ich, zusammen mit der Variablendeklaration von
Rechnung: TRechnung; weiter oben. Hier wird (fast) das gleiche gemacht, wie in den Formular-Units, da gibt´s ja auch eine globale Variable für das Formular-Objekt. Genau das machst du jetzt einfach auch in der Rechnungs-Unit, du legst hier das Objekt an und verwendest den
initialization-Abschnitt dazu, das Objekt im Speicher anzulegen und bei Programmende wird der Code aus dem
finalization-Abschnitt ausgeführt, der das Objekt wieder frei gibt. So hast du das Problem umgangen, dass du dein TRechnung-Objekt in der Formular-Unit anlegen und auch wieder freigeben musst. Denn eigentlich hat das nix zu suchen (Trennung von GUI und Datenhaltung).
Maaaaart hat folgendes geschrieben : |
| falls ich alles verstehen sollte, dann überlege ich mir ob ich deine Variante nehme, andernfalls würde ich eher die Variante nehmen, die mir mein Lehrer auch zutraut. ;) |
Alles, was du erklären kannst, wird dir dein Lehrer auch abnehmen, gibt ja keinen Grund, das zu verweigern, wenn du verstanden hast, was du da machst. Eine gute Quelle für "wo hast du das den her" ist natürlich die Delphi-Online-Hilfe, die bis einschließlich D7 wirklich gut ist (OK, danach ist das herausragende Merkmal eher, sie ist
vorhanden... :?). :idea:
Wenn du noch Fragen hast, immer her damit. :D
cu
Narses
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!