Autor Beitrag
Paulchengb
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 39



BeitragVerfasst: Do 29.11.07 17:23 
Hallo,

ich habe 3 Labelededit(le) Felder.

Die Zahl in le1 darf nicht kleiner 0 sein und das Feld darf auch nicht leeren sein.
Bei le2 und le3 müssen die Zahlen aus dem Intervall von [0;9] stammeen und le2<le3.

Mein Quelltext sieht wie folgt aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
begin
a:= strtoint (labelededit1.Text);    //Anzahl
v:= strtoint (labelededit2.text);    // von
b:= strtoint (labelededit3.text);    //bis
n:=0;                                // Anzahl der eingeschränkten Zahlen

// Fehlerkontrolle
if (labelededit1.text='') or (a<0) or not (v in [0..10]) or not (b in [0..10]) or (v>b) then
  begin
    showmessage ('Bitte alle Felder korrekt ausfüllen' + #13#10 + 'Es dürfen nur Zahlen von [0;10] bei den Einschränkungen enthalten sein');
    exit
    end;


Wenn ich jetzt le1 leer lasse und denn eine procedure ausführen will, sagt er, dass '' kein gültiger Integralwert ist. Das stimmt auch, aber er sollte ja die Meldung zeigen und das Programm bzw. die Procedure erst gar nicht ausführen. Definiere ich "a" erst nach der if-Bedinungung, geht alles jdeoch einfachfrei. Das versteh ich nicht. An was könnte das liegen bzw. was muss ich in der Bedingung ändern, dass ich a auch vor der Bedingung definieren kann.


Auch das funktioniert nicht:


ausblenden Delphi-Quelltext
1:
2:
....
if (Length(labelededit1.text)=0....
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 29.11.07 17:33 
Das liegt daran, dass die Dinge nacheinander geschehen. ;-) Erst versuchst Du einen leeren String in eine Zahl umzuwandeln (was natürlich nicht geht) und erst dann schaust Du, ob der String leer ist.

In Deinem Fall würde ich statt StrToInt auf StrToIntDef setzen und als Default-Wert jeweils einen ungültigen Wert wählen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Paulchengb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 39



BeitragVerfasst: So 09.12.07 19:50 
Hi,

also dein Vorschlag hat super funktioniert, nur jetzt habe ich eine ander Frage:

Ich habe 2 proceduren, Button1Click und Button2Click und bei allen beiden wird eine Fehlerkontrolle durchgeführt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);

var v,b,x,a,i: integer;
    obj: TIntObject;

begin
//Liste leeren
Listbox1.Clear;

//Deklarierung der Variablen
a := strtointdef (labelededit1.Text, -1);    //Anzahl  der Zufallszahlen
v := strtointdef (labelededit2.text, -1);    //von
b := strtointdef (labelededit3.text, -1);    //bis
n1 := 0;                                     //Anzahl der eingeschränkten Zahlen

// Fehlerkontrolle
if  (a<=0) or not (v in [0..10]) or not (b in [0..10]) or (v>b) then
...


Und das gleiche, nur eben andere labelededit Felder:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
//Zufallszahlen 2
procedure TForm1.Button2Click(Sender: TObject);

var v,b,x,i,a,n: integer;
    obj: TIntObject;

begin
//Liste leeren
Listbox2.clear;

//Randomize
randomize;

//Deklaration der Variablen
a := strtointdef (labelededit4.text, strtointdef (labelededit1.text,1)); //Anzahl der Zufallszahlen
v := strtointdef (labelededit5.text, -1);                                //von
b := strtointdef (labelededit6.text, -1);                                //bis
n := 0;                                                                  //Anzahl der eingeschränkten Zahlen

//Fehlerkontrolle
if  (a<=0) or not (v in [0..10]) or not (b in [0..10]) or (v>b) then
...


Und dann gibts noch einen procedure Button3Click, die aber nur ausführbar sein soll, wenn die beiden obigen Fehlerkontrollen "bestanden" wurden, also alle Eingaben korrent sind.


Wie kann ich das denn anstellen?
DrRzf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: So 09.12.07 20:24 
es gibt dazu mehrere möglichkeiten
2 globale varaiablen anlegen von typ boolean.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  test1 : boolean
  test2 : boolean 

//am anfang deiner buttonklicks die zugehörige var auf false setzen
test1 := false;
//dein restlicher source
if  (a<=0) or not (v in [0..10]) or not (b in [0..10]) or (v>b) then test1 := true;
// bei der zweiten natürlich das selbe mit Test2


wenn du Button3Click ausführst

ausblenden Delphi-Quelltext
1:
2:
3:
4:
if Test1 and Test2 then
  begin
  //mach das wenn beide true
  end


oder auch
ausblenden Delphi-Quelltext
1:
if not (Test1 and Test2) then Exit;					

bei dieser variante wird die procedure verlassen falls einer der beiden nicht true ist

_________________
rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
Paulchengb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 39



BeitragVerfasst: Mo 10.12.07 15:58 
Hm,

also schonmal danke, aber irgendwie geht das nicht. Es wird auf jeden Fall "showmessage" angezeigt, auch wenn alle Bedingungen erfüllt sind:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// Fehlerkontrolle
fehlerkontrolle1 := true;
if  (a<=0) or not (v in [0..10]) or not (b in [0..10]) or (v>b) then
  begin
    fehlerkontrolle1 := false;
    showmessage ('Bitte alle Felder korrekt ausfüllen');
    exit
  end;


selbes mit fehlerkontrolle 2

und dann

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button9Click(Sender: TObject);
begin
if (fehlerkontrolle1 and fehlerkontrolle2) = true then
 Form3.show
 else
 begin
 showmessage ('alles ausfüllen');
 exit;
 end;



edit: hat sich erledigt...Ich muss ja vorher erst Button1 und 2 Click ausführen, damit die korrekten Werte für a, b,v und so angenommen werden...

nochmals edit: Geht das auch anders, ohne andauernd die proceduren ausführen zu müssen?

a,b und v werden eben erst bei procdure Button1Click definiert...
Miri
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: Di 11.12.07 08:02 
Ich glaub, ich würde die Fehlerüberprüfung in eine Funktion auslagern, die true oder false zurückliefert. Dann kannst du an den Stellen, wo du die Prüfung brauchst, auf die Funktion zurückgreifen!

_________________
Anonymes Eckenkind
Corpsman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228

KUbuntu 10.4
Lazarus
BeitragVerfasst: Di 11.12.07 08:12 
Geh mal her und baue deine Prüfbedingung einzeln

Also fang an mit
ausblenden Delphi-Quelltext
1:
if  (a<=0) then					

dann
ausblenden Delphi-Quelltext
1:
if  (a<=0) or not (v in [0..10]) then					

...

Mein Delphi hat auch hin und wieder probleme mit dem Abfragen auf Intervalle

Es kam da schon häufig vor das

ausblenden Delphi-Quelltext
1:
If ((v>=0) and ( v<= 10)) then					


Lief aber
ausblenden Delphi-Quelltext
1:
if   (v in [0..10])					

nicht.

_________________
--
Just Try it.