Entwickler-Ecke

Sonstiges (Delphi) - Delphi Bußgeldrechner aktualisiert manche Ergebnisse nicht


Vorschlag - Mi 06.01.10 16:07
Titel: Delphi Bußgeldrechner aktualisiert manche Ergebnisse nicht
Hallo liebe Delphi Community


Also, ich habe ein Programm erstellt, mit dem man die Strafe bei einer Übertretung der zulässigen Geschwindigkeit im Straßenverkahr berechnen kann. Nun klappt auch alles, doch wenn man eine Strafe berechnet hat, und danach wieder eine minderwertige strafe ausrechnen will, bleiben die Punkte(Flensburg) und die Zeit des Fahrverbots immer auf dem vorherigen Stand, und werden nicht neu berechnet. #

Kann mir bitte jemand helfen???

Danke

Moderiert von user profile iconTino: Großbuchstaben im Titel ersetzt.


Narses - Mi 06.01.10 16:13

Moin!

Bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Richtlinien [http://www.entwickler-ecke.de/richtlinien.html]:
1.2 Beiträge:
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]
Einfach oben bei Deinem ersten Beitrag auf user defined image oder user defined image klicken und den Titel ändern. Danke Dir!

cu
Narses


Delete - Mi 06.01.10 16:17

Funktioniert doch alles. Ich kann das beschriebenen Fehlverhalten nicht nachvollziehen.


Vorschlag - Mi 06.01.10 16:42

Hey luckie

Also bei mir funktioniert das nicht. Vielleicht habe ich es etwas ungenau beschrieben:
Also, wenn ich z.B 25 Km/h zu schnell eingebe, kommen z.B 80€ raus und 1 Punkt. Wenn ich danach im selben Fenster nur noch 10 Km/h zu schnell eingebe, dann bleibt der Punkt stehen, und nur das Bußgeld verändert sich. Also steht dann bei 10 Km/h 10 € und 1 Punkt, obwohl es nicht stimmt.
Also schätze ich, dass das Programm einfach nur das busgeld neu berechnet, aber nicht die Punkte bzw. das Fahrverbot.


Ist es jetzt genauer?


Tilman - Mi 06.01.10 16:48

Das liegt daran weil du die Caption nicht zurücksetzt.

Delphi-Quelltext
1:
2:
3:
4:
if zahl3 <=10
then
    Lbbusgeld.Caption:='10'+'€'  // <-- hier wird nur Busgeld zurückgesetzt, das Caption für Punkte bleibt.
    else


Delete - Mi 06.01.10 17:47

Und hier die saubere, übertriebene mit Spatzen auf Kanonen geschossene Lösung*:

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:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
unit BussgeldClass;

interface

type
  iaInnerortsAusserOrts = (iaInnen, iaAussen);

type
  TStrafe = class (TObject)
  private
    FDifGeschW: Cardinal;
    FBussgeld: Cardinal;
    FPunkte: Cardinal;
    FMonateFahrverbot: Cardinal;
    function GetGeschw: Cardinal;
    procedure SetGeschw(value: Cardinal);
  public
    Constructor Create(ADifGeschw: Cardinal);
    procedure BerechneStrafe; virtualabstract;
    property DifGeschw: Cardinal read GetGeschw write SetGeschw;
    property Bussgeld: Cardinal read FBussgeld;
    property Punkte: Cardinal read FPunkte;
    property MonateFahrverbot: Cardinal read FMonateFahrverbot;
  end;

  TStrafeInnen = class(TStrafe)
  public
    procedure BerechneStrafe; override;
  end;

  TStrafeAussen = class(TStrafe)
  public
    procedure BerechneStrafe; override;
  end;

  TBussgeld = class(TObject)
  private
    FInnerortsAusserorts: iaInnerortsAusserorts;
    FDifGeschw: Cardinal;
    FStrafe: TStrafe;
  public
    Constructor Create(ADifGeschw: Cardinal; InnerortsAusserorts: iaInnerortsAusserOrts);
    Destructor Destroy; override;
    procedure BerechneStrafe;
    property Strafe: TStrafe read FStrafe;
  end;

implementation

{ TBussgeld }

procedure TBussgeld.BerechneStrafe;
begin
  case FInnerortsAusserorts of
    iaInnen:
    begin
      FStrafe := TStrafeInnen.Create(FDifGeschw);
      FStrafe.BerechneStrafe;
    end;
    iaAussen:;
  end;
end;

constructor TBussgeld.Create(ADifGeschw: Cardinal; InnerortsAusserorts: iaInnerortsAusserOrts);
begin
  inherited Create;
  FDifGeschw := ADifGeschw;
  FInnerortsAusserorts := InnerortsAusserorts;
end;

destructor TBussgeld.Destroy;
begin
  FStrafe.Free;
  inherited;
end;

{ TStrafe }

constructor TStrafe.Create(ADifGeschw: Cardinal);
begin
  inherited Create;
  FBussgeld := 0;
  FPunkte := 0;
  FMonateFahrverbot := 0;
  FDifGeschw := ADifGeschw;
end;

function TStrafe.GetGeschw: Cardinal;
begin
  Result := FDifGeschW;
end;

procedure TStrafe.SetGeschw(value: Cardinal);
begin
  FDifGeschW := value;
end;

{ TStrafeAussen }

procedure TStrafeAussen.BerechneStrafe;
begin

end;

{ TStrafeInnen }

procedure TStrafeInnen.BerechneStrafe;
begin
  if DifGeschw <= 10 then {**}
  begin
    FBussgeld := 15;
    FPunkte := 0;
    FMonateFahrverbot := 0;
  end
  else if DifGeschw <= 15 then
  begin
    FBussgeld := 25;
    FPunkte := 0;
    FMonateFahrverbot := 0;
  end
  else if DifGeschw <= 20 then
  begin
    FBussgeld := 35;
    FPunkte := 0;
    FMonateFahrverbot := 0;
  end
  else if DifGeschw <= 30 then
  begin

  end
  else if DifGeschw <= 40 then
  begin

  end
  else if DifGeschw <= 50 then
  begin

  end
  else if DifGeschw <= 60 then
  begin

  end
  else if DifGeschw <= 70 then
  begin

  end
  else if DifGeschw > 70 then
  begin

  end
end;

end.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.BTinnerortsClick(Sender: TObject);
var
  DifGeschw: Cardinal;
  Bussgeld: TBussgeld;
begin
  DifGeschw := StrToInt(Edgefahren.Text) - StrToInt(Ederlaubt.Text);
  Bussgeld := TBussgeld.Create(DifGeschw, iaInnen);
  try
    Bussgeld.BerechneStrafe;
    Lbbusgeld.Caption := IntToStr(Bussgeld.Strafe.Bussgeld);
    Lbpunkte.Caption := IntToStr(Bussgeld.Strafe.Punkte);
    Lbfahrverbot.Caption := IntToStr(Bussgeld.Strafe.MonateFahrverbot);
  finally
    Bussgeld.Free;
  end;
end;


Viel Spass.

*) Veranschaulicht aber sehr schön das OOP Konzept mit Vererbung und abstrakten Methoden.
**) Eventuell ginge es auch irgendwie mit case oder so einfacher.


Vorschlag - Mi 06.01.10 18:06

Okay es funktioniert


ihr seid die Besten!!!!!




VIELEN DANK JUNGS


Delete - Mi 06.01.10 18:08

Hast du meine Lösung verstanden? Oder soll ich dazu noch was erklären?

Kritik von anderen sind auch erwünscht.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Nichts auszusetzen an meinem Code? Auch gut. ;)


Delete - Do 07.01.10 13:39

Man könnte natürlich überlegen, ob man über die Klasse TBussgeld geht oder nicht doch direkt die Klasse TStrafe benutzt. Aber eventuell will man später noch die Funktionalität erweitern und es macht dann mehr Sinn, dies über die Klasse TBussgeld zu realisieren.


Bergmann89 - Do 07.01.10 14:12

Hey,

Ich hab was zu Meckern^^ Wie wäre es mit iaKraftfahrstraße? Da gibts ja auch andere Strafen, oder irre ich mcih da jetzt?

MfG Bergmann


Delete - Do 07.01.10 14:17

Keine Ahnung, ob außerorts zwischen Autobahn und Bundesstraße unterschieden wird. Aber da hatte ich echt ein Problem bei der Benennung. ,)


Bergmann89 - Do 07.01.10 14:35

Hey,

also hier ma der Katalog: http://www.bussgeldkataloge.de/
Hab das verwechselt: Auf der Kraftfahrstraße is die Toleranzgrenze höher, wegen der gößerer Geschwindigkeit, aber da man ja eh eingibt, wieviel man zu schnell war und nich wie schnell man war, is das ja egal^^

MfG Bergmann.


Tilman - Do 07.01.10 14:42

Naja wobei die Toleranz wiederum glaub ich nichts mit der Kraftfahrstraße zu tun hat glaub ich, sondern eben nur mit der Geschwindigkeit, sprich wenn du auf der Autobahn in ner 50-Zone (Baustelle) zu schnell fährst dürfte das nicht anders geahndet werden als auf ner Landstraße nehm ich mal an.