Autor Beitrag
Dreas
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 08.10.03 19:21 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Mi 08.10.03 19:56 
Zum Beispiel so:

ausblenden Delphi-Quelltext
1:
2:
var
 A, B, C: Boolean;


ausblenden 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;


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

ausblenden 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.. :-)

_________________
Hasta La Victoria Siempre
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 08.10.03 19:57 
Terra23 hat folgendes geschrieben:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14



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

WIN 95, WIN NT 4.0, WIN 98, WIN 98SE, WIN 2000, RedHat Linux 7.3, Mandrake Linux 9.2, Knoppix Linux 3.3
D6 Pers
BeitragVerfasst: Mi 08.10.03 21:24 
end; schließt nicht nur Prozeduren ab...
Es schließt genauso auch ein IF...THEN ab.

Aber dazu will ich mich jetz nicht weiter äußern.

Den Code kannst du auch in den OnClick-Event des Buttons schreiben, da wirst du es in deinem Fall wahrscheinlich brauchen. :)

Zum Einstieg in Delphi kannst mal hier vorbei schauen: Einsteigerkurs

Oder hier: Tutorial-Auswahl

Is ganz interessant und gut erklärt, immer schön mit Beispielen :)

_________________
Wer das Konzept der Unendlichkeit verstehen will, muss nur das Ausmaß menschlicher Dummheit betrachten. (Voltaire)
Terra23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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:

_________________
Hasta La Victoria Siempre
Dreas Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 09.10.03 18:54 
Hallo Leute,

vielen Dank für Eure Bemühungen.
Ich hab das jetzt so gelöst:

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:
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, 182);
      edit3.text:=floattostrf(kelvin, ffFixed, 182);
     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, 182);
     edit3.text:=floattostrf(kelvin, ffFixed, 182);
    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, 182);
      edit2.text:=floattostrf(fahrenheit, ffFixed, 182);
     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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.

_________________
We are, we were and will not be.
Dreas Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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)
ausblenden 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, 182);
     edit3.text:=floattostrf(kelvin, ffFixed, 182);
    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!?!?