Blok try i except zabezpieczający przed podaniem liczby innej niż z zadanego przedziału

0

Witam

mam problem i nie wiem jak to rozwiązać. Napisałem taki kod:

begin

try
   a := StrToInt(Edit1.Text);
   b := StrToInt(Edit2.Text);
   c := StrToInt(Edit3.Text);
except
      ShowMessage('Wprowadź calkowitą iczbę w przedziale od 1 do 250');
end;

//dalsza część

end.

Chciałbym żeby jak ktoś wpisze liczbę która nie jest całkowita i nie jest z powyższego przedziału to żeby wyświetlał się powyższy komunikat i program nie wykonywał się dalej, ale nie wiem jak to zrobić. Myślałem, że jak wejdzie do except to się zatrzyma, ale on wykonuje dalsze instrukcje. Ktoś może podsunąć jakiś pomysł?

dodanie znacznika <code class="delphi"> - @furious programming

2

Ale przecież ShowMessage w wyjątku się pokaże. Tylko przy uruchomieniu exeka z poza IDE. A i except przecież nie przerywa działania kodu, to nie cepepe i return. Musisz albo kod prawidłowy dać w bloku po try albo w bloku except dać Exit;.

Edit: ewentualnie zrobić tak:

//...
var
  I1, I2, I3 : integer;
  Ok1, Ok2, Ok3 : boolean;
begin
  Ok1 := TryStrToInt(Edit1.Text, I1);
  Ok2 := TryStrToInt(Edit2.Text, I2);
  Ok3 := TryStrToInt(Edit3.Text, I3);
  if (not Ok1) or (not Ok2) or (not Ok3)
    or (I1 < 0) or (I1 > 250)
    or (I2 < 0) or (I2 > 250)
    or (I3 < 0) or (I3 > 250) then
  begin
    ShowMessage('Wprowadź calkowitą iczbę w przedziale od 1 do 250');
  end
  else
  begin
    // Instukcje do wykonania gdy wszystko jest ok
  end;
end;
//...

Ewentualnie, jeśli liczba ma być w zakresie wielkości typu Byte. Wtedy można jeszcze zamiast tylu or'ów użyć instrukcji in dla zmiennych liczbowych. Więcej w google.

0

@s-f - poprzednik podał Ci rozwiązanie według Twojego kodu;

Innym rozwiązaniem de facto wykluczającym konieczność zastosowania bloku Try Except jest skorzystanie z funkcji TryStrToInt, która w razie jakiegokolwiek błędu konwersji ani nie zatrzyma programu, ani nie wywoła wyjątku, także w trybie debugowania;

Czyli Twój kod wyglądałby tak jak poniżej, zachowując obecną logikę:

if TryStrToInt(Edit1.Text, a) and TryStrToInt(Edit2.Text, b) and TryStrToInt(Edit2.Text, c) then
begin
  // dalsza część
end
else
  ShowMessage('Wprowadź calkowitą iczbę w przedziale od 1 do 250');

Ewentualnie, jeśli już konieczne chcesz mieć kod liniowy, to wystarczy zanegować całość warunku i wtedy wyświetlić komunikat, po czym wyjść z bloku kodu instrukcją Exit:

if not (TryStrToInt(Edit1.Text, a) and TryStrToInt(Edit2.Text, b) and TryStrToInt(Edit2.Text, c)) then
begin
  ShowMessage('Wprowadź calkowitą iczbę w przedziale od 1 do 250');
  Exit;
end;

// dalsza część

Razem z przedziałami może to wyglądać tak:

{..}

  if TryStrToInt(Edit1.Text, a) and TryStrToInt(Edit2.Text, b) and TryStrToInt(Edit2.Text, c) then
    if (a in [1 .. 250]) and (b in [1 .. 250]) and (c in [1 .. 250]) then
    begin
      // dalsze operacje

      Exit; // tu wychodzimy z bloku kodu, pomijając końcowy komunikat
    end;

  ShowMessage('Wprowadź calkowitą iczbę w przedziale od 1 do 250');
end;

Te zmienne trzeba nazwać sensowniej, bo po identyfikatorze nie wiadomo do czego służą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1