2013-06-30 20 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

не подходит к ошибке StackOverflow (возможно, SideEffect недействительных доступа здесь arrData [Иры + 1, iCol] или здесь DBGrid.Columns [iCol].), но и динамические столбцы Массивы Zerobased (для к: = 0 до iCol-1 do). Условие 'Not Dataset.EOF' отсутствует в то время как – bummi

+2

sToets: = DBGrid.Columns [0] .Field.AsString ;, вы хотели ** sTest **: = DBGrid.Columns [0] .Field.AsString ;, ваш цикл перейдет в цикл до бесконечности или до тех пор, пока вы не заполните весь стек (это произойдет в первую очередь) – ComputerSaysNo

+0

Можете ли вы исправить свою опечатку и посмотреть, есть ли у вас такая же ошибка –

ответ

0

Когда sTest изменить?

Переток stackoverflow вызван исчерпанием памяти в стеке. Этот цикл While будет продолжаться вечно. Вам нужно установить sTest в нечто иное, чем «в цикле», или, возможно, вы хотели использовать оператор if.

+0

простой бесконечный цикл не вызовет stackoverflow, в сочетании с «бесконечным» приращением 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

Начало ... Конец не добавляется автоматически со второй строкой, следовательно, ошибка! Можете ли вы честно сказать, что вы никогда не вызывали ошибку? –

Смежные вопросы