Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.29;
Скачать: CL | DM;

Вниз

For loop control variable must be simple local variable   Найти похожие ветки 

 
R13   (2009-01-30 00:56) [0]

procedure TForm1.Button2Click(Sender: TObject);
  var i:integer;
begin
for i=0 to 5 do memo1.Lines.Delete(i);
end;

Вылезает ошибка: For loop control variable must be simple local variable

Что я не так сделал? Че-т вообще не понимаю (=


 
Юрий Зотов ©   (2009-01-30 01:02) [1]

Двоеточие пропущено.
i := 0


 
R13   (2009-01-30 01:04) [2]

*WALL*

я уж с горя сюда написал. всегда работало, а тут вдруг наотрез отказалось :)

главное ошибка вылезает не о том, что двоеточие пропущено, а что i не является локальной переменной.


 
Юрий Зотов ©   (2009-01-30 01:12) [3]

> R13   (30.01.09 01:04) [2]

> ошибка вылезает не о том, что двоеточие пропущено, а что i не является
> локальной переменной.

Нет, не так. Сама по себе, переменная i тут ни при чем и в сообщении о ней ничего не говорится. В нем говорится, что там, где должен быть оператор присваивания с локальной переменной, стоит что-то другое (в данном случае - логическое выражение).


 
Германн ©   (2009-01-30 01:52) [4]

Т.е. На бога надейся, а сам не плошай!
:)
Сообщения компилятора всего лишь подсказка. Понять эту подсказку должен сам программист.


 
Ega23 ©   (2009-01-30 10:18) [5]


> for i=0 to 5 do memo1.Lines.Delete(i);


Вообще-то:

for i:=5 downto 0 do memo1.Lines.Delete(i);

И учти, что если memo1.Lines.Count будет меньше 6, то List index out of bounds получишь.


 
qqq   (2009-01-30 11:43) [6]


> Ega23 ©   (30.01.09 10:18) [5]

не проще ли
for i:=5 downto 0 do memo1.Lines.Delete(0);
тогда и направление перебора не важно


 
Ega23 ©   (2009-01-30 12:02) [7]


> for i:=5 downto 0 do memo1.Lines.Delete(0);



procedure TList.Delete(Index: Integer);
var
 Temp: Pointer;
begin
 if (Index < 0) or (Index >= FCount) then
   Error(@SListIndexError, Index);
 Temp := Items[Index];
 Dec(FCount);
 if Index < FCount then
   System.Move(FList^[Index + 1], FList^[Index],
     (FCount - Index) * SizeOf(Pointer));
 if Temp <> nil then
   Notify(Temp, lnDeleted);
end;


 
qqq   (2009-01-30 12:13) [8]


> Ega23 ©   (30.01.09 12:02) [7]

ну и как это сказывается на удалении 0-й строки?


 
Ega23 ©   (2009-01-30 12:18) [9]

Если удаляешь последний элемент, то не выполнится System.Move, т.к. сначала произойдёт декремент FCount и его значение станет равным Index

А если удалять всегда первый, то System.Move выполнится Count-1 раз.


 
KSergey ©   (2009-01-30 13:11) [10]

> Ega23 ©   (30.01.09 12:18) [9]

Это типа все правильно, но если удаляем все строки (что предполагается обращением каждый раз к последнему элементу), то проще memo1.Lines.Clear сразу вызвать - и циклов не надо :)


 
Ega23 ©   (2009-01-30 13:15) [11]


> то проще memo1.Lines.Clear сразу вызвать - и циклов не надо  :)


Если уж на то пошло, то Memo1.Clear - ещё проще.



Страницы: 1 вся ветка

Текущий архив: 2009.03.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
3-1216925004
Val
2008-07-24 22:43
2009.03.29
Трехзвенка: ошибка при редактировании


2-1233776507
Ramil
2009-02-04 22:41
2009.03.29
TEdit как калькулятор


15-1232422546
DelphiN!
2009-01-20 06:35
2009.03.29
Неудается завершить пользовательский процес


1-1208942275
carmen
2008-04-23 13:17
2009.03.29
эксторт в XML из ExpressQuantumGrid Suite 6.24


4-1206779666
kalexi
2008-03-29 11:34
2009.03.29
Как узнать с какого по какой адрес занимает процесс в системе?