Entwickler-Ecke

Sonstiges (Delphi) - if statements


death-adders - Di 16.05.06 15:35
Titel: if statements
hi!

also ich habe in meinem projekt 5 edit felder und muss prüfen, in welchem kein wert steht und in welchem ein wirt drinne ist. aber mein pc mag das nicth so recht!


Delphi-Quelltext
1:
2:
3:
4:
5:
  If edtY.text = ''
    and edtX.text <> 1
     and edtA.text <> 1
       and edtB.Text <> 1
         and edtC.text <> then ereignis


edtX, edta, edtB und edtC sind alles edtfelder. aber er gibt ne fehlermeldung von wegen inkompatible types

kann mir jemand gelfen?


azubi_20 - Di 16.05.06 15:41


Delphi-Quelltext
1:
2:
3:
4:
5:
  If edtY.text = ''
    and edtX.text <> '1'
     and edtA.text <> '1'
       and edtB.Text <> '1'
         and edtC.text <> 'x' then ereignis


der Berliner - Di 16.05.06 15:41
Titel: Re: if statements
user profile icondeath-adders hat folgendes geschrieben:
hi!

also ich habe in meinem projekt 5 edit felder und muss prüfen, in welchem kein wert steht und in welchem ein wirt drinne ist. aber mein pc mag das nicth so recht!


Delphi-Quelltext
1:
2:
3:
4:
5:
  If (edtY.text = '')
    and (edtX.text <> intToStr(1))
     and (edtA.text <> intToStr(1))
       and (edtB.Text <> intToStr(1))
         and (edtC.text <> )then ereignis //<<<---Hier Steht nichts zum vergleichen



So sollte es klappen.
Gruß


starsurfer - Di 16.05.06 15:47

user profile iconder Berliner hat folgendes geschrieben:
user profile icondeath-adders hat folgendes geschrieben:
hi!

also ich habe in meinem projekt 5 edit felder und muss prüfen, in welchem kein wert steht und in welchem ein wirt drinne ist. aber mein pc mag das nicth so recht!


Delphi-Quelltext
1:
2:
3:
4:
5:
  If (edtY.text = '')
    and (edtX.text <> intToStr(1))
     and edtA.text <> intToStr(1))
       and edtB.Text <> intToStr(1))
         and (edtC.text <> )then ereignis //<<<---Hier Steht nichts zum vergleichen



So sollte es klappen.
Gruß


1. inttostr(1) isses gleiche wie '1' //das abfragen ist aber ungünstig, wenn 2 drinne steht macht er Mist
2. wenn man mehrere Bedingungen hat, müssen diese in Klammern(und wirklich alle!) :mahn:

zur Frage:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if edit1.text='' then
 begin
 //das Edit ist leer
 end
  else
 begin
 // im Edit steht was drinne (Zahlen)
 end;


death-adders - Di 16.05.06 15:51

user profile iconazubi_20 hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
  If edtY.text = ''
    and edtX.text <> '1'
     and edtA.text <> '1'
       and edtB.Text <> '1'
         and edtC.text <> 'x' then ereignis


das geht nicht, da sagt der: "operator not applicable to this operand type"



user profile iconder Berliner hat folgendes geschrieben:
user profile icondeath-adders hat folgendes geschrieben:
hi!

also ich habe in meinem projekt 5 edit felder und muss prüfen, in welchem kein wert steht und in welchem ein wirt drinne ist. aber mein pc mag das nicth so recht!


Delphi-Quelltext
1:
2:
3:
4:
5:
  If (edtY.text = '')
    and (edtX.text <> intToStr(1))
     and (edtA.text <> intToStr(1))
       and (edtB.Text <> intToStr(1))
         and (edtC.text <> intToStr)then ereignis //<<<---Hier Steht nichts zum vergleichen - habe ich verbessert



So sollte es klappen.
Gruß


und das geht auch nicht, da sagt der: " Incompatible types: 'string' and 'boolean'
'then'expected but ')' found"


azubi_20 - Di 16.05.06 15:52

So, um noch mal zusammenfassend alles richtig zu machen :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  
If (edtY.text = '')   and
   (edtX.text <> '1'and
   (edtA.text <> '1'and
   (edtB.Text <> '1'and
   (edtC.text <> 'x'// <-- oder was auch immer
then ereignis


Stoney - Di 16.05.06 15:55
Titel: Re: if statements
Probier's mal so:
(Alle Lösungen miteinander vermischt und noch ne Klammer drum rum :) )


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  If ((edtY.text = '')
    and (edtX.text <> '1')
     and (edtA.text <> '1')
       and (edtB.Text <> '1')
         and (edtC.text <> 'x')) then 
ereignis


death-adders - Di 16.05.06 15:57

user profile iconazubi_20 hat folgendes geschrieben:
So, um noch mal zusammenfassend alles richtig zu machen :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  
If (edtY.text = '')   and
   (edtX.text <> '1'and
   (edtA.text <> '1'and
   (edtB.Text <> '1'and
   (edtC.text <> 'x'// <-- oder was auch immer
then ereignis


jo danke, das geht! gibt nur noch einen haken, wenn nu z.B. bei editX nichts, also gar nichts drin steht, dann gibt es ne fehlermeldung, aber ich wollte, das dann halt garnichts passiert, weil die bedingung j anicht erfüllt wurde!

danke für die suuuper schnelle hilfe!


azubi_20 - Di 16.05.06 16:01

user profile icondeath-adders hat folgendes geschrieben:

jo danke, das geht! gibt nur noch einen haken, wenn nu z.B. bei editX nichts, also gar nichts drin steht, dann gibt es ne fehlermeldung, aber ich wollte, das dann halt garnichts passiert, weil die bedingung j anicht erfüllt wurde!

Bei welcher Aktion gibt es was für ne Fehlermeldung ???


death-adders - Di 16.05.06 16:09

user profile iconazubi_20 hat folgendes geschrieben:
user profile icondeath-adders hat folgendes geschrieben:

jo danke, das geht! gibt nur noch einen haken, wenn nu z.B. bei editX nichts, also gar nichts drin steht, dann gibt es ne fehlermeldung, aber ich wollte, das dann halt garnichts passiert, weil die bedingung j anicht erfüllt wurde!

Bei welcher Aktion gibt es was für ne Fehlermeldung ???


ich habe das prog gestartet ind EdtX alles gelöscht, auf den button gedrückt, dann sollte ja eigentlich nsicht passieren aber statt dessen kommt ein richtiges fenster in dem steht Project Project1.exe raised exception class EConvertError with message""is not a valid floating point value'. Process stopped. Use Step or Ru n to continue.


Born-to-Frag - Di 16.05.06 16:13

Zeig mal mehr code.. dann rufst du warscheinlich irgendwo StrToInt('') auf.

greetz


death-adders - Di 16.05.06 16:14


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.BtnRechneClick(Sender: TObject);
begin

  If (edtY.text = ''and
   (edtX.text <> '1'and
   (edtA.text <> '1'and
   (edtB.Text <> '1'and
   (edtC.text <> '1')
then application.Terminate;
end;


azubi_20 - Di 16.05.06 16:20

da kann dieser Fehler gar nicht auftreten...
An welcher stelle hält dein Programm an ?
Vielleicht postest du auch mal deinen ganzen Quelltext, wenns nicht zuviel ist.


death-adders - Di 16.05.06 16:23

rofl lol jetz gehts!?!

kp warum!!!

baer vielen dank für die hilfe!!


azubi_20 - Di 16.05.06 16:27

Noch ne kleine Sache : willst du wirklich dein gesamtes Programm beenden, oder nur aus der Prozedur aussteigen ?


Delphi-Quelltext
1:
2:
3:
application.terminate; //beendet das Programm

exit; //verlässt sofort die aktuelle Prozedur


ZeitGeist87 - Di 16.05.06 16:27

das einfachste bei sowas ist ne case-struktur...

naja warum einfach wenns auch kompliziert geht...


death-adders - Di 16.05.06 18:44

ne, den befehl habe ich nur benutzt, um zu gucken, ob es geht, weil wenn es geht, mussich das prog sowieso beenden.


death-adders - Di 16.05.06 19:16


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.BtnRechneClick(Sender: TObject);
var y, x, a, b, c :real;
begin

  If (edtY.text = ''and
    (edtX.text <> '1'and
     (edtA.text <> '1'and
      (edtB.Text <> '1'and
       (edtC.text <> '1'then begin (X:=strtofloat(edtX.text)) and
                                      (A:=strtofloat(edtA.text)) and
                                       (B:=strtofloat(edtB.Text)) and
                                        (C:=strtofloat(edtC.Text));
                               end;
end;


so, und warum geht das denn dann nicht?????


Born-to-Frag - Di 16.05.06 19:18

:shock: :shock: :shock:

Also darauf wirst du wohl auch noch selbst kommen..
Seit wann trennst du Anweisungen mit AND?!?


death-adders - Di 16.05.06 19:23

ditsch! thx


ZeitGeist87 - Mi 17.05.06 07:17

Rein interessenhalber: Muss in dem Edit immer nur der Wert '1' stehen?


death-adders - Mi 17.05.06 14:22

nein, es geht nur darum zu prüfen ob eine zahl im edit steht, da ist mir auch noch aufgefallen, das 1 ja weder kleiner noch größer als ein ist, also wenn eine 1 im edit steht, dann ist ja die bedingung false, also wird alles nach dem then nicht ausgeführt. desshalb nehme ich jetzt einfach kleiner als 10000 da zahlen über 9999 eh quatsch wären.!


ZeitGeist87 - Mi 17.05.06 14:48

ähm riesenfehler!!!

so wie du prüfst, checkst du nur ob der wert im edit1 <> deinem wert ist.

tipp ich genau diesen wert ein passiert ein fehler!!!

prüf so


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 ...
 //Prüfen ob was eingegeben wurde
 if length(edit1.text) > 0 then
 begin
  //Prüfen, ob Eingabe im Bereich liegt
 end
 else
  //Abruch, da keine Eingabe


Xion - Mi 17.05.06 14:54

ja, so hast du aber die länge. wie ich das sehe gehts doch drum, ob ne zahl drinsteht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
var E1,E2,E3,E4,E5: integer;
begin
 try 
  E1:=strtoint(Edit1.Text);
 except
  E1:=0//ggf. ShowMessage-Meldung
 end;

 try 
  E2:=strtoint(Edit2.Text);
 except
  E2:=0//ggf. ShowMessage-Meldung
 end;

...
if ...
...

end;


ZeitGeist87 - Mi 17.05.06 15:01

so hab ich nicht die länge so prüf ich ob etwas im edit steht
was bis dahin drin steht ist gleich!
sobald etwas drin steht kann er da wo Verarbeitung steht prüfen ob es eine Zahl ist!!
am besten mit der Funktion VAL, diese gibt auch gleich zurück welches zeichen nicht korrekt ist also 12a4 gibt die funktion nen fehler aus und sagt das position 3 nicht korrekt ist.

so würd ichs machen ist die beste lösung meiner meinung nach wenn er nicht unbedingt alles in try-except-blöcke fassen möchte..


death-adders - Mi 17.05.06 15:10

ja, das habe ich auch gemerkt desshalb habe ich dann geschrieben

Delphi-Quelltext
1:
2:
if(edit1.text <> 1or
           (edit1.text =1) ...


aber das ging nicht und



Delphi-Quelltext
1:
if(edit1.text > 99999999999)                    


ging auch net!

aber


Delphi-Quelltext
1:
if(edit1.text <>0,00000000000000000001then...                    


ging, da ich ja nie den wert 0,00000000000000000001 eingeben werde! ;-)


death-adders - Mi 17.05.06 15:13

also wegen dem try/except!

auf deutsch sozusagen:

Delphi-Quelltext
1:
2:
3:
4:
5:
try                  //versuche ob das gehen würde
  E1:=strtoint(Edit1.Text);
 except              //wenn es geht dann mache folgendes
  E1:=0//ggf. ShowMessage-Meldung
 end;


ZeitGeist87 - Mi 17.05.06 15:16

lol!!

so prüft man aber nicht wirklich auf korrekte eingaben!
wenn jemand anders das programm nutzt und genau das eingibt auf was du ungleich prüfst hast du wieder den selben fehler wie mit prüfung auf ungleich 1 oder 999999

mach folgendes:

2 möglichkeiten

1. schreib in edit1.onKeyPress folgendes


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', DecimalSeparator, ThousandSeparator, Char(VK_BACK)]) then
  Key := #0;
end;


2. möglichkeit

Bei heutiger Rechnerleistung stellt es auch kein Problem mehr dar, bei jeder Eingabe den kompletten Inhalt des Feldes zu prüfen und dem Anwender beispielsweise durch Signalfarben deutlich zu machen, dass er noch keinen eindeutigen Wert angegeben hat. Hier ist das OnChange-Ereignis der richtige Ansatzpunkt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Edit1Change(Sender: TObject);
var
 Error: Integer;
 Dummy: Integer;
begin
 val(Trim(Edit1.Text), Dummy, Error);
 if Error<>0 then
   Edit1.Color:=clRed
 else
   Edit1.Color:=clWindow;
end;


so lässt du nur zahleneingaben zu!


death-adders - Mi 17.05.06 15:20

ne, das geht nicht, weil wenn man keinen wert eingibt, dann soll er diesen ja berechnen


ZeitGeist87 - Mi 17.05.06 15:24

achso du meinst beispielsweise so

ich hab 3 edits

edit1 = summand1
edit2 = summand2
edit3 = summe(ergebnis)

benutzer tippt in edit1 5 ein und in edit3 15
dann klickt er aufn button und da in edit2 nix steht muss das programm edit2 berechnen (im beispiel also 10)

vom prinzip her richtig?

nur um dir dann nen korrekten ansatz geben zu können..


death-adders - Mi 17.05.06 15:29

ja und wenn edit 1 leer ist aber edit 2 und 3 befüllt ist, dann soll edit 1 berechnet werden! mit einer anderen formel!


ZeitGeist87 - Mi 17.05.06 15:40

dann ist der beste weg folgender

je nach status wird eine andere formel ausgeführt (machst du am besten mit case auf den status)


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:
 
 procedure meineFormeln(status: integer);
 begin
  case status of
   1begin
       //Formel 1
      end;
   2begin
       //Formel 2
      end;
   ...
 end;
 
 procedure pruefeEingabe;
 begin
  if length(edit1.text) <= 0 then
  begin
   meineFormel(1);
   exit; //Damit er nicht weiterläuft
  end
  else
   if length(edit2.text) <= 0 then
   begin
    meineFormel(2);
    exit;
   end
   else 
    if ....
 end;


death-adders - Mi 17.05.06 15:50

jo danke, das würde gehen, dann muss nur noch zusätzlich geprüft werden, ob in den anderen etwas drinne ist, sonst gibs ja nen fehler! ich habe nun nur schon das ganze mit mit nem langen if satz fast fertig, und das geht, dann schreibe ich dazu, das man aus technischen gründen den wert 0,0000000001 nicht eingeben soll! :-D


ZeitGeist87 - Mi 17.05.06 15:53

wenn du das mit den technischen gründen schreibst, versprech ich dir probierts jeder aus =)
du kannst ja dann bei der formel-berechnung prüfen, ob in den feldern, die du zur berechnung brauchst etwas steht.

wie gesagt die lösung mit 0,00000001 ist nicht sehr äquivalent..


azubi_20 - Do 18.05.06 08:41

Ok, also ich hab das jetzt so verstanden, das du einmal überprüfen willst ob Zahlen eingegeben wurden und dann je nach dem welche edits belegt sind ,eine bestimmte Formel benutzen willst.

Also wegen Zahlen eingeben, würde ich nur Zahlen zulassen :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
//Läßt nur gültige Zahlen-Eingaben zu
if not (Key in ['0'..'9', DecimalSeparator, Char(VK_BACK)]) then
  Key := #0;
 if (Key = DecimalSeparator) AND (pos(Key, (Sender as TCustomEdit).Text) > 0then
    Key := #0;
end;

Und dieses Ereignis jedem Edit im KeyPress-Ereignis zuordnen (über Objektinspektor)

Dann Eingabe überprüfen und entsprechende Formel auswählen :

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:
procedure Rechnen;
var Formel1, Formel2, Formel3, Formel4, Formel5 : boolean;
 begin
 // Bestimme welche Formel
 //Edit1 ist leer
   Formel1 := (Edit2.text<>"") AND (Edit3.text<>"") AND (Edit4.text<>"") AND (Edit5.text<>"");
 //Edit2 ist leer
   Formel2 := (Edit1.text<>"") AND (Edit3.text<>"") AND (Edit4.text<>"") AND (Edit5.text<>""); 
 //Edit3 ist leer
   Formel3 := (Edit1.text<>"") AND (Edit2.text<>"") AND (Edit4.text<>"") AND (Edit5.text<>"");
 //Edit4 ist leer
   Formel4 := (Edit1.text<>"") AND (Edit2.text<>"") AND (Edit3.text<>"") AND (Edit5.text<>"");
 //Edit5 ist leer
   Formel5 := (Edit1.text<>"") AND (Edit2.text<>"") AND (Edit3.text<>"") AND (Edit4.text<>"");

 //Setze Formel
  If Formel1 then
   begin
   //Hier entsprechende Formel einsetzen
   //z.B. :
   Edit1.text := FloatToStr(strtofloat(Edit2) + strtofloat(Edit3) * strtofloat(Edit4) + strtofloat(Edit5));
   end;
  If Formel2 then
   begin
   //Hier entsprechende Formel einsetzen
   end;
  If Formel3 then
   begin
   //Hier entsprechende Formel einsetzen
   end;
  If Formel4 then
   begin
   //Hier entsprechende Formel einsetzen
   end;
  If Formel5 then
   begin
   //Hier entsprechende Formel einsetzen
   end;

 end;


death-adders - Do 18.05.06 16:13

Ok, also nu weiß ich, wei ich es mach!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
try

edit.text:=floattostr(meine fornmel);

except
try
edit2.text:=floattostr(meinezweiteformel);
except
try

...
...
...


so geht es wuuunderbar!

danke an alle!


ZeitGeist87 - Do 18.05.06 16:20

versteh ich ned =(

so weißt du nur das ergebnis vor..da frag ich mich was dir das bringt wenn du das in nen try except block fässt..

naja..vielleicht erklärst es mal =)


death-adders - Do 18.05.06 18:18

ich habe ja 5 edit felder, wenn ich in 4 stück werte eingebe, soll er die mit formel 1 berechnen
wenn ich in andere 4 werte eingebe, soll er das mit formel 2 berechnen usw.

also dachte ich baue ich was mit try, wobei ich bei meinem letztem post was falsch verstanden hatte

ich muss also versuchen, ob variante eins (wo fie felder 1-4 befüllt sind) funktioniert, denn wenn ich mit einem leerem feld rechne, dann bekomme ich ja immer einen fehler, also, wenn er dann einen fehler bekommt, soll er dann verscuhen, ob variante zwei funtzt (wo felder 2-6) befüll sind

usw.