AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Übungsprogramm "Kinokarten"

Übungsprogramm "Kinokarten"

Ein Thema von EdAdvokat · begonnen am 8. Dez 2016 · letzter Beitrag vom 16. Jan 2017
Antwort Antwort
Seite 1 von 6  1 23     Letzte » 
EdAdvokat
Registriert seit: 1. Mai 2016
Ein kleines Beispielprogramm "Kinokarten". Der Nutzen sei mal dahingestellt, doch wären einige Tips füe die Dateneingabe und Verarbeitung für Anfänger vermutlich nicht verkehrt.
Angehängte Dateien
Dateityp: zip kinoKarten1.zip (86,1 KB, 37x aufgerufen)
 
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#2
  Alt 8. Dez 2016, 13:02
Wäre schön, wenn du noch schreiben würdest, welche Techniken im Einzel demonstriert werden.
Michael
  Mit Zitat antworten Zitat
EdAdvokat

 
Delphi 10.2 Tokyo Professional
 
#3
  Alt 8. Dez 2016, 13:59
Es handelt sich um ein bescheidenes Beispielprogramm für eine Kinokasse. Es können Kartenbestellungen
für 3 Preisklassen aufgegeben werden, für die das Programm dann den Brutto- und Nettopreis sowie die
Mehrwertsteuer ausgibt. Zugleich wird die Zahl der verkauften Karten und die Zahl der noch freien Plätze
angezeigt.
Also einfache Berechnungen, bedingte Eingaben, Fehlerbehandlung, Exceptions im bescheidenen Umfang sind
das Thema.
Es ist meine erste Veröffentlichung hier.
Norbert
  Mit Zitat antworten Zitat
Ghostwalker

 
Delphi 10.3 Rio
 
#4
  Alt 8. Dez 2016, 19:35
Na gut...dann Start ich mal die Meckerrunde


Zuerstmal UI (Oberfläche):

- Edit-Felder sollten für die Eingabe verwendet werden..nicht für reine Ausgaben (dafür gibts StaticText/Label...)

- Die Checkboxen für die einzelnen Ränge sind an und für sich Überflüssig. Wenn der User für
eine Preiskategorie eine Anzahl erfasst, will er sie auch berechet haben


Zur Umsetzung:

- Das Abfangen der Tasten in den Edit-Feldern ist löblich. Aber a) fehlen einige Tasten (10'er-Tastatur usw.). b) gehts einfacher mit MaskEdit

- Statt Anz1, Anz2, Anz3 : integer und R1,R2,R3 : real würd ich Array's verwenden. Damit lässt sich das ganze einfacher erweitern (Das nächste Kino hat 5 Preiskategorien, ein anderes 2...)


- Fixe Werte im Quelltext sollte man vermeiden. Entweder über Konstanten oder, wenn eventuell später Erweiterungen geplant sind, über Config-/Inidateien.

Anmerkung zur Code-Lesbarkeit:


Schwer Lesbar:

Delphi-Quellcode:
   try
  Anz1:=strtoint(Edit2.Text);
  if checkbox1.Checked then R1:=Anz1*15.00
    else R1:=0.0;
  if not checkbox1.Checked then
    Anz1:=(0);

  Anz2:=strtoint(Edit3.Text);
  if checkbox2.Checked then R2:=Anz2*13.00
    else R2:=0.0;
  if not checkbox2.Checked then
    Anz2:=0;

  Anz3:=strtoint(Edit4.Text);
  if checkbox3.Checked then R3:=Anz3*10.00
    else R3:=0.0;
  if not checkbox3.Checked then
    Anz3:=0;

      ZwSu:=ZwSu+R1+R2+R3;
      Steuer:=ZwSu*0.19;
      Endpreis:=ZwSu+Steuer;
      Edit5.Text:=floattostrF(Endpreis, ffCurrency, 8,2);

    showMessage('Der Preis '+floattostrF(Endpreis,ffCurrency, 8,2)+' setzt sich zusammen aus '+floattostrF(zwSu,ffCurrency, 8,2)+' Netto plus '#10#13+floattostrF(Steuer, ffCurrency, 8,2)+' MWSt');
      Gesamt:= Anz1+Anz2+Anz3;
      Kinopl:=Kinopl-Gesamt;
        Edit1.Text:=inttostr(Gesamt);
        edit6.Text:=inttostr(Kinopl);
        zwSu:=0.0;
        Steuer:=0.0;
        Endpreis:=0.0;
  except
    on EConvertError do showMessage(Fehler);
  end;

Besser:

Delphi-Quellcode:
  try
   Anz1:=strtoint(Edit2.Text);
   if checkbox1.Checked then
     R1:=Anz1*15.00
   else
     R1:=0.0;
   if not checkbox1.Checked then
     Anz1:=(0);

   Anz2:=strtoint(Edit3.Text);
   if checkbox2.Checked then
     R2:=Anz2*13.00
   else
     R2:=0.0;
   if not checkbox2.Checked then
      Anz2:=0;

   Anz3:=strtoint(Edit4.Text);
   if checkbox3.Checked then
     R3:=Anz3*10.00
   else
     R3:=0.0;
   if not checkbox3.Checked then
     Anz3:=0;

   ZwSu:=ZwSu+R1+R2+R3;
   Steuer:=ZwSu*0.19;
   Endpreis:=ZwSu+Steuer;
   Edit5.Text:=floattostrF(Endpreis, ffCurrency, 8,2);

   showMessage('Der Preis '+floattostrF(Endpreis,ffCurrency, 8,2)+' setzt sich zusammen aus '+floattostrF(zwSu,ffCurrency, 8,2)+' Netto plus '#10#13+floattostrF(Steuer, ffCurrency, 8,2)+' MWSt');
   Gesamt:= Anz1+Anz2+Anz3;
   Kinopl:=Kinopl-Gesamt;
   Edit1.Text:=inttostr(Gesamt);
   edit6.Text:=inttostr(Kinopl);
   zwSu:=0.0;
   Steuer:=0.0;
   Endpreis:=0.0;
  except
    on EConvertError do showMessage(Fehler);
  end;
Uwe
  Mit Zitat antworten Zitat
Der schöne Günther
Online

 
Delphi 10 Seattle Enterprise
 
#5
  Alt 8. Dez 2016, 20:34
Edit-Felder sollten für die Eingabe verwendet werden..nicht für reine Ausgaben (dafür gibts StaticText/Label...)
Finde ich überhaupt nicht. Aus einem Edit-Feld kannst du komfortabel den Inhalt markieren und kopieren. Mit einem Label nicht.
  Mit Zitat antworten Zitat
EdAdvokat

 
Delphi 10.2 Tokyo Professional
 
#6
  Alt 8. Dez 2016, 20:58
Also konstruktive Kritik ist nützlich.
Es ist mein erstes Programm, dass ich je hochgeladen habe, obwohl ich so ganz jung nicht mehr bin.
Es war von Anfang an als Beispielprogramm geplant, um einiges auszuprobieren, aus Spaß an der Freude aber nie für
einen realen Zweck.
Sicher sind die Checkboxen nicht wirklich nötig, doch die Spielerei mit den Bedingungen fand ich nicht schlecht.
Ja eine Eingabe über Maskedit wäre besser, doch so hätte ich auf die Eingabenbehandlung verzichten müssen und das
wollte ich eigentlich nicht. Was mit der 10-er Tastatur gemeintist, habe ich nicht verstanden. Ich dachte alles erfaßt zu haben.
Die Anregung arrays zu verwenden ist ok. So wäre das Ganze besser ausbaufähig, werde ich mir merken.
Die Lesbarkeit des Quelltextes ist immer verbesserungsmöglich.
Auch meine Ausgabe über ShowMessage ist nicht wirklich der Hit, dass muss ich gegen mich hier mal feststellen.
Ich hätte gar nicht gedacht, dass so ein kleines "Programmchen" so viel Beachtung findet.
Es hilft mir als reiner Hobby-Programmierer wirklich weiter. Vielen Dank
Norbert
  Mit Zitat antworten Zitat
Aviator

 
Delphi 10.3 Rio
 
#7
  Alt 8. Dez 2016, 22:25
Edit-Felder sollten für die Eingabe verwendet werden..nicht für reine Ausgaben (dafür gibts StaticText/Label...)
Finde ich überhaupt nicht. Aus einem Edit-Feld kannst du komfortabel den Inhalt markieren und kopieren. Mit einem Label nicht.
Ich auch nicht. Und wenn man den Text kopieren will und es aussehen soll wie ein Label, dann stellt man einfach den BorderStyle auf bsNone.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#8
  Alt 8. Dez 2016, 22:33
Ich auch nicht. Und wenn man den Text kopieren will und es aussehen soll wie ein Label, dann stellt man einfach den BorderStyle auf bsNone.
Siehe der Dateieigenschaftendialog des Explorers

Zitat:
Delphi-Quellcode:
var
  Anz1, Anz2, Anz3, Gesamt, Kinopl : integer;
  R1, R2, R3, zwSu, Steuer, Endpreis : real;
Gerade als "Beispielprogramm", da sollte schon jemand für die globalen Variablen gesteinigt werden.
Ganz schlimm daran ist vorallem, dass viele dieser Variablen auch nur für lokale Zwischenergebnisse verschwendet verwendet werden.

Zitat:
Delphi-Quellcode:
const Fehler=('Es ist ein Eingabefehler aufgetreten. Bitte prüfen!');

try

except
  on EConvertError do showMessage(Fehler);
end;
Was ist mit anderen Fehlern/Exceptiontypen?

Warum manuell anzeigen, wenn Exceptions sowieso automatisch angezeigt werden?
Vorallem wenn man dann die eigentliche aussagefähige Fehlermeldung "vernichtet", in welcher sogar der fehlerhafte Wert genannt wurde, der in irgendeinem der vielen Edits steht.


Und dann noch die total aussagefähigen Bezeichner.
Edit1, CheckBox1, ...

Gut, der fehlende Ziffernblock wurde schon genannt, aber da gibt es noch einen anderen Bug.
Delphi-Referenz durchsuchenVcl.StdCtrls.TEdit.NumbersOnly
Miniaturansicht angehängter Grafiken
kinokarten1.png   kinokarten2.png  

Geändert von himitsu ( 8. Dez 2016 um 23:23 Uhr)
  Mit Zitat antworten Zitat
EdAdvokat

 
Delphi 10.2 Tokyo Professional
 
#9
  Alt 9. Dez 2016, 19:36
vielen Dank für die Anregungen.
"Der eine meint, er wäre fertig, doch die anderen sehen, er beginnt erst..."
NumbersOnly in den EditFeldern habe ich auf true gesetzt und hoffe damit, dass das "ich bin böse"-Phänomen damit nicht mehr auftreten kann.
Es lassen sich nun tatsächlich nur Zahlen eingeben. (Tastatur und Nummernblock). Ich habe noch immer nicht verstanden was ich ändern sollte hinsichtlich des Nummernblocks, 10-er Tastatur??? Welche falschen Eingaben müssen also noch abgefangen werden? Was ist damit gemeint?
Natürlich muss eine Überwachung der verkauften Karten in Bezug auf die Gesamtzahl der Plätze erfolgen. Mehr noch es muss unterteilt werden,
wieviel Karten im 1.,2. und 3. Rang vorhanden bzw. schon verkauft wurden. Das wird recht unübersichtlich, doch ich arbeite daran.
Die globalen Variablen wurden bereits in lokale umgewandelt und auch haben die Bezeichner aussagekräftigere Namen erhalten.
Auf die CheckBoxen habe ich verzichtet. Noch läuft es nicht ganz rund.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#10
  Alt 9. Dez 2016, 22:25
NumbersOnly in den EditFeldern habe ich auf true gesetzt und hoffe damit, dass das "ich bin böse"-Phänomen damit nicht mehr auftreten kann.
ähhhhhhh, naja
Aber es steht zumindestens in der Hilfe, dass Delphi Windows das Problem nicht gelöst, aber zumindestens dokumentiert hat.
Zumindestens macht das den eigenen Code "einfacher" und der Nummernblock wurde beachtet.

Im Prinzip müsste man "alle" möglichen Quellen für Text prüfen/behandeln.
Du kannst Text zuweisen (Edit.Text := 'abc' ), man kann einfügen (Copy&Paste) und das per mehreren ShortCuts (Strg+V, Shift+Einfg, ...), über das Kontextmenü und mehrere andere WindowsMessages.
Aber der sicherste Weg ist, wenn man auch noch im OnChange den Text auf ungültige Zeichen prüft.
Problem hierbei ist aber, dass "kurzzeitig" auch mal "ungültige" Werte erlaubt sein sollte, drum da nur optische/farbige Meldungen und erst im OnExit und beim Auslesen schärfer prüfen.
Das gilt vorallem dann, wenn z.B. auch das Vorzeichen und Tausender- oder Dezimaltrennzeichen drin vorkommen dürfen.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz