我有“i”这是一个整数变量,我想做一个循环,将“i”从40000增加到90000,每次增加1000。每个结果都将出现在ComboBox中。
示例:40000 - 41000 - 42000 - 43000 - ... - 88000 - 89000 - 90000
我的代码如下:
var i:integer;
begin
for i:= 40000 to 90000 do
begin
ComboBox1.AddItem(IntToStr(i), nil); //until here the code works
Inc(i, 1000);
end;
你有什么建议吗?
答案 0 :(得分:10)
@ AndreasRejbrand解决方案的替代方案是while
循环:
i := 40000;
while i <= 90000 do
begin
ComboBox1.AddItem(IntToStr(i), nil);
Inc(i, 1000);
end;
或`repeat':
i := 40000;
repeat
ComboBox1.AddItem(IntToStr(i), nil);
Inc(i, 1000);
until i > 90000;
答案 1 :(得分:9)
你不能改变循环内的for循环变量。
你想要的是这个:
for i := 0 to 50 do
ComboBox1.AddItem(IntToStr(40000 + 1000 * i), nil)
但是!这是相当低效的。你应该考虑
ComboBox1.Items.BeginUpdate;
for i := 0 to 50 do
ComboBox1.Items.Add(IntToStr(40000 + 1000 * i));
ComboBox1.Items.EndUpdate;
答案 2 :(得分:3)
编译器禁止更改循环变量。
有一种方法可以包含对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
枚举。
了解这一点,可以使用步骤功能实现另一个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
版本,我将把它作为练习留给感兴趣的读者。
答案 3 :(得分:0)
我们也可以从40到90进行循环,并将索引乘以1000
var i: integer;
begin
for i:= 40 to 90 do
begin
ComboBox1.AddItem(IntToStr(i*1000), nil);
end;
end;