1

があり、DBGridそれを使用してデータを に取得しますArray。しかし、ボタンを押してこの手順を実行するとすぐに、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 を使用しています。

4

2 に答える 2

0

変わるのはいつsTest

スタック オーバーフローは、スタック上のメモリが不足することによって発生します。この While ループは永久に続きます。ループ内で sTest を '' 以外に設定する必要があるか、if ステートメントを使用するつもりだった可能性があります。

于 2013-06-30T10:59:50.963 に答える
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;
于 2013-06-30T14:49:23.450 に答える