編譯器禁止改變循環變量。
有一種方法可以包含對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
。
瞭解了這一點,可以使用step功能實現另一個for循環。
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
版本的兩個例子,我會離開,作爲一個練習,有興趣的讀者。
雖然我乘指數和許多知道你會得到什麼類型的錯誤的性質,你應該*總*告訴我們什麼錯誤信息是。 – 2013-05-01 21:41:05
請完整閱讀錯誤消息並諮詢(F1)解決方案文檔。它說明你不能修改'for'循環的計數器。 – OnTheFly 2013-05-01 21:44:52