Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Übungsprogramm "Kinokarten" (https://www.delphipraxis.net/191102-uebungsprogramm-kinokarten.html)

EdAdvokat 8. Dez 2016 12:54

Übungsprogramm "Kinokarten"
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

Luckie 8. Dez 2016 13:02

AW: Übungsprogramm "Kinokarten"
 
Wäre schön, wenn du noch schreiben würdest, welche Techniken im Einzel demonstriert werden.

EdAdvokat 8. Dez 2016 13:59

AW: Übungsprogramm "Kinokarten"
 
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.

Ghostwalker 8. Dez 2016 19:35

AW: Übungsprogramm "Kinokarten"
 
Na gut...dann Start ich mal die Meckerrunde :twisted:


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;

Der schöne Günther 8. Dez 2016 20:34

AW: Übungsprogramm "Kinokarten"
 
Zitat:

Zitat von Ghostwalker (Beitrag 1355738)
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.

EdAdvokat 8. Dez 2016 20:58

AW: Übungsprogramm "Kinokarten"
 
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

Aviator 8. Dez 2016 22:25

AW: Übungsprogramm "Kinokarten"
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1355739)
Zitat:

Zitat von Ghostwalker (Beitrag 1355738)
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. :-D

himitsu 8. Dez 2016 22:33

AW: Übungsprogramm "Kinokarten"
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Aviator (Beitrag 1355741)
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. :-D

Siehe der Dateieigenschaftendialog des Explorers :zwinker:

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. :twisted:
Delphi-Referenz durchsuchenVcl.StdCtrls.TEdit.NumbersOnly

EdAdvokat 9. Dez 2016 19:36

AW: Übungsprogramm "Kinokarten"
 
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.

himitsu 9. Dez 2016 22:25

AW: Übungsprogramm "Kinokarten"
 
Zitat:

Zitat von EdAdvokat (Beitrag 1355804)
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 :lol:
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 (
Delphi-Quellcode:
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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:02 Uhr.
Seite 1 von 6  1 23     Letzte » 

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf