-2

我有一个整数变量“i”,我想做一个循环,将“i”从 40000 增加到 90000,每次加 1000。每个结果将出现在一个组合框中。

示例: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

4 回答 4

11

@AndreasRejbrand 的解决方案的替代方案是while循环:

i := 40000;
while i <= 90000 do
begin
  ComboBox1.AddItem(IntToStr(i), nil);
  Inc(i, 1000);
end;

或“重复”:

i := 40000;
repeat
  ComboBox1.AddItem(IntToStr(i), nil);
  Inc(i, 1000);
until i > 90000;
于 2013-05-01T21:47:37.180 回答
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;
于 2013-05-01T21:41:29.507 回答
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,我将把它作为练习留给感兴趣的读者。

于 2013-05-04T07:31:43.327 回答
0

我们也可以做一个从 40 到 90 的循环,并将索引乘以 1000

var i: integer;
begin
    for i:= 40 to 90 do
    begin
        ComboBox1.AddItem(IntToStr(i*1000), nil);     
    end;                 
end;
于 2017-09-21T15:46:06.087 回答