Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Verschachtelte if-then Anweisung
Dreas - Mi 08.10.03 19:21
Titel: Verschachtelte if-then Anweisung
Hallo,
Weiss jemand, wie ich folgendes Problem am geschicktesten lösen kann?
Ich habe 3 edit-felder und ein button.
Beim onclick-Ereignis des buttons soll das programm erkennen, in welchem der 3 Felder eine Eingabe vorhanden ist und dementsprechend jeweils 2 Berechnungen mit Ausgabe auf den anderen beiden Feldern durchführen.
Die durchzuführenden Berechnungen sind abhängig davon, in welchem Feld etwas eingegeben wurde. Ich habe also 3 mögliche Rechenoperationen, von denen aber in Abhängigkeit des verwendeten Eingabefeldes nur eine beim onclick-Ereignis ausgeführt werden soll.
Kann ich das mit verschachtelten if-then Anweisungen realisieren oder gibt es dazu eine elegantere Lösung?
MfG
Dreas
Terra23 - Mi 08.10.03 19:56
Zum Beispiel so:
Delphi-Quelltext
1: 2:
| var A, B, C: Boolean; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); begin If Edit1.Text<>'' Then A:=True Else A:=False; If Edit2.Text<>'' Then B:=True Else B:=False; If Edit3.Text<>'' Then C:=True Else C:=False; end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| If (A=True) And (B=True) Then Begin
End Else If (B=True) And (C=True) Then Begin
End Else If (A=True) And (C=True) Then Begin
End; |
Es gibt viele Möglichkeiten. Du könntest auch z.B. bei Eingabe ins Edit-Feld prüfen:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.Edit1Change(Sender: TObject); begin If Edit1.Text='' Then A:=True Else A:=False; end; |
... und das dann für jedes Edit-Feld. Vergiß aber nicht, in der Form-Create die Variablen auf False zu setzen.. :-)
Anonymous - Mi 08.10.03 19:57
Terra23 hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| If (A=True) And (B=True) Then Begin
End Else If (B=True) And (C=True) Then Begin
End Else If (A=True) And (C=True) Then Begin
End; | |
da a, b und c vom typ boolean sind, kannst du den vergleich mit true und die klammern auch weglassen.
Dreas - Mi 08.10.03 21:17
Hi,
danke Euch beiden. Das sieht wirklich sehr einleutend aus, was Ihr geposted habt.
Da ich aber noch ein Neuling in der Delphi-Programmierung bin, hab ich noch eine Frage. Ich mach schon mal ein :oops:
Ist es nicht so, dass ein "end;" eine procedure abschliesst?
Wo muss ich denn dann diesen Code einfügen?
Zitat: |
If (A=True) And (B=True) Then
Begin
End Else
If (B=True) And (C=True) Then
Begin
End Else
If (A=True) And (C=True) Then
Begin
End; |
Das müsste doch auch in der onclick-procedure des buttons stehen oder?
Tut mir leid, dass ich so blöd nachfrage, aber ich muss mir das programmieren mehr oder weniger selbst beibringen. Und da ist jede Erklärung hilfreich.
MfG
Dreas
Terra23 - Do 09.10.03 13:18
... wie maze schon gesagt hat, das End schließt den Block ab und die Frage nach dem Aufruf, erübrigt sich, denn du hast ja gesagt, du willst es in den Button-Klick setzen, oder? :roll:
Dreas - Do 09.10.03 18:54
Hallo Leute,
vielen Dank für Eure Bemühungen.
Ich hab das jetzt so gelöst:
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: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| procedure TForm1.Button1Click(Sender: TObject);
var celsius,fahrenheit,kelvin:real;
begin
if edit1.text<>'' then begin celsius:=strtofloat(edit1.text); if celsius >=-273.15 then begin fahrenheit:=celsius*9/5+32; kelvin:=celsius+273.15; edit2.text:=floattostrf(fahrenheit, ffFixed, 18, 2); edit3.text:=floattostrf(kelvin, ffFixed, 18, 2); end else begin messagebox(self.handle,'Nur Werte über -273.15 zulässig','Achtung',mb_ok); edit1.clear; end end; if edit2.text<>'' then begin fahrenheit:=strtofloat(edit2.text); if fahrenheit>=-459.67 then begin celsius:=(fahrenheit-32)*5/9; kelvin:=(fahrenheit-32)*5/9+273.15; edit1.text:=floattostrf(celsius, ffFixed, 18, 2); edit3.text:=floattostrf(kelvin, ffFixed, 18, 2); end else begin messagebox(self.handle,'Nur Werte über -459.67 zulässig','Achtung',mb_ok); edit2.clear; end end; if edit3.text<>'' then begin kelvin:=strtofloat(edit3.text); if kelvin>=0 then begin celsius:=kelvin-273.15; fahrenheit:=(kelvin-273.15)*9/5+32; edit1.text:=floattostrf(celsius, ffFixed, 18, 2); edit2.text:=floattostrf(fahrenheit, ffFixed, 18, 2); end else begin messagebox(self.handle,'Nur Werte über 0 zulässig','Achtung',mb_ok); edit2.clear; end end; end; |
So funktionierts :D
Um sicherzustellen, dass vor der Berechnung nicht z.B in 2 Feldern etwas steht, habe ich im onenter-Ereignis bei jedem Feld angegeben, dass alle Felder geleert werden sollen.
Allerdings is mir nicht ganz klar, war das Programm macht, wenn ich zweimal hintereinander auf den button drücke.
Denn dann steht ja in allen 3 Feldern durch die erste Berechnung was drin.
Naja, motzen tut er nicht. Ändern tut sich auch nichts. Dann solls mir egal sein.
Also, vielen Dank nochmal...
MfG
Dreas
Gausi - Do 09.10.03 19:46
naja, wenn du zweimal auf den Button klickst, passiert das folgende:
Beim ersten Mal werden, ausgehend von der einen temperaturangabe, die anderen Felder ausgefüllt.
Beim zweiten Mal werden die Felder für Fahrenheit und Kelvin neu berechnet, danach auf Grundlage des eben neu berechneten die Felder Celsius und Kelvin neu ausgefüllt und zuletzt wird aus dem Kelvinwert Celsius und Fahrenheit neu geschrieben. Da die Werte stimmig sind, passiert auf der Form nichts, aber gerechnet wird!
Und: Die gesamte Procedur wird immer komplett abgearbeitet, wenn man das erste Editfeld ausfüllt. Denn wenn 1 ausgefüllt ist, werden dadurch 2 und 3 ausgefüllt, und somit ist z.B. edit2.text<>'' wahr.
Dreas - Do 09.10.03 21:42
hi gausi,
klingt logisch was Du sagst.
Somit hab ich also an meinem eigentlichen Problem vorbeiprogrammiert.
Weil das Programm, wenn ich Celsius eingebe, immer 3 Rechnungen durchführt. Das wollte ich eigentlich vermeiden. Es sollte nämlich in Abhängigkeit des verwendeten Feldes immer nur jeweils einmal rechnen.
Schön ist das SO jedenfalls nicht.
...und ich hatte mich schon gefreut :( ...
Ich hatte auch den Vorschlag von Terra23 ausprobiert, aber das hab ich nicht gebacken gekriegt, weil das irgendwie mit den variablen nicht gepasst hat. Denn zur Rechnung brauch ich real-Zahlen.
Naja, man kann halt nich alles haben.
Gruss,
Dreas
Nachtrag:
Ich hab jetzt mal meine if-Anweisung so geschrieben:
(mittlerer Teil, Anweisung bei Eintrag in editfeld2)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| if (edit2.text<>'') and (edit1.text='') and (edit3.text='') then begin fahrenheit:=strtofloat(edit2.text); if fahrenheit>=-459.67 then begin celsius:=(fahrenheit-32)*5/9; kelvin:=(fahrenheit-32)*5/9+273.15; edit1.Font.color:=clnavy; edit3.Font.color:=clnavy; edit1.text:=floattostrf(celsius, ffFixed, 18, 2); edit3.text:=floattostrf(kelvin, ffFixed, 18, 2); end else begin messagebox(self.handle,'Nur Werte über -459.67 zulässig','Achtung',mb_ok); edit2.clear; end end; |
Dann rechnet der jeweils nur einmal, denn nun kann ich auch die Textfarbe für die Ausgabe bestimmen. Das würde ja nicht gehen, wenn der die ganze procedur durchrechnen würde. Dann hätt ich ja immer feld1 und feld2 blau.
Nun bin ich wieder glücklich. :lol:
Und jetzt wird bei 2maligem drücken des buttons wohl gar nicht mehr gerechnet!?!?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!