Компилятор запрещает изменять переменный цикл.
Существует способ включить поддержку петли for..step
. У вас должна быть версия Delphi, поддерживающая дженерики (Delphi-2009 +).
Просто сделать это заявление в полезности единицы:
Type
ForLoop = record
class procedure Step(Start,Stop,AStep : Integer;
ALoop : TProc<Integer>); static;
end;
class procedure ForLoop.Step(Start,Stop,AStep : Integer; ALoop: TProc<Integer>);
begin
while (start <= stop) do
begin
ALoop(start);
Inc(Start,AStep);
end;
end;
И использовать его как это:
ForLoop.Step(40000,90000,1000,
procedure (i : Integer)
begin
ComboBox1.AddItem(IntToStr(i), nil);
end
);
В Delphi 2005, были добавлены методы по записи плюс перечисление for in
.
Зная это, можно реализовать другой цикл цикла с функциональностью шага.
type
Range = record
private
FCurrent,FStop,FStep : Integer;
public
constructor Step(Start,Stop,AnIncrement : Integer);
function GetCurrent : integer; inline;
function MoveNext : boolean; inline;
function GetEnumerator : Range; // Return Self as enumerator
property Current : integer read GetCurrent;
end;
function Range.GetCurrent: integer;
begin
Result := FCurrent;
end;
function Range.GetEnumerator: Range;
begin
Result := Self;
end;
function Range.MoveNext: boolean;
begin
Inc(FCurrent,FStep);
Result := (FCurrent <= FStop);
end;
constructor Range.Step(Start,Stop,AnIncrement: Integer);
begin
Self.FCurrent := Start-AnIncrement;
Self.FStop := Stop;
Self.FStep := AnIncrement;
end;
И теперь вы можете написать:
for i in Range.Step(40000,90000,1000) do
ComboBox1.AddItem(IntToStr(i), nil);
Копать во внутренние работы этого примера, см more-fun-with-enumerators
.
Легко реализовать версию двух примеров .StepReverse
выше, и я оставлю это в качестве упражнения для заинтересованного читателя.
Хотя я и многие знают природу того, что тип ошибки вы получаете, вы должны * всегда * сообщить нам, что сообщение об ошибке есть. –
Пожалуйста, прочитайте сообщение об ошибке целиком и проконсультируйтесь (F1) с документацией для разрешения. В нем указано, что вы не можете изменить счетчик цикла 'for'. – OnTheFly