Autor |
Beitrag |
Halunkel
      
Beiträge: 34
|
Verfasst: Sa 06.05.06 01:29
Hallo!
Ich habe eine Combobox mit mehreren Einträgen und drei Checkboxen.
Nun wird bei der Auswahl aus der Combobox einem Editfeld eine Punktzahl zugeordnet.
Und diese Punktzahl soll sich je nach Wahl einer Checkbox verändern. Zum Bsp. "kostet" die erste Box 5, die zweite 7 und die dritte 10 Punkte.
Wenn ich nun einen Eintrag aus der Combobox auswähle zeigt er mir auch die Punkte an und sie verändern sich auch , wenn ich eine Checkbox anklicke verändern sie sich auch! Aber wenn ich das Kästchen wieder deaktiviere bleibt die Punktzahl bestehen! Wie kann ich das hinbiegen?
so sieht der Ausschnitt des Quellcodes aus: (soll nur zur verdeutlichung dienen)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm2.ComboBox1Change(Sender: TObject); begin
if combobox1.Text = 'Eintrag1' then a := 10; Edit1.Text := FloatToStr(a); end;
procedure TForm2.CheckBox1Click(Sender: TObject); begin if checkbox1.Checked = true then a := a + 5; Edit1.Text := FloatToStr(a); end; |
Danke!!
Moderiert von Christian S.: Delphi-Tags hinzugefügtModeriert von Christian S.: Topic aus Algorithmen, Optimierung und Assembler verschoben am Sa 06.05.2006 um 01:43
|
|
MarcRB1975
      
Beiträge: 131
XP, Windows7
Delphi 2005 PE, Turbo, RAD Delphi 2009, XE, XE2
|
Verfasst: Sa 06.05.06 03:30
Hallo,
ich bin mir jetzt zwar nicht sicher, ob ich Dein Problem richtig verstanden habe.
Nun...
Wenn die Checkbox(en) aktiviert ist/sind, weißt du doch schon den Wert zu, indem du schreibst:
If Checkbox.Checked = true then Edit1.Text := .....
genauso würde ich es machen, wenn es nicht aktiviert ist bzw. Du es wieder deaktivierst.
Nämlich so zum Beispiel:
Ich gehe jetzt mal davon aus, dass dann nichts in Edit1 stehen soll.
If Checkbox.Checked = false then Edit1.Text := '';
|
|
Halunkel 
      
Beiträge: 34
|
Verfasst: Sa 06.05.06 12:22
Danke für deine Antwort!
Muss ich also für beide Fälle eine Abfrage machen??
Ich habe gehofft, dass es einen Weg gibt die Abfrage nur einmal zu schreiben!
So hab ich es momentan da stehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| if combobox1.text = 'Eintrag1' then a = 10; if checkbox1.checked := true then a = a + 5; if checkbox2.checked := true then a = a + 7; Edit1.Text := FloatToStr(a); |
Aber dabei passen sich die Punkte leider nicht an, wenn ich die Chekbox(en) wieder deaktiviere!
Muss ich dann überall nochmal ne Abfrage machen, was passiert wenn die Checkbox deaktiviert ist? Also etwa so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| if combobox1.text = 'Eintrag1' then a = 10; if checkbox1.checked := true then a = a + 5; if checkbox1.checked := false then a = 10; if checkbox2.checked := true then a = a + 7; if checkbox2.checked := false then a = 10; Edit1.Text := FloatToStr(a); |
Aber wie mache ich am geschicktesten die Bündelung der Chekcboxen?? Sodass sich die Punkte ändern je nachdem welche Box man angeklickt hat! Es sind ja auch mehrere Boxen möglich und wenn man alle Kombinationen schreiben müsste, dann gäbe der Quellcode ja riesig!!
Habt ihr für die beiden Probleme eine Lösung!!
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
aim65
      
Beiträge: 312
Win 9x, Win XP
Delphi 3pro, 7PE
|
Verfasst: Sa 06.05.06 13:24
Könntest ja erst mal jede Abfrage mit nur einer Zeile machen, etwa so:
Delphi-Quelltext 1:
| if checkbox1.checked = true then a = a + 5 else a = 10; |
Wenn Du mehr als 2 Checkboxen hast, könnte "FindComponent" evtl. gehen.
Etwa so:
Delphi-Quelltext 1: 2:
| for n:=1 to MaxNrCheckBoxen do if TCheckBox(FindComponent('CheckBox'+IntToStr(n)+'.checked')) =true then...else... |
Vorsicht- hab Nr.2 nicht ausprobiert. Mußt mal herumprobieren, falls der Compiler meckert (kann sein, daß man das alles nicht in einer Zeile zusammenfassen kann).
|
|
Halunkel 
      
Beiträge: 34
|
Verfasst: Sa 06.05.06 16:03
Das mit der "FindComponent" muss ich mir noch genauer ansehen, ob ich das in meinem Zusammenhang evtl. verwenden kann!
Ich hab das Problem mal als Datei hochgeladen! Ihr könnt es euch ja evtl. kurz ansehen und mir sagen, wie ich es schaffen kann, dass der Wert des Editfeldes sich wieer zurückverändert, wenn ich die Checkbox wieder deaktiviere!!
Irgendwie klappt das nicht so wie ich mir das vorstelle!!
Das Programm ist sehr klein und es dient eben nur diesem Problem!! Also schaut es euch mal kurz an, es würde mir wirklich sehr helfen!!
Danke!!
Einloggen, um Attachments anzusehen!
|
|
aim65
      
Beiträge: 312
Win 9x, Win XP
Delphi 3pro, 7PE
|
Verfasst: Sa 06.05.06 20:15
Klar, daß das nicht so geht - beim Deaktivieren einer CheckBox ("else") veränderst Du "a" ja gar nicht (a:=a). Du willst wahrscheinlich "a" wieder auf den Ausgangswert zuücksetzen(?). Ansonsten addierst Du ja bei jeder Aktion weitere Werte zu a, --> wird also immer größer.
Dann könntest Du folgendes machen (Beispiel CheckBox1):
procedure TForm1.CheckBox1Click(Sender: TObject);
Delphi-Quelltext 1: 2: 3: 4:
| begin if checkbox1.Checked = true then a:=a+3 else a:=10; Edit1.Text := FloatToStr(a); end; |
Verstehe Deine If-statements bei der Combobox nicht, da die Texte nicht initialisiert wurden. Kann es sein, daß Du die Texte zur Laufzeit in die ComboBox eingibst?
Würde außerdem den Anfangswerten jeweils eine andere Variable zuweisen, statt überall "a" einzusetzen. Mehr Tipparbeit lohnt sich auch für sinnvolle Variablennamen, damit Du später noch durchblickst. (z.B. "Start1:=10, Start2:=20, Start3:=30 oder so).
Edit: Hab mal ein Zip mit Deinem von mir etwas modifizierten Programm angehängt, mit Kommentaren. Vielleicht kannst Du damit etwas anfangen.
Einloggen, um Attachments anzusehen!
|
|
MarcRB1975
      
Beiträge: 131
XP, Windows7
Delphi 2005 PE, Turbo, RAD Delphi 2009, XE, XE2
|
Verfasst: Sa 06.05.06 23:09
Also... ich hab mir das Ganze nochmal genau angesehen.
Nach jeder "Aktion" muss geprüft werden, welche Checkboxen true oder false sind und welcher Text von der Combobox ausgewählt wurde. Übrigens...
statt If Combobox1.Text = 'Eintrag1' then a := 10
kann man auch den ausgewählten "Index" der Combobox verwenden bzw. zuweisen lassen.
z.B. If Combobox1.ItemIndex = 0 then a := 10
(ItemIndex.... das ist sozusagen die "Zeilennummer" in der Combobox.
Die Zeilennummer 0 ist bei dir der Eintrag (Eintrag1)
Die Zeilennummer 1 ist bei dir der Eintrag (Eintrag2) usw.
ItemIndex zu verwenden wäre dann von Vorteil, wenn der Combobox-Text sehr lange ist. Es wäre dann sehr mühsam, den Text in der Prozedur zu wiederholen.
Oder du hast 10 oder mehr Einträge in der Box. Dann müsstest du immer ganz genau den Text "zitieren". Ist dann nämlich bei der Prozedur nicht der exakte Text wiedergegen worden, findet er den Text zum Vergleich aus der Combobox nicht und er wird dann keinen zugewiesenen Wert addieren.
Ich würde das wie folgt lösen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| ... ...
Var a, b, c, d : double;
procedure TForm1.Kontrollabfrage; begin If Combobox1.Text = 'Eintrag1' then a := 10; If Combobox1.Text = 'Eintrag2' then a := 20; If Combobox1.Text = 'Eintrag3' then a := 30;
If Checkbox1.Checked = true then b := 3 else b := 0; If Checkbox2.Checked = true then c := 7 else c := 0; If Checkbox3.Checked = true then d := 9 else d := 0;
Edit1.Text := FloatToStr(a+b+c+d);
end;
procedure TForm1.ComboBox1Change(Sender: TObject); begin Kontrollabfrage; end;
procedure TForm1.CheckBox1Click(Sender: TObject); begin Kontrollabfrage; end;
procedure TForm1.CheckBox2Click(Sender: TObject); begin Kontrollabfrage; end;
procedure TForm1.CheckBox3Click(Sender: TObject); begin Kontrollabfrage; end; |
P.S. An ALLE die vielleicht wieder mal rummeckern:
Einge werden vielleicht jetzt schreiben, ohhh... wie umständlich, aber erstens gibt es immer andere Lösungen. Vielleicht auch einfachere, das mag schon sein.
Aber ich finde ich es überhaupt nicht umständlich und 2. ist das ein Code, der jederzeit unproblematisch nachvollzogen werden kann, ohne, dass man sich vorher stundenlang einlesen muss, und das ist besonders für Anfänger sehr wichtig.
Also... motzt nicht rum
Ich hoffe aber, dass ich Dir ein wenig weiterhelfen konnte.
|
|
MarcRB1975
      
Beiträge: 131
XP, Windows7
Delphi 2005 PE, Turbo, RAD Delphi 2009, XE, XE2
|
Verfasst: Sa 06.05.06 23:17
Jetzt hab ich noch was vergessen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure ComboBox1Change(Sender: TObject); procedure Form1.CheckBox1Click(Sender: TObject); procedure CheckBox2Click(Sender: TObject); procedure Form1.CheckBox3Click(Sender: TObject);
procedure Kontrollabfrage; private
public
var Form1 : TForm1;
implentation
.. ..
Var a, b, c, d : double; |
|
|
Blackheart666
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: Sa 06.05.06 23:17
Schon der erste der meckert, wie siehts aus mit case ? und für Anfänger naja (dann wenigstens kommentiert, sonst bringts auch nichts).
|
|
MarcRB1975
      
Beiträge: 131
XP, Windows7
Delphi 2005 PE, Turbo, RAD Delphi 2009, XE, XE2
|
Verfasst: Sa 06.05.06 23:32
1. Ich denke ich schon, dass ich das komentiert habe, was das Ganze bezwecken soll.
2. Bist Du wirklich der Meinung, dass ich mit CASE das ganze schreiben sollte. Nicht ich, sondern der andere, als Anfänger?? Glaubst Du nicht, dass ein Anfänger erstmal das Grundprinzip versehen sollte??
3. funktioniert es.
4. Bis dato war wirklich keiner in der Lage oder bereit, das funktionsfähig zu schreiben und sich mit der Problematik auseinander zu setzen. Wahrscheinlich, weils keiner kappiert oder keiner nen "Bock" hatte.
Ich gebe es zu... es ist immer einfacher, den Code von anderen zu kontrollieren, als sich hinzusetzen, die Frage und das Problem zu erkennen und dann selbst ein paar Zeilen zu schreiben. Gell!!
Aber manchmal kann es eine Hilfe sein, weil Fehler im Code sind, die man einfach übersehen hat. Dann seid ihr "MOTZER"  wieder gut.
Nix für ungut.
Servus
|
|
Blackheart666
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: Sa 06.05.06 23:41
Warum einfach, wenns auch kompliziert geht.
Item Index war schon ein guter Ansatz.
|
|
Halunkel 
      
Beiträge: 34
|
Verfasst: So 07.05.06 02:03
Hallo!!
Vielen Dank für eure Hilfe!!
@ aim65: DAnke für deinen Vorschlag und das hochgeladene Prigramm mit vielen Hinweisen!! Leider standen in dem Programm dann keine Einträge mehr in der Combobox!
Und natürlich benenne ich die Variablen länger und mit Hinblick auf die spätere Verwendung, aber für das Problem zu lösen, schien es mir nun am einfachsten a zu nehmen!
Aber wie gesagt danke für deine Mühe!!
@ MarcRB1975:
Dein Posting war super!! Da ich wie du festgestellt hast wirklich ein blutiger Anfänger bin und momentan eben noch mit den Anfangsproblemen meine Schwierigkeiten habe, da ich viele Befehle und Funktionen einfach noch nicht kenne. Aber dein Quelltext hat gut funktioniert und hatte die Wirkung wie ich sie mir erhofft hatte!! ICh musste nur die drei Abfragen bzgl. der Checkboxen in die einzelnen Boxen selbst schreiben, nicht direkt hinter die Combobox, wie es in deinem Quellcode steht!! Aber genau das habe ich gesucht!!
Ich fand es auch klasse, dass du nicht direkt mit irgenwelchen komplexen Anwendungen gekommen bist, die ein Anfänger eben noch nicht rafft!! Ersmal muss ich die Grundlagen lernen und dann kann ich mir gedanken über die Komplexität und Schnelligkeit eines Programms machen!!
Ich hoffe du und auch alle anderen werden mir noch einige Fragen so hilfreich beantworten können!!
Ich bin aktiv erst seit gestern dabei und muss euch allen wirklcih danken!! Ich bekam schnelle und sehr hilfreiche Antworten auf viele Fragen und bin positiv von diesem Forum überrascht!!
Allen vielen Dank!!
Gruß
Andy
|
|
aim65
      
Beiträge: 312
Win 9x, Win XP
Delphi 3pro, 7PE
|
Verfasst: So 07.05.06 12:38
Hier motzt doch keiner - bei dem schönen Wetter
@ Halunkel:
Dein Protest wegen der fehlenden Einträge ist berechtigt. Da ich Deine .dpr (D7?) in meinem D3 nicht öffnen konnte, habe ich anhand Deines .pas Textes das Formular neu "nachempfunden". Ich vermute daher, daß Du die Texte für die Combobox schon im OI eingetragen hattest.
Mein Beispiel sollte eigentlich nur ein Sammelsurium von Tips sein - keine Religionsbelehrung
Damit es mit meinem Beispiel hinhaut, kannst Du die Texte bei der Initialisierung der Form erzeugen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.FormActivate(Sender: TObject); begin combobox1.Items.Add(ComText1); combobox1.Items.Add(ComText2); combobox1.Items.Add(ComText3); end; begin with combobox1.items do begin Add(ComText1); Add(ComText2); Add(ComText3); end; end; |
Aber wie Du siehst, gibt's 'ne Menge Möglichkeiten. Ich wünsch Dir noch viel Spaß mit Delphi. 
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: So 07.05.06 14:39
Sorry dass ich das Posting hier unterbreche und ein kleines OffTopic einbringe: wenn du einen BOOLEAN Ausdruck per if überprüfen willst, musst du doch nicht true = true schreiben...
Delphi-Quelltext 1: 2: 3:
| if Checkbox1.Checked=true then if true=true then |
Warum doppelt gemoppelt? In einer If Abfrage wird auf die Wahrheit eines Ausdruckes überprüft, darum kannst du schreiben:
Delphi-Quelltext 1:
| if Checkbox1.Checked then |
Vergleiche auch:
Delphi-Quelltext 1: 2: 3: 4: 5:
| var x:boolean; begin x := 5 = 5; x := 1 = 2; x := Edit1.Text = 'Hallo!'; |
Wollts nur anmerken, geht alles etwas schneller, dann ^^
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Halunkel 
      
Beiträge: 34
|
Verfasst: So 07.05.06 18:09
Danke für die letzten beiden Einträge!!
@ aim65:
Ja stimmt!! Ich habe die Einträge direkt in über "Items" gemacht! Und deshalb fehlten deine dann auch!! Und für dein "Sammelsorium" an Tipps bin ich dir dankbar, da sie alle Verwendung gefunden haben bzw. finden werden!! Ich bin momentan für wirklich jeden Tipp dankbar, denn es ist schwierig sich alles selbst beizubringen und da hilft eben jeder Vorschlag!!
@ JayEff:
Ja das mit dem "Checked-Hinweis" ist nicht schlecht!! Werde ich in Zukunft nach deiner Methode handhaben! Auch dafür danke!!
|
|
aim65
      
Beiträge: 312
Win 9x, Win XP
Delphi 3pro, 7PE
|
Verfasst: Mo 08.05.06 00:01
Gerade noch heute nach Hause gekommen...
@ JayEff: Auch Off-Topic
Hast natürlich recht mit CheckBox.Checked. Hatte ich auch glatt übersehen. Diese Schreibweise ist besser ohne die Lesbarkeit zu beeinträchtigen.
Allerdings habe ich mit dem zweiten Beispiel mit den Boolean Tricks meine Bedenken. So etwas habe ich am Anfang auch sehr gerne gemacht (mit Assembler gibts noch mehr solcher Gemeinheiten). Aber nachdem ich Mühe hatte, bei einigen meiner eigenen Programme nach 6 Monaten solche Konstrukte nachzuvollziehen, bin ich reumütig wieder zur Schreibweise mit "if" oder "case" zurückgekehrt. Die Wartbarkeit hat bei mir mittlerweile Vorrang vor der Kürze. Aber das ist Geschmackssache 
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 12.05.06 20:18
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
|