Vlad04 писал(а):wwswowsogon писал(а):Да, с этим кодом что-то не так. Но я, вроде бы, такого не писал в демо. Вы на что-то намекаете?
Думайте. Включите в параметрах проекта на вкладке Отладка проверку диапазона.
Ради эксперимента создал отдельную демку с вышеприведённым кодом:
- Код: Выделить всё
var
i, k: Byte;
//i, k: Word;
//i, k: Smallint;
begin
k := 0;
for i := 0 to k - 1 do
begin
ShowMessage(IntToStr(i));
end;
Был удивлён. Если i и k - Integer / Smallint, цикл не выполняется. Если же i и k - Byte / Word, то выполняется, хотя на мой взгляд не должен. И i в цикле возрастает от 0 до... проверять не стал, но рискну предположить, что до верхней границы диапазона данного типа минус то число, которое вычитается из k, в данном случае 1. Но это оооочень странно.
Понять логику происходящего, по-видимому, выше моих сил. По-видимому, разница поведения как-то связана с тем, что Byte и Word - беззнаковые типы, а Integer и Smallint - знаковые. Ну и да, если включить проверку в Отладке, то при использовании Byte / Word получаем Range Check Error.
Кстати, в определённых случаях, при использовании типа Byte компилятор предупреждает, что значение переменной может выходить за пределы диапазона.
Хороший урок, спасибо Но всё же я не понял, какое отношение всё это имеет к демо, которое с удалением компонентов. Там переменная в счётчике никогда не должна выйти за пределы диапазона Word. И вышеуказанный код я бы никогда в жизни не написал при работе, просто на всякий случай, безопасности ради.
Ну и, как я и говорил, замена Word на Integer проблему в проекте не решило. Если не ошибаюсь, ровно те же глюки.