Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Abbruchbedingung in einer procedure bei leeren edit feldern


Linus - Fr 10.01.03 16:18
Titel: Abbruchbedingung in einer procedure bei leeren edit feldern
Hallo Leutis :)

Da sich das Programm immer Aufhängt (bzw. bei der .exe fehlermeldung ausgibt) wenn in meiner Prozedur Werte aus Edit Feldern eingelesen werden sollen, die aber nicht ausgefüllt wurden (also leer sind), will ich das die procedure sofort abgebrochen wird, wenn das edit feld leer ist

ich habe es schon mit

(1) if Edit2.Text='' then exit;
if Edit4.Text='' then exit;

und mit

(2) if stelle='' then exit;
if zeichen='' then exit;

versucht :) aber das funktiniert nicht :( die procedure bricht nicht ab (bei 1) und delphi meldet inkompatible typen bei 2 :(

das ist ein code...


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button14Click(Sender: TObject);
var kette, zeichen: string;
    stelle: integer;

begin
kette:=Edit1.Text;
stelle:=StrToInt(Edit2.Text);
zeichen:=Edit4.Text;
Insert(zeichen, kette, stelle);
Edit1.Text:=kette;
end;



Danke für eure Hilfe :)


smiegel - Fr 10.01.03 17:31

Hallo,

Dein Problem liegt an der function StrToInt. Diese erzeugt einen EConvertError, wenn der zu wandelnde Text keinen gültigen Integer ergibt. Diesen Fall musst Du abfangen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button14Click(Sender: TObject); 
var kette, zeichen: string; 
    stelle: integer; 
begin 
  kette:=Edit1.Text; 
  if (Length(kette)>0) then stelle:=StrToInt(Edit2.Text) else stelle:=0;
  if (stelle>0) then
  begin
    zeichen:=Edit4.Text; 
    Insert(zeichen, kette, stelle); 
    Edit1.Text:=kette; 
  end; // if
end;


Wolff68 - Fr 10.01.03 18:12

smiegel hat folgendes geschrieben:
...
if (Length(kette)>0) then stelle:=StrToInt(Edit2.Text) else stelle:=0;
if (stelle>0) then
begin
...

Damit hast Du zwar geprüft, ob in Edit2 was drin ist, (wobei If Edit2.Text = '' then exit; etwas kürzer ist), aber Du weist noch immer nicht, ob nicht ein DAU da Buchstaben eingegeben hat.

Entweder also das StrToInt in einen Try-exept packen, oder selber vorher prüfen, ob nur Zahlen eingegeben wurden, oder bei der Eingabe alles verbotene erst gar nicht zulassen.

Try-except-Lösung:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
var kette, zeichen: string;
    stelle: integer;
begin
  kette:=Edit1.Text;
  try
    stelle:=StrToInt(Edit2.Text);
    zeichen:=Edit4.Text;
    Insert(Edit4.Text, kette, stelle);
    Edit1.Text:=kette;
  except
  end;
end;

Selber prüfen:

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:
function IsValidInteger(s: String): Boolean;
var
  i : integer;
begin
  result := false;
  IF length(s) = 0 then exit;
  IF NOT (s[1] in ['-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
    then exit;
  For i := 2 to length(s) do begin
    IF NOT (s[i] in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
      then begin
        result := false;
        exit;
      end;
  end;
  result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var kette, zeichen: string;
    stelle: integer;
begin
  If Not IsValidInteger(Edit2.Text) then exit;
  kette:=Edit1.Text;
  stelle:=StrToInt(Edit2.Text);
  zeichen:=Edit4.Text;
  Insert(Edit4.Text, kette, stelle);
  Edit1.Text:=kette;
end;

Eingabe verhindern:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Button1Click(Sender: TObject);
var kette, zeichen: string;
    stelle: integer;
begin
  kette:=Edit1.Text;
  stelle:=StrToInt(Edit2.Text);
  zeichen:=Edit4.Text;
  Insert(Edit4.Text, kette, stelle);
  Edit1.Text:=kette;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
  if ((Sender as TEdit).SelStart = 0) then begin // Zu beginn auch '-' zulassen
    IF NOT (Key in ['-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']) then
      Key := #0;
    end
  else begin
    IF NOT (Key in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']) then
      Key := #0;
  end;
end;
Hier muß bei Programmstart bereits eine Zahl in Edit2 stehen, da ja nur geprüft wird was dazukommt.