2013-06-30 86 views
1

我有一個DBGrid並使用它來獲取數據到Array。但只要我按下按鈕來做這個過程,我會得到一個StackOverFlow錯誤?這裏是我使用的代碼:StackOverFlow錯誤

iRy := 0; 

iCol := DBGrid.Columns.Count; 

sTest := DBGrid.Columns[0].Field.AsString; 

While sTest <> '' do 
    begin 
    for k := 1 to iCol do 
    begin 
    arrData[iRy+1,iCol] := DBGrid.Columns[iCol].Field.AsString; 
    end; 
    Inc(iRy); 
    DBGrid.DataSource.DataSet.Next; 
    sToets := DBGrid.Columns[0].Field.AsString; 
    end; 

我正在使用Delphi 7。

+1

不適合於誤差計算器(可能的無效訪問一個sideeffect這裏arrData [IRY + 1,ICOL]或這裏DBGrid.Columns [ICOL]。),但列和動態數組Zerobased(對於k: = 0到iCol-1)。 'Not Dataset.EOF' condition is missing in While While – bummi

+2

sToets:= DBGrid.Columns [0] .Field.AsString ;, you want ** sTest **:= DBGrid.Columns [0] .Field.AsString ;,你的循環將循環到無窮大或直到你填滿整個棧(這首先發生) – ComputerSaysNo

+0

你能修復你的錯字,看看你是否仍然得到相同的錯誤 –

回答

0

sTest是什麼時候改變的?

堆棧溢出是由堆棧上的內存不足造成的。這個While循環將永遠持續下去。您需要在循環中將sTest設置爲「'以外的其他值,或者您可能要使用if語句。

+0

一個簡單的無限循環不會導致一個堆棧溢出,與「無盡的」遞增iRy相結合,對arrData [iRy + 1,iCol]的訪問可能會破壞棧... – bummi

0

你有幾個問題:

  • 你初始化(循環之前)之後,您從未指派任何別的sTest
  • 你不斷循環在相同的記錄,因爲沒有Next ,並且沒有更改爲sTest。一旦你開始循環,你呆在那裏。
  • 你路過的Columns結束,因爲你要Column.Count,最後的有效索引是Column.Count - 1

試試這個,看它是否是你越後在做什麼:

iRy := 0; 
sCol := DBGrid.Columns.Count - 1; 

// I'm not sure why you're not putting this in the first (0 index) element 
// of arrData - is that intentional? 
sTest := DBGrid.Columns[0].Field.AsString; 

while (sTest <> '') and (not DBGrid.DataSource.DataSet.Eof) do 
begin 
    for k := 1 to iCol do 
    arrData[iRy, iCol] := DBGrid.Columns[iCol].Field.AsString; 
    DBGrid.DataSource.DataSet.Next; 
    Inc(iRy); 
    sTest := DBGrid.Columns[0].Field.AsString; 
end; 
+0

請始終使用開始 - 結束塊,使用for循環沒有開始結束塊是一個等待發生的錯誤。 –

+0

@Toby:這個循環不需要'begin..end';它執行一行代碼(分配給數組)。如果添加了第二行,那麼'begin..end'也是如此。 –

+0

開始...結束不會自動添加第二行,因此錯誤!你能誠實地告訴我你從來沒有造成過這樣的錯誤嗎? –