Autor Beitrag
Maaaaart
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 22.03.10 19:08 
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 user profile iconNarses: I- in Quote-Tags gewandelt.
Moderiert von user profile iconNarses: Binaries aus dem Archiv entfernt.
Einloggen, um Attachments anzusehen!
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 22.03.10 19:54 
Moin und :welcome: im Forum!

Warum dein Projekt eine Exception wirft, hat dir user profile iconSvenAbeln ja bereits erklärt. Damit sowas erst gar nicht passieren kann, würde ich die Rechnungs-Unit etwas anders aufbauen:
ausblenden volle Höhe 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
    // für die Rechnung benötigte Variablen
    FZaehlerAlt,
    FZaehlerNeu,
    FVerbrauch: Integer;
    FPrProkwh,
    FZaehlergebuehr,
    FUmsatzsteuer,
    FVorrauszahlungssumme,
    FGesamtPr: Double;
  public
    // Methoden bekannt machen
    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;           //FEHLER?!
  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
Einloggen, um Attachments anzusehen!
_________________
There are 10 types of people - those who understand binary and those who don´t.
Maaaaart Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 22.03.10 20:12 
Danke ich bin sehr positiv überrascht wie schnell einem hier geholfen wird.
Echt super. :)

An user profile iconSvenAbeln Danke, das hat mein Problem gelöst!

An user profile iconNarses 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?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Mo 22.03.10 23:37 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
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?!?

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mo 22.03.10 23:38 
Jup, natürlich, hab ich vergessen, danke!

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 22.03.10 23:39 
Moin!

user profile iconMaaaaart hat folgendes geschrieben Zum zitierten Posting springen:
Deshalb überhäufe ich dich nun mit Fragen. (Sorry, aber das muss sein ^^)
Kein Problem, dafür sind wir ja da. :beer:

user profile iconMaaaaart hat folgendes geschrieben Zum zitierten Posting springen:
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. ;)

user profile iconMaaaaart hat folgendes geschrieben Zum zitierten Posting springen:
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. ;)

user profile iconMaaaaart hat folgendes geschrieben Zum zitierten Posting springen:
3. Was meinst du mit den letzten Zeilen Quelltext?
ausblenden 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).

user profile iconMaaaaart hat folgendes geschrieben Zum zitierten Posting springen:
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

_________________
There are 10 types of people - those who understand binary and those who don´t.