Autor Beitrag
Linus
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 10.01.03 16:18 
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...

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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:

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

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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:
ausblenden 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.

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."