Entwickler-Ecke

Sonstiges (Delphi) - Umsetzungsproblem


Fredy - Do 08.01.09 21:27
Titel: Umsetzungsproblem
Hallo Liebe Leute,

Gruppe A / 4 Personen = 20 Minuten: 895,00 €
= 30 Minuten: 1.250,00 €


/ 6 Personen = 20 Minuten: 1.150,00 €
= 30 Minuten: 1.590,00 €


/ 12 Personen = 20 Minuten: 2.400,00 €
= 30 Minuten: 3.100,00 €
= Komplett: 6.900,00 €

Ich hab gerade ein riesen Problem in meinem Delphie Projekt mit Checkboxen.
Ich hab es so aufgebaut Gruppe A kann man über eine checkbox auswählen wenn man zu dieser Gruppe gehört.
Wenn man diese Checkbox gechecked hat dann folgt die nächste wo man die Personen auswählt wie viel sie waren.
Dadrauf folgen dann zwei oder auch drei checkboxen bei denen man die Minuten oder Komplett auswählt.
So weit so gut aber jetzt soll nur ein Betrage in eine Variable Namens Euro eingetragen werde.

Nehmen wir mal an ich bin in Gruppe A und wir waren 4 Personen und wir haben 20 Minuten gebraucht. Dann soll in der variable Euro der Betrag 895 € stehen.

Natürlich könnte man alles so machen IF GruppeA.checked and 4 Personen.checked and 20 Minuten-checked aber das wäre ja sehr aufwendig.

Gibt es da noch eine andere Lösung ?

aso es wäre noch zu erwähnen das es checkboxen bleiben sollten =)

Vielen Vielen Dank


jaenicke - Do 08.01.09 22:05

CheckBoxen sind da zwar sehr abenteuerlich, aber wenn es so sein muss und keine sinnvollere Variante möglich ist...

Gibt es denn eine Berechnung für die Zahlen oder sind die willkürlich festgelegt? Bei ersterem könnte man diese Berechnung dann benutzen, bei letzterem könnte man ein konstantes mehrdimensionales Array verwenden, in dem die Werte fest drin stehen.


Fredy - Do 08.01.09 22:14

Die Eurobeträge sind fix von unserem Lehrer vorgegeben worden.
Sie liegen auch keiner Berechnung zu Grunde.
Wie würde es den ca. mit einem Array aussehen ? / ich weis so groß wie man ein Array macht aber zu dieser Aufgabe kann ich da kein Bezug herstellen.
Oder ich steht gerade auf dem Schlauch.


jaenicke - Do 08.01.09 22:45

Du kannst die Beträge konstant einfügen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
const
  EuroValues: array[1..21..4of Currency = (
    // Gruppe 1:
    (100300400500),
    // Gruppe 2
    (150350500600)
    );
jetzt kannst du auf die Beträge mit EuroValues[1][4] für Gruppe 1 und 4 Personen zugreifen. Welcher Arrayeintrag zu welcher CheckBox gehört kannst du ja in Tag schreiben und dann z.B. beim Auswählen speichern.

Ein Beispiel liegt im Anhang. Das ist alles keine schöne Vorgehensweise und ziemlich sinnfrei, weil CheckBoxes da einfach nicht passend sind, aber wenn du die benutzen musst, dann ist das noch die kürzeste Variante.


Fredy - Do 08.01.09 23:24

Zitat:
EuroValues: array[1..7, 1..2] of Currency = (
// Gruppe 1:
(895, 1250),
// Gruppe 2
(1150, 1590)
// Gruppe 3
(2400, 3100)
// Gruppe 4
(950, 1430)
// Gruppe 5
(1240, 1750)
// Gruppe 6
(750, 1300)
// Gruppe 7
(1400, 1990)
);


Würde das dann mit 7 Gruppen ( in meinem Fall die Personen) und 1..2 ( in meinem Fall die Minuten ) so aussehen ? (irgendwie funktioniert dies nicht)
Bleiben dann die anderen Befehle in den Checkboxen gleich ?
Muss ich dann den Befehl von der "1 Person" Checkbox ( bei dir) auf alle anderen übertragen ?


jaenicke - Do 08.01.09 23:27

Du hast ja drei Gruppen von CheckBoxen irgendwie, also brauchst du auch ein dreifach geschachteltes Array, nicht nur ein zweifaches wie im Beispiel. Gruppe, Personenanzahl, Minuten.


Fredy - Do 08.01.09 23:40

habs mal ein Ausschnitt eingescanned ohne meine Vereinfachung. Wenn ich das richtig sehe dann muss ich das so machen oder?
Ich steig momentan nicht ganz dahinter. :idea: ohne das Komplette das lass ich mal weg sonst wird es noch komplizierter ;)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
EuroValues: array[1..31..71..2of Currency = (
// Gruppe 1:
(8951250),
// Gruppe 2
(11501590)
// Gruppe 3
(24003100)
// Gruppe 4
(9501430)
// Gruppe 5
(12401750)
// Gruppe 6
(7501300)
// Gruppe 7
(14001990)
);


Moderiert von user profile iconNarses: Bild als Anhang hochgeladen


jaenicke - Do 08.01.09 23:53

Und das sollt ihr mit CheckBoxen machen? :shock:

Da gibts ja vermutlich noch einige Möglichkeiten mehr, oder? Und du benutzt jetzt so viele CheckBoxen ganz rechts wie in der Liste zu sehen? Also 7 + 4 + 4 = 13 ganz rechts? Und 23 insgesamt für den Ausschnitt?
Weil wenn du das so machst, dann kannst du auch einfach in die Tag-Eigenschaft dieser rechten CheckBoxen den Betrag schreiben und den direkt verwenden.

Das Array wäre sinnvoll, wenn du nach der Auswahl der ersten CheckBox für den Tanz entsprechend die nächsten einblendest. Aber mir ist eben gerade eingefallen, dass du das vielleicht gar nicht so machst. Als ich nämlich gesehen habe, dass die Optionen weiter rechts auch noch unterschiedlich sind (Paare, Personen, ...).

Trotz allem sind CheckBoxen dafür nicht gedacht und es macht alles unnötig kompliziert. Aber für die verkorkste Aufgabenstellung kannst du ja nix. :nixweiss: Bin ich froh, dass unsere Lehrerin wusste wofür welche Komponenten gedacht sind. :lol:


Fredy - Fr 09.01.09 00:03

Waren einige Checkboxen ;)

in der Aufgabenstellung steht Checkboxen und hab auch einiges dadrauf angepasst aber okay.
Was würdest du den Vorschlag was ich verwenden soll ? / dann lern ich wenigstens wie es richtig gemacht wird und hab ein Programm das Funktioniert.


Tarry - Fr 09.01.09 00:15

user profile iconFredy hat folgendes geschrieben Zum zitierten Posting springen:
Waren einige Checkboxen ;)

in der Aufgabenstellung steht Checkboxen und hab auch einiges dadrauf angepasst aber okay.
Was würdest du den Vorschlag was ich verwenden soll ? / dann lern ich wenigstens wie es richtig gemacht wird und hab ein Programm das Funktioniert.



Hi,
ich haette wahrscheinlich RadioButtons, fuer die Gruppen und ne RadioGroup fuer die Personen benutzt.
Dann kannst du einfach mit RadioGroup1.ItemIndex herausfinden, wieviele Personen ausgewaehlt wurden.

Gruss,
Thomas


jaenicke - Fr 09.01.09 00:15

Ich würde eigentlich zumindest RadioButtons verwenden, denn man darf ja wohl nicht mehrere Tänze, etc. auswählen. ;-)
Das wäre immer noch nahe an der Aufgabenstellung, du müsstest dich aber nicht darum kümmern, dass nur ein Eintrag ausgewählt ist.

Da das aber in der Aufgabenstellung explizit mit CheckBoxen steht, solltest du es wohl lieber damit machen, vielleicht

Ich habe da auch eine Idee. Und zwar:
Ein Array, in dem die Optionen mit deren Namen und den Werten stehen, dann kannst du die CheckBoxen dementsprechend ein- und ausblenden wie Optionen vorhanden sind.


Fredy - Fr 09.01.09 00:30

am besten wäre es schon mit den Checkboxen dann müsste ich den Rest der auf die Checkboxen zugreif nicht ändern.
@ jaenicke ich komm gerade nicht mit wie du (ich hoffe das "du" geht in Ordnung) die Idee verwirklichen willst ? 7 bzw. wie die Ausführung funktionieren soll.


jaenicke - Fr 09.01.09 01:24

Ganz fertig ist das nicht, da fehlt noch der vorletzte Schritt und die restlichen Optionen.

Das versuch erstmal nachzuvollziehen. Wenn du etwas nicht verstehst, dann frag. Wenn du verstanden hast, was da passiert, dann müsstest du den Rest ergänzen können. ;-)

user profile iconFredy hat folgendes geschrieben Zum zitierten Posting springen:
ich hoffe das "du" geht in Ordnung
Natürlich ;-)


Fredy - Fr 09.01.09 19:59

Ich mach das Programm erst mal mit den if's dass dies funktioniert danach probier ich dann deine lösung aus.
Versteh einige Sachen nicht ganz.
Meine Fragen stell ich dir dann.


Fredy - Fr 09.01.09 21:53

Neues Problem ich habe die Variable Kosten, in ein StringGrid einlesen lassen das funktioniert auch, nur zeigt er mir wenn ich 4 Personen (frmTanz.rb_4.Checked) und 20 Minuten (frmTanz.cb_20M.Checked) auswähle, nicht die 895 an sondern die 1990 von der letzten Zeile.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
// Zu den gewählten Kosten den entsprechenden Wert eintragen.
 IF frmTanz.rb_4.Checked = true and frmTanz.cb_20M.Checked = true then Kosten :=895;
 IF frmTanz.rb_4.Checked = true and frmTanz.cb_30M.Checked = true then Kosten :=1250;
 IF frmTanz.rb_6.Checked = true and frmTanz.cb_20M.Checked = true then Kosten :=1150;
 IF frmTanz.rb_6.Checked = true and frmTanz.cb_30M.Checked = true then Kosten :=1590;
 IF frmTanz.rb_12.Checked = true and frmTanz.cb_20M.Checked = true then Kosten :=2400;
 IF frmTanz.rb_12.Checked = true and frmTanz.cb_30M.Checked = true then Kosten :=3100;
 IF frmTanz.rb_12.Checked = true and frmTanz.cb_KAP.Checked = true then Kosten :=6900;
 IF frmTanz.rb_3P.Checked = true and frmTanz.cb_1A.Checked = true then Kosten :=950;
 IF frmTanz.rb_3P.Checked = true and frmTanz.cb_2A.Checked = true then Kosten :=1430;
 IF frmTanz.rb_5P.Checked = true and frmTanz.cb_1A.Checked = true then Kosten :=1240;
 IF frmTanz.rb_5P.Checked = true and frmTanz.cb_2A.Checked = true then Kosten :=1750;
 IF frmTanz.rb_12a.Checked = true and frmTanz.cb_1A.Checked = true then Kosten :=750;
 IF frmTanz.rb_12a.Checked = true and frmTanz.cb_2A.Checked = true then Kosten :=1300;
 IF frmTanz.rb_20a.Checked = true and frmTanz.cb_1A.Checked = true then Kosten :=1400;
 IF frmTanz.rb_20a.Checked = true and frmTanz.cb_2A.Checked = true then Kosten :=1990;


Kann doch eigentlich nicht sein oder mach ich was falsch in dem Teil der Programmierung ?


jaenicke - Fr 09.01.09 22:00

Vielleicht sind die auch noch ausgewählt? (Ob die CheckBoxen unsichtbar sind spielt dabei ja keine Rolle.)

Ein großer Fehler ist jedenfalls das = true überall. Was Delphi jetzt macht ist das:

Delphi-Quelltext
1:
IF ((frmTanz.rb_4.Checked = true) and frmTanz.cb_20M.Checked) = true then Kosten := 895;                    
Was du aber willst ist ja

Delphi-Quelltext
1:
IF frmTanz.rb_4.Checked and frmTanz.cb_20M.Checked then Kosten := 895;                    
Mehr dazu findest du auch hier:
http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/page/4/

Zudem solltest du else benutzen. Dann werden die anderen Optionen gar nicht mehr durchlaufen.


Fredy - Fr 09.01.09 22:05

das = true war die Lösung überall weg und schon funktionierts Danke ;)


Fredy - Fr 09.01.09 22:45

Könnte mir jemand sagen was ich hier (frmMenu.Label3Click;) noch vervolständigen muss das er mir den OnClick "Befehl" ausführt von einem anderen Label aus ?


jaenicke - Fr 09.01.09 22:47

Den Parameter angeben, also entweder den anderen Label oder Sender. Label3Click(Sender) z.B.

Aber wenn du nur diesen OnClick-Aufruf in dem OnClick hast, kannst du auch direkt Label3Click bei mehreren Labeln als OnClick zuweisen.


Fredy - Fr 09.01.09 23:48

Funktioniert Super / du weist ganz schön viel. :roll: :zustimm:

noch eine Frage ;) Ich hoffe ich nerv nicht zu sehr-

Wenn ich dies habe wie kann ich da noch die funktion einbauen wenn man No drückt ?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if MessageDlg('Sie möchten die Tanzgruppe für '
   + FormatFloat('#,##0.00 €', Gesamtsumme)
   + ' bestellen ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
  frmTanz.Hide;
  frmRechnung.Show;
end;


FinnO - Fr 09.01.09 23:58

mit else


Tarry - Fr 09.01.09 23:59

user profile iconFredy hat folgendes geschrieben Zum zitierten Posting springen:
Funktioniert Super / du weist ganz schön viel. :roll: :zustimm:

noch eine Frage ;) Ich hoffe ich nerv nicht zu sehr-

Wenn ich dies habe wie kann ich da noch die funktion einbauen wenn man No drückt ?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if MessageDlg('Sie möchten die Tanzgruppe für '
   + FormatFloat('#,##0.00 €', Gesamtsumme)
   + ' bestellen ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
  frmTanz.Hide;
  frmRechnung.Show;
end;


Bau einfach einen else Zweig ein.
Ich weiss nicht genau ob er auch ausgeloeast wird, wenn die Box Weggecklickt wird (musst du testen).
Wenn es so nicht klappt, kannst du den Ruckgabe Wert (ist eine integer) einach in eienr varible abspeichern und dann abfragen.

Gruss
Thomas


jaenicke - Fr 09.01.09 23:59

Wie wäre es mit else oder case? ;-)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if MessageDlg('Sie möchten die Tanzgruppe für '
   + FormatFloat('#,##0.00 €', Gesamtsumme)
   + ' bestellen ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
  frmTanz.Hide;
  frmRechnung.Show;
end
else
  ...
oder

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
case MessageDlg('Sie möchten die Tanzgruppe für '
   + FormatFloat('#,##0.00 €', Gesamtsumme)
   + ' bestellen ?', mtConfirmation, [mbYes, mbNo], 0of
  mrYes: begin
      frmTanz.Hide;
      frmRechnung.Show;
    end;
  mrNo: begin
      ...
    end;
  end;
Mit case geht es dann auch mit mehr Antwortmöglichkeiten. ;-)

// EDIT:
user profile iconTarry hat folgendes geschrieben Zum zitierten Posting springen:
Ich weiss nicht genau ob er auch ausgeloeast wird, wenn die Box Weggecklickt wird (musst du testen).
Ja, natürlich, dann wird mrCancel zurückgegeben. ;-)


FinnO - Sa 10.01.09 00:12

Zitat:
// EDIT:
user profile iconTarry hat folgendes geschrieben icon mini page:
Ich weiss nicht genau ob er auch ausgeloeast wird, wenn die Box Weggecklickt wird (musst du testen).
Ja, natürlich, dann wird mrCancel zurückgegeben. ;-)


das dürfte hier aber egal sein, denn bei der bestellung interessiert nur das JA , das NEIN und ABBRECHEN ist irgendwie gleichbedeutend


Tarry - Sa 10.01.09 00:15

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
// EDIT:
user profile iconTarry hat folgendes geschrieben icon mini page:
Ich weiss nicht genau ob er auch ausgeloeast wird, wenn die Box Weggecklickt wird (musst du testen).
Ja, natürlich, dann wird mrCancel zurückgegeben. ;-)


das dürfte hier aber egal sein, denn bei der bestellung interessiert nur das JA , das NEIN und ABBRECHEN ist irgendwie gleichbedeutend


Du hast natuerlich Recht, aber vielleicht moechtest du dann eine andere Message ausgeben oder garkeine oder was auch immer ;)
Wollte es einfach nru erwaehnt haben, da es auf jeden Fall gut zu wissen ist das der else Zweig auch aufgerufen wird, wenn der Dialog geschlossen wurde.

Gruss
Thomas


Fredy - Sa 10.01.09 19:18

aber wenn man dann z.B rein macht das er z.B. verschiedene Checkboxen abwählen soll ;) dann wäre es sinnvoll


Christian S. - Sa 10.01.09 22:18

Fredy,

bitte stelle nur eine Frage pro Thread. Deine neueste Frage habe ich abgetrennt [http://www.delphi-forum.de/topic_Zeilen+in+StringGrid+einfuegen_89310.html]. Den Titel des neuen Threads kannst Du ja noch anpassen, ich konnte nicht genau erkennen, worum es jetzt geht ;-)

Grüße
Christian