Co znaczy ten błąd?

0
[Error] Main_Unit.pas(45): Constant expression violates subrange bounds

Wyskakuje mi w takim kodzie:

if (X in [62..75]) and (Y in [249..263]) then
  begin
    Xto := 282;
    Yto := 268;
  end;

Mimo że w nowym projekcie działa dobrze.

0
TomRiddle napisał(a)
[Error] Main_Unit.pas(45): Constant expression violates subrange bounds

Wyskakuje mi w takim kodzie:

if (X in [62..75]) and (Y in [249..263]) then
  begin
    Xto := 282;
    Yto := 268;
  end;

Mimo że w nowym projekcie działa dobrze.

Nie znam się za bardzo, ale Xto i Yto nie powinno się mieścić w powyższych przedziałach?
Zmienne

1

Może to być głupie, ale sprawdź, czy Xto, Yto nie 8-bitowe (Byte i chyba Shortint, jak się nie mylę).

0

Nie znam się za bardzo, ale Xto i Yto nie powinno się mieścić w powyższych przedziałach
a skąd mamy to wiedzieć? nie podałeś co to są X, Y, Xto ani Yto.

1
Azarien napisał(a)

Nie znam się za bardzo, ale Xto i Yto nie powinno się mieścić w powyższych przedziałach
a skąd mamy to wiedzieć? nie podałeś co to są X, Y, Xto ani Yto.

Dobra, ale wąty to do TomRiddle, a nie do mnie. Ja mu tylko próbowałem odpowiedzieć. :>

1
TomRiddle napisał(a)

Y in [249..263]

Poczytaj sobie o zbiorach (sets).

1

zbiory są 8-mio bitowe czyli od 0 do 255

0
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
 Xto, Yto : Integer;
begin
 if (X in [62..72]) and (Y in [249..263) then
  begin
    Xto := 282;
    Yto := 268;
  end;
1

No to weź sobie zamień X in [a, b] na (X >= a) and (X <= b). Jak nie zadziała, to coś innego jest źle. Wydaje mi się, że działanie na setach wcale nie jest wydajniejsze - i tak program musi zrobić dwa porównania.

0

Chyba wpadłem na pomysł...
A może zrobię tak:

Y := Y - 15;
if (X in [62..75]) and (Y in [234..248]) then  //234 i 248 jest o 15 mniejsze niż 249 i 263
  begin                                        //Czyli te które były na początku
    Xto := 282;
    Yto := 268;
  end;
Y := Y + 15;

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