AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Übungsprogramm "Kinokarten"
Thema durchsuchen
Ansicht
Themen-Optionen

Übungsprogramm "Kinokarten"

Ein Thema von EdAdvokat · begonnen am 8. Dez 2016 · letzter Beitrag vom 16. Jan 2017
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.505 Beiträge
 
Delphi 12 Athens
 
#1

AW: Übungsprogramm "Kinokarten"

  Alt 8. Dez 2016, 21: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  
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Übungsprogramm "Kinokarten"

  Alt 9. Dez 2016, 18: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

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.505 Beiträge
 
Delphi 12 Athens
 
#3

AW: Übungsprogramm "Kinokarten"

  Alt 9. Dez 2016, 21: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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
EdAdvokat
Online

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Übungsprogramm "Kinokarten"

  Alt 12. Dez 2016, 13:05
Hier nun mein zweiter Versuch "Kinokarten" mit Karten für den 1. bis 3. Rang und Bedingungen für die Platzanzahl in Bezug auf die verkauften Karten.
Ich hoffe den Hinweis Arrays zu verwenden habe ich richtig verstanden und einige weitere Veränderungen haben das kleine Übungsprogramm etwas aufgewertet.
Angehängte Dateien
Dateityp: zip Kinokarten2.zip (87,2 KB, 7x aufgerufen)
Norbert
  Mit Zitat antworten Zitat
EdAdvokat
Online

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Übungsprogramm "Kinokarten"

  Alt 14. Dez 2016, 13:07
So perfekt kann das Programm doch nicht gewesen sein, dass bislang keine Kritik folgte. Hier nun meine vorerst letzte Version mit einigen zusätzlichen Funktionen wie Kontextmenü und Preise für ermäßigte Karten.
Angehängte Dateien
Dateityp: zip Kinokarten3.zip (57,2 KB, 5x aufgerufen)
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Übungsprogramm "Kinokarten"

  Alt 14. Dez 2016, 14:23
Ich habe es noch nicht angeguckt.

Delphi-Quellcode:
procedure TForm1.CloseExecute(Sender: TObject);
begin
  Application.Terminate;
end;
Was ist denn das? Warum kein einfaches Close? Klar, kann ich beim Auto einfach den Zündschlüssel abziehen. Aber normalerweise bremst man, hält an, leg den ersten Gang ein, zieht die Handbremse, macht dann den Motor aus und zieht den Zündschlüssel ab.

Delphi-Quellcode:
procedure TForm1.EdRang1KeyPress(Sender: TObject; var Key: Char);
begin
   if not (Key in ['0'..'9', FormatSettings.DecimalSeparator, FormatSettings.ThousandSeparator, Char(VK_BACK)]) then
    Key := #0;
end;
Die Prozedur kommt neunmal vor und ist immer identisch. Einmal schreiben und allen Komponenten diese eine Ereignissprozedur zu weisen.

Delphi-Quellcode:
procedure TForm1.PreisExecute(Sender: TObject);
var anz : array[1..3] of integer;
    Rang : array[1..3] of integer;
    zwSu, Steuer, Endpreis : real;
begin
   try
      Anz[1]:=0;
      Anz[2]:=0;
      Anz[3]:=0;
      ZwSu:=0.0;
      Steuer:=0.0;
      Endpreis:=0.0;

//Eingabe der Kartenanzahl zum Kauf
      EdRang1.SetFocus;
      Anz[1]:=strtoint(EdRang1.Text);
      Rang[1]:=Anz[1]*15;
        if ckbxR1.Checked then Rang[1]:=Rang[1]-(Rang[1]div 10)
          else if not ckbxR1.checked then
            Rang[1]:=Anz[1]*15;
        if frKaR[1]<Anz[1] then
          begin
            Showmessage('Sie wollen mehr Karten 1. Rang verkaufen als Plätze vorhanden sind!');
             exit;
          end;

      Anz[2]:=strtoint(EdRang2.Text);
      Rang[2]:=Anz[2]*13;
        if ckbxR2.Checked then Rang[2]:=Rang[2]-(Rang[2]div 10)
          else if not ckbxR2.checked then
            Rang[2]:=Anz[2]*13;
        if frKaR[2]<Anz[2] then
          begin
            Showmessage('Sie wollen mehr Karten 2. Rang verkaufen als Plätze vorhanden sind!');
             exit;
          end;

      Anz[3]:=strtoint(EdRang3.Text);
      Rang[3]:=Anz[3]*10;
        if ckbxR3.Checked then Rang[3]:=Rang[3]-(Rang[3]div 10)
          else if not ckbxR3.checked then
            Rang[3]:=Anz[3]*10;
         if frKaR[3]<Anz[3] then
          begin
            Showmessage('Sie wollen mehr Karten 3. Rang verkaufen als Plätze vorhanden sind!');
             exit;
          end;

       if frPl<Anz[1]+Anz[2]+Anz[3] then
       begin
          Showmessage('Sie wollen mehr Karten verkaufen als Plätze vorhanden sind!');
           exit;
       end;
//Preisberechnung für erworbene Karten
      ZwSu:=ZwSu+Rang[1]+Rang[2]+Rang[3];
      Steuer:=ZwSu*0.19;
      Endpreis:=ZwSu+Steuer;
      AusgEndpreis.Text:=floattostrF(Endpreis, ffCurrency, 8,2);

//Ausgabe der Preisinformation
    MessageDlg('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' , mtInformation, [mbOK], 0);

//Berechnung der verkauften Karten und der freien Plätze
      KartR[1]:=KartR[1]+Anz[1];
      frKaR[1]:=FrKaR[1]-Anz[1];
      gek1Rang.Text:=inttostr(KartR[1]);
      frKaR1.Text:=inttostr(frKaR[1]);

      KartR[2]:=KartR[2]+Anz[2];
      frKaR[2]:=FrKaR[2]-Anz[2];
      gek2Rang.Text:=inttostr(KartR[2]);
      frKaR2.Text:=inttostr(frKaR[2]);

      KartR[3]:=KartR[3]+Anz[3];
      frKaR[3]:=FrKaR[3]-Anz[3];
      gek3Rang.Text:=inttostr(KartR[3]);
      frKaR3.Text:=inttostr(frKaR[3]);

      GesamtPl:=GesamtPl+ Anz[1]+Anz[2]+Anz[3];
      FrPl:=FrPl-(Anz[1]+Anz[2]+Anz[3]);
      AusgKartenGes.Text:=inttostr(GesamtPl);
      AusgFreiePl.Text:=inttostr(FrPl);

//Hinweise für verkaufte Karten
   if KartR[1]>20 then
    begin
      ShowMessage('Es wurden 20 Karten 1. Rang verkauft!');
    end;

   if KartR[2]>30 then
    begin
      ShowMessage('Es wurden 30 Karten 2. Rang verkauft!');
    end;

    if KartR[3]>50 then
    begin
      ShowMessage('Es wurden 50 Karten 3. Rang verkauft!');
    end;

//Gesamtplätze berechnen
   if GesamtPl>=100 then
     begin
       ShowMessage('Es sind bereits 100 Karten verkauft');
          EdRang1.Enabled:=false;
        EdRang2.Enabled:=False;
        EdRang3.Enabled:=False;
        Button1.Enabled:=false;
     end;
          zwSu:=0.0;
        Steuer:=0.0;
        Endpreis:=0.0;
  except
    on EConvertError do showMessage(Fehler);
  end;
end;
Ich habe mal den ganzen Code reinkopiert. 113 Zeilen. Für mich viel zu lang für ein Prozedur. Du hast es ja schon die Abschnitte kommentiert, was da gemacht wird:
Delphi-Quellcode:
//Preisberechnung für erworbene Karten
      ZwSu:=ZwSu+Rang[1]+Rang[2]+Rang[3];
      Steuer:=ZwSu*0.19;
      Endpreis:=ZwSu+Steuer;
      AusgEndpreis.Text:=floattostrF(Endpreis, ffCurrency, 8,2);

//Ausgabe der Preisinformation
    MessageDlg('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' , mtInformation, [mbOK], 0);

//Berechnung der verkauften Karten und der freien Plätze
      KartR[1]:=KartR[1]+Anz[1];
      frKaR[1]:=FrKaR[1]-Anz[1];
      gek1Rang.Text:=inttostr(KartR[1]);
      frKaR1.Text:=inttostr(frKaR[1]);

      KartR[2]:=KartR[2]+Anz[2];
      frKaR[2]:=FrKaR[2]-Anz[2];
      gek2Rang.Text:=inttostr(KartR[2]);
      frKaR2.Text:=inttostr(frKaR[2]);

      KartR[3]:=KartR[3]+Anz[3];
      frKaR[3]:=FrKaR[3]-Anz[3];
      gek3Rang.Text:=inttostr(KartR[3]);
      frKaR3.Text:=inttostr(frKaR[3]);

      GesamtPl:=GesamtPl+ Anz[1]+Anz[2]+Anz[3];
      FrPl:=FrPl-(Anz[1]+Anz[2]+Anz[3]);
      AusgKartenGes.Text:=inttostr(GesamtPl);
      AusgFreiePl.Text:=inttostr(FrPl);
Ich würde jeden Abschnitt in ein eigene Prozedur auslagern. Das macht den Code übersichtlicher und die Kommentare werden überflüssig. Zudem: Was für eine Exception erwartest du in dem Codeblock?

Und immer wieder die selben Meldungen:
Delphi-Quellcode:
//Hinweise für verkaufte Karten
   if KartR[1]>20 then
    begin
      ShowMessage('Es wurden 20 Karten 1. Rang verkauft!');
    end;

   if KartR[2]>30 then
    begin
      ShowMessage('Es wurden 30 Karten 2. Rang verkauft!');
    end;

    if KartR[3]>50 then
    begin
      ShowMessage('Es wurden 50 Karten 3. Rang verkauft!');
    end;
Besser:
Delphi-Quellcode:
TForm1.ShowSoldTickets(CntTickets: Integer; Rang: Integer)
begin
  ShowMessage(Format(..., [CntTickets, Rang]));
end;
Genauso mit den Fehlermeldungen.

Und wenn du das alle sin eien Klasse TKinokasse verpackst, hast du eine Trennung von Datenverarbeitung und Benutzeroberfläche, das ganze wird leichter erweiterbar und übersichtlicher, weil die ganzen Steuerelemnte im Code verschwinden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Übungsprogramm "Kinokarten"

  Alt 14. Dez 2016, 14:26
Was ist denn das? Warum kein einfaches Close? Klar, kann ich beim Auto einfach den Zündschlüssel abziehen. Aber normalerweise bremst man, hält an, leg den ersten Gang ein, zieht die Handbremse, macht dann den Motor aus und zieht den Zündschlüssel ab.
Du hast das Lenkradschloss vergessen.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 14:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz