Autor Beitrag
Halunkel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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)

ausblenden 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 user profile iconChristian S.: Delphi-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus Algorithmen, Optimierung und Assembler verschoben am Sa 06.05.2006 um 01:43
MarcRB1975
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131

XP, Windows7
Delphi 2005 PE, Turbo, RAD Delphi 2009, XE, XE2
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if combobox1.text = 'Eintrag1' then
  a = 10;   {a ist eine Variable}
    if checkbox1.checked := true then
       a = a + 5{a sollte sich dann von 10 auf 15 ändern!}
    if checkbox2.checked := true then
       a = a + 7{a sollte sich dann auf 22 (wenn auch Checkbox1 aktiv ist) oder 17 ändern}
  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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
if combobox1.text = 'Eintrag1' then
  a = 10;   {a ist eine Variable}
    if checkbox1.checked := true then
       a = a + 5{a sollte sich dann von 10 auf 15 ändern!}
    if checkbox1.checked := false then
       a = 10;
    if checkbox2.checked := true then
       a = a + 7{a sollte sich dann auf 22 (wenn auch Checkbox1 aktiv ist) oder 17 ändern}
    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 user profile iconGausi: Delphi-Tags hinzugefügt
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: Sa 06.05.06 13:24 
Könntest ja erst mal jede Abfrage mit nur einer Zeile machen, etwa so:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: 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);
ausblenden Delphi-Quelltext
1:
2:
3:
4:
begin
  if checkbox1.Checked = true then a:=a+3 else a:=10//"10" wäre Startwert wie oben 
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131

XP, Windows7
Delphi 2005 PE, Turbo, RAD Delphi 2009, XE, XE2
BeitragVerfasst: 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:


ausblenden volle Höhe Delphi-Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131

XP, Windows7
Delphi 2005 PE, Turbo, RAD Delphi 2009, XE, XE2
BeitragVerfasst: Sa 06.05.06 23:17 
Jetzt hab ich noch was vergessen:


ausblenden 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;          // die muss du selbst schreiben //:

private

public

var Form1 : TForm1;

implentation

..
..

Var a, b, c, d : double;
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131

XP, Windows7
Delphi 2005 PE, Turbo, RAD Delphi 2009, XE, XE2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Sa 06.05.06 23:41 
Warum einfach, wenns auch kompliziert geht.
Item Index war schon ein guter Ansatz.
Halunkel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: So 07.05.06 12:38 
Hier motzt doch keiner - bei dem schönen Wetter :P

@ 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 8)

Damit es mit meinem Beispiel hinhaut, kannst Du die Texte bei der Initialisierung der Form erzeugen:
ausblenden 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
//EDIT: Oder auch so für Tippfaule...
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. :D
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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...
ausblenden Delphi-Quelltext
1:
2:
3:
if Checkbox1.Checked=true then
//das entspricht im fall, dass der Haken sitzt:
if true=true then

Warum doppelt gemoppelt? In einer If Abfrage wird auf die Wahrheit eines Ausdruckes überprüft, darum kannst du schreiben:
ausblenden Delphi-Quelltext
1:
if Checkbox1.Checked then					

Vergleiche auch:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var x:boolean;
begin
x := 5 = 5//x ist dann true
x := 1 = 2//x ist dann false
x := Edit1.Text = 'Hallo!'//wenn im Edit "Hallo!" steht, ist x true.

Wollts nur anmerken, geht alles etwas schneller, dann ^^

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Halunkel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 12.05.06 20:18 
@mods: ok nich böse sein, ein allerletzter offtopic x(

ausblenden Ich schreib doch nich:
1:
2:
3:
4:
if x=5 then
   bool:=true
else
   bool:=false;


ausblenden Oder noch besser:
1:
2:
3:
4:
case x=5 of
   true: bool:=true;
   false: bool:=false;
end;


Oder was meinst du damit x) Ich mein, die Lesbarkeit leidet nicht wenn du schreibst
ausblenden Genauso lesbar:
1:
bool := x=5					

Bei so einer Kleinigkeit ists nun wirklich lesbarer, wenn mans so schreibt ^^ Kannst ja ein Kommentar dahinter schreiben:
ausblenden Delphi-Quelltext
1:
//if x=5 then bool:=true ...					

Ok nun aber schluss, ich glaub den Rest bestenfalls per PN :oops:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.