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 4 von 6   « Erste     234 56   
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
 
#31
  Alt 19. Dez 2016, 15:07
Das wäre eine gute Idee, wenn man Karten unterschiedlicher Preisklassen auf einmal verkaufen will. Bei dem Projekt ist noch viel Luft nach oben.
Michael
  Mit Zitat antworten Zitat
Der schöne Günther
Online

 
Delphi 10 Seattle Enterprise
 
#32
  Alt 19. Dez 2016, 15:13
Wenn es in dem Tempo weitergeht: Noch zwei Monate und es ist weltweiter Marktführer
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

 
FreePascal / Lazarus
 
#33
  Alt 19. Dez 2016, 16:25
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:

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
  Mit Zitat antworten Zitat
nahpets
 
#34
  Alt 19. Dez 2016, 16:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

 
FreePascal / Lazarus
 
#35
  Alt 19. Dez 2016, 17:00
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
  Mit Zitat antworten Zitat
EdAdvokat

 
Delphi 10.2 Tokyo Professional
 
#36
  Alt 19. Dez 2016, 17:01
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....
Angehängte Dateien
Dateityp: zip Kinokartenoop5.zip (862,0 KB, 2x aufgerufen)
Norbert
  Mit Zitat antworten Zitat
nahpets
 
#37
  Alt 19. Dez 2016, 17:49
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: 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:

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:

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.
  Mit Zitat antworten Zitat
EdAdvokat

 
Delphi 10.2 Tokyo Professional
 
#38
  Alt 19. Dez 2016, 18:27
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!
Norbert
  Mit Zitat antworten Zitat
nahpets
 
#39
  Alt 19. Dez 2016, 19:04
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.
  Mit Zitat antworten Zitat
EdAdvokat

 
Delphi 10.2 Tokyo Professional
 
#40
  Alt 19. Dez 2016, 21:03
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!
Norbert
  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:22 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