![]() |
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. ;)
|
AW: Übungsprogramm "Kinokarten"
Wenn es in dem Tempo weitergeht: Noch zwei Monate und es ist weltweiter Marktführer :wink:
|
AW: Übungsprogramm "Kinokarten"
Zitat:
Gruß K-H |
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. |
AW: Übungsprogramm "Kinokarten"
Zitat:
Gruß K-H |
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.... |
AW: Übungsprogramm "Kinokarten"
Bin so frei und meckere ein bisserl rum ;-)
Dashier gefällt mir nicht:
Delphi-Quellcode:
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.
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; Lieber sowas in der Art:
Delphi-Quellcode:
Oder auch sowas:
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;
Delphi-Quellcode:
Der Aufruf im Programm sähe dann so aus:
procedure TKinokarten.BerechnePreisR1(aErmaessigt : Boolean); //Preis R1 berechnen
begin PreisR[1] := IfThen(aErmaessigt,Karten[1] * Rang1erm,Karten[1] * Rang1); end;
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. |
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! |
AW: Übungsprogramm "Kinokarten"
Hier könnte man eventuell sowas machen: (Achtung, nur hingedaddelt und nicht getestet)
Delphi-Quellcode:
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.
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; |
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:28 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 by Thomas Breitkreuz