2013-05-01 142 views
-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; 

你有什麼建議嗎?

+1

雖然我乘指數和許多知道你會得到什麼類型的錯誤的性質,你應該*總*告訴我們什麼錯誤信息是。 – 2013-05-01 21:41:05

+1

請完整閱讀錯誤消息並諮詢(F1)解決方案文檔。它說明你不能修改'for'循環的計數器。 – OnTheFly 2013-05-01 21:44:52

回答

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; 
+0

即使這樣做,我認爲這種類型的循環隱藏了讀者的邏輯。通常我會嘗試像@KenWhite所示的那樣將這個循環實現爲一個while循環,但更進一步的是實現一個庫來處理for..step循環。看到我的答案,第二個將成爲我公用事業中的守護者。 – 2013-05-04 16:26:19

+0

@LURD:我剛剛將「while」選項添加到我的答案中,但肯打我。無論如何,我認爲這取決於「基礎」邏輯。有時'for'循環可能是最自然的循環。 (有人可能會覺得'while'appraoch試圖模擬程序員應該在設計時真正證明的東西。) – 2013-05-04 17:09:32

9

的替代@ 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; 
+2

+1,但我認爲使用'<= 90000'對於某些人來說有點困惑。 – 2013-05-01 21:48:29

+1

@Jerry:我沒有建議使用它;我只是提供了一個替代品。我提出了安德烈亞斯的回答。 :-) – 2013-05-01 21:49:43

+0

我的意思是我會使用'<= 90000'而不是'<90001',它做同樣的事情,除了可讀性以外不一定重要。 – 2013-05-01 22:23:44

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

瞭解了這一點,可以使用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版本的兩個例子,我會離開,作爲一個練習,有興趣的讀者。

0

我們也可以從40圈到90,並與1000

var i: integer; 
begin 
    for i:= 40 to 90 do 
    begin 
     ComboBox1.AddItem(IntToStr(i*1000), nil);  
    end;     
end;