Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56   

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)

Luckie 19. Dez 2016 14:07

AW: Übungsprogramm "Kinokarten"
 
Das wäre eine gute Idee, wenn man Karten unterschiedlicher Preisklassen auf einmal verkaufen will. Bei dem Projekt ist noch viel Luft nach oben. ;)

Der schöne Günther 19. Dez 2016 14:13

AW: Übungsprogramm "Kinokarten"
 
Wenn es in dem Tempo weitergeht: Noch zwei Monate und es ist weltweiter Marktführer :wink:

p80286 19. Dez 2016 15:25

AW: Übungsprogramm "Kinokarten"
 
Zitat:

Zitat von Jumpy (Beitrag 1356543)
Delphi-Quellcode:
BuyTickst(Anzahl: Integer; Rang: Integer);
Hallo,

hab mir dein Beispiel nicht angeguckt und reagiere einfach nur mal auf die Prozedure, die Lucky hier zitiert hat. Um das OOP-mäßig weiter auszubauen, könnte man vllt. wie folgt vorgehen:

Delphi-Quellcode:
BuyTickst(Warenkorb:TWarenkorb);
Sprich sowas wie ein Warenkorb-Objekt, das wiederum die zu kaufenden Tickets enthält. Ob das nun jedes Ticket einzeln ist (würde ab irgendeinem Punkt sicher Sinn machen, wenn es nummerierte Platztickets gibt) oder Listen aus Ticketanzahl pro Rang.

Den Warenkorb finde ich etwas unglücklich, da nur Tickets verkauft werden sollen. fall noch Popkorn dazu käme, könnte man über TWarenkorb=TTickets+TPopcorn einmal nachdenken.

Gruß
K-H

nahpets 19. Dez 2016 15:42

AW: Übungsprogramm "Kinokarten"
 
Naja, sagen wir mal so: TWarenkorb ist ein Container, der die Tickets für heute, die Geschenkgutscheine für Kinokarten, die Eiscreme nebst Popcorn ... enthalten kann.

Wenn die Ideen weiter sprudeln, dann wird das Übungsprogramm "Kinokarten" in kürzester Zeit beliebig komplex.

p80286 19. Dez 2016 16:00

AW: Übungsprogramm "Kinokarten"
 
Zitat:

Zitat von nahpets (Beitrag 1356603)
Naja, sagen wir mal so: TWarenkorb ist ein Container, der die Tickets für heute, die Geschenkgutscheine für Kinokarten, die Eiscreme nebst Popcorn ... enthalten kann.

Wenn die Ideen weiter sprudeln, dann wird das Übungsprogramm "Kinokarten" in kürzester Zeit beliebig komplex.

Jo, und da die Beteiligten meist wissen wovon sie schreiben, hätten wir dann einmal OOP abseits praxisnaher Beispiele, wie z.B. "Fahrzeuge".

Gruß
K-H

EdAdvokat 19. Dez 2016 16:01

AW: Übungsprogramm "Kinokarten"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen, wollen wir doch erst einmal ein Dorfkino bauen und später dann ein Filmpalast für Hollywood (das überlasse ich jedoch den wirklichen Könnern.
Ich bin mit meinen bescheidenen Kenntnissen doch etwas gefordert und muss hier und da doch mal in die Bücher/Internet sehen, um die Anregungen umzusetzen. Zunächst ein weiterer Zwischenschritt, der noch weiter verbessert wird. (habe mit const gearbeitet und werde jetzt beginnen wie Luckie empfohlen hat den Rang als Enum umzuwandeln und dann von "außen zu fegen" beginnen - sprich die Teilung in public und private.
Ziel ist es ein wirklich lauffähiges und dann ausbaufähiges Programm vorzulegen. Schauen wir mal, dann sehen wir....

nahpets 19. Dez 2016 16:49

AW: Übungsprogramm "Kinokarten"
 
Bin so frei und meckere ein bisserl rum ;-)

Dashier gefällt mir nicht:
Delphi-Quellcode:
procedure TKinokarten.BerechnePreisR1; //Preis R1 berechnen
begin
    if Form1.ckbxR1.Checked then PreisR[1]:=Karten[1] * Rang1erm
          else if not Form1.ckbxR1.checked then
       PreisR[1]:= Karten[1] * Rang1;
end;
Hier ist es zwingend erforderlich, dass die Klasse TKinokarten irgendwie in einem Form1 liegt. Nutzt jemand sie in 'nem Formular fmKino, hat er ein unlösbares Problem.

Lieber sowas in der Art:
Delphi-Quellcode:
procedure TKinokarten.BerechnePreisR1(aErmaessigt : Boolean); //Preis R1 berechnen
begin
  case aErmaessigt of
    true : PreisR[1] := Karten[1] * Rang1erm;
    false : PreisR[1] := Karten[1] * Rang1;
  end;
end;
Oder auch sowas:
Delphi-Quellcode:
procedure TKinokarten.BerechnePreisR1(aErmaessigt : Boolean); //Preis R1 berechnen
begin
  PreisR[1] := IfThen(aErmaessigt,Karten[1] * Rang1erm,Karten[1] * Rang1);
end;
Der Aufruf im Programm sähe dann so aus:
Delphi-Quellcode:
Kinokarten.BerechnePreisR1(ckbxR1.checked);


Alles, was zur Klasse TKinokarten gehört, würd' ich in eine Unit Kinokarten auslagern und die dann in die Uses-Anweisung aufnehmen. Dann fallen so unglückliche Zugriffe auf Form1 innerhalb der Klasse sofort auf und man merkt, dass man hier eine ungünstige Konstruktion gewählt hat.

Dashier finde ich schön:

Delphi-Quellcode:
showMessage(format('Es wurden %d Karten im %d. Rang für '+inttostr(Rang1)+' Euro bzw. für ermäßigt '+inttostr(Rang1erm)+' Euro verkauft!',[20,1]));


Ein bisserl Format und ein bisserl auch nicht. Lieber sowas:

Delphi-Quellcode:
showMessage(format('Es wurden %d Karten im %d. Rang für %d Euro bzw. für ermäßigt %d Euro verkauft!',[20,1,Rang1,Rang1erm]));


Wobei: Für die 20 und die 1 (und alle ähnlichen Werte irgendwo im Quelltext) würd' ich zu den bereits vorhandenen Konstanten noch ein paar entsprechende dazu packen.
Wenn denn dann mal was geändert werden muss, dann hat man das alles an einer Stelle. Später könnte man dann noch überlegen, ob man die Werte der Konstanten nicht in der Prozedure Init aus 'ner Ini-Datei (oder Ähnlichem) liest. Dann kann man die Preise und das Platzangebot ändern, ohne das Programm ändern zu müssen.
Dazu gönnt man dann der Klasse entsprechende Attribute, statt auf globale Konstanten zuzugreifen.

EdAdvokat 19. Dez 2016 17:27

AW: Übungsprogramm "Kinokarten"
 
Danke nahpets, sehe ich mir sofort an - gefällt mir gut.
Habe empfehlungsgemäß ein Enum gebildet:
...
implementation

{$R *.dfm}

uses ABOUT;

type TRang = (Rang1=15, Rang1erm=14, Rang2=13, Rang2erm=12, Rang3=10, Rang3erm=9);
var Rang: TRang;

const {Rang1 = 15;
Rang1erm = 14;
Rang2 = 13;
Rang2erm = 12;
Rang3 = 10;
Rang3erm = 9; }
PlGes = 100;
frPlR1Vorg = 20;
frPlR2Vorg = 30;
frPlR3Vorg = 50;...

nun will ich mit dem Enumtyp eine Multiplikation ausführen und den Preis für Rang 1 zu berechnen, doch es wird
eine Fehlermeldung ausgegeben:
[dcc32 Fehler] uKinokarten.pas(227): E2015 Operator ist auf diesen Operandentyp nicht anwendbar

procedure TKinokarten.BerechnePreisR1; //Preis R1 berechnen
begin
if Form1.ckbxR1.Checked then PreisR[1]:=Karten[1] * Rang1erm
else if not Form1.ckbxR1.checked then
PreisR[1]:= Karten[1] * Rang[1]; //Rang1;
end;

Was mache ich falsch? Gehe ich mit Rang[2] ins Rennen, also mit dem Ordinalwert meckert er auch und will ein
array deklariert sehen, doch das ist ja nicht vorgesehen.
Mit den const-Werten hat alles geklappt!

nahpets 19. Dez 2016 18:04

AW: Übungsprogramm "Kinokarten"
 
Hier könnte man eventuell sowas machen: (Achtung, nur hingedaddelt und nicht getestet)
Delphi-Quellcode:
type
  TRang = (Rang1=15, Rang1erm=14, Rang2=13, Rang2erm=12, Rang3=10, Rang3erm=9);

  TKinokarten = class
    private
      Karten         : array[TRang] of integer;
      gekaufteKarten : array[TRang] of integer;
      freiePlR       : array[TRang] of integer;
      gekaufteKartenGesamt,
      freiePlGesamt : integer;

      PreisR       : array[TRang] of Currency;
      ZwSu         : Currency;
      MWSt         : Currency;
      Preis        : Currency;
...

// Klappt so mit einer Prozedur für alle Ränge.
procedure TKinokarten.BerechnePreisFuerBeliebigenRang(aRang : TRang);
begin
  PreisR[aRang] := Karten[aRang] * Ord(aRang);
end;
Bekommt man jetzt weitere Ränge dazu oder irgendwelche weiteren Ermäßigungen ..., so muss man nur den Typ tRang erweitern, der Rest läuft automatisch.

EdAdvokat 19. Dez 2016 20:03

AW: Übungsprogramm "Kinokarten"
 
Danke Stefan, das hat geklappt. Nun muss ich nur noch die Trennung TForm1 und TKinokarten vollziehen.
Da muss ich mir noch was einfallen lassen. Nochmals vielen Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 Uhr.
Seite 4 von 6   « Erste     234 56   

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