在循环中递增整数变量

时间:2013-05-01 21:39:17

标签: delphi pascal

我有“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;

你有什么建议吗?

4 个答案:

答案 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;