Использование данных из TStringGrid в записи - PullRequest
3 голосов
/ 02 мая 2011

Я создал тип записи TTableData в Pascal для хранения информации из TStringGrid для последующего использования:

TTableData = record
  header: String[25];   //the header of the column (row 0)
  value : String[25];   //the string value of the data
  number: Integer;      //the y-pos of the data in the table
end;

Но всякий раз, когда я пытаюсь инициализировать эти объекты путем обхода через TStringGrid и получения значений из ячеекзначения становятся ('', '', 0) (за исключением нескольких ячеек, которые как-то получаются в порядке).

Вот моя процедура чтения данных из TStringGrid:

procedure TfrmImportData.butDoneClick(Sender: TObject);
begin
  Halt;
end;

{ initialize records which are responsible
for storing all information in the table itself }
procedure TfrmImportData.initTableDataObjects();

var
  i, j: Integer;

begin
  SetLength(tableData, StringGrid1.ColCount, StringGrid1.RowCount);

  for j:= 0 to StringGrid1.RowCount-1 do begin
    for i:= 0 to StringGrid1.ColCount-1 do begin
      with tableData[i,j] do begin
        header := StringGrid1.Cells[i,0];
        value := StringGrid1.Cells[i,j];
        number := i;
      end;
    end;
  end;

  for i:= 0 to StringGrid1.RowCount - 1 do begin
    for j:=0 to StringGrid1.ColCount - 1 do begin
        ShowMessage(tableData[i,j].header+': '+tableData[i,j].value);
    end;
  end;
end;

Я не совсем уверен, что здесь происходит.Когда я использую точки останова и медленно перемещаюсь по коду, я вижу, что данные изначально правильно считываются (удерживая мышь над tableData [i, j] из второго цикла for, чтобы увидеть его текущее значение), но когдаЯ пытаюсь ShowMessage (...) в самом цикле значение выходит неправильно.

Заранее спасибо,

Ответы [ 2 ]

1 голос
/ 03 мая 2011

При назначении вы обращаетесь к ячейкам [Col, Row], что правильно. В вашем цикле управления (ShowMessage) вы переключились на адресацию [Row, Col], что неверно.

0 голосов
/ 02 мая 2011

Вы смешиваете строки / столбцы и i / j в своем коде.

Это, вероятно, то, что вы намереваетесь сделать:

procedure TfrmImportData.initTableDataObjects();
var
  i, j: Integer;

begin
  SetLength(tableData, StringGrid1.RowCount, StringGrid1.ColCount);

  for i:= 0 to StringGrid1.RowCount-1 do begin
    for j:= 0 to StringGrid1.ColCount-1 do begin
      with tableData[i,j] do begin
        header := StringGrid1.Cells[i,0];
        value := StringGrid1.Cells[i,j];
        number := i;
      end;
    end;
  end;

  for i:= 0 to StringGrid1.RowCount - 1 do begin
    for j:=0 to StringGrid1.ColCount - 1 do begin
        ShowMessage(tableData[i,j].header+': '+tableData[i,j].value);
    end;
  end;
end;
...