Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

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

AW: Übungsprogramm "Kinokarten"

  Alt 14. Dez 2016, 15: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