Wynik w układzie trójkolumnowym w TStringGrid

Wynik w układzie trójkolumnowym w TStringGrid
BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0

Witam,
Mam jakieś zaćmienie umysłowe. Przez ADOQuery zwracam sobie jakiś rekord z bazy danych. Chcę go umieścić w TStringGird, ale w układzie trójkolumnowym (w kolumnach 0, 2, 4 nazwy pól, a w kolumnach 1, 3, 5 wartości). Stosuję pętle for. Podpowiedzcie proszę, jak wyliczyć numer kolumny na podstawie iteracji? Chodzi o to, jeśli iteracja jest 0, to kolumna 0, jeśli iteracja jest 1, to kolumna 2, jeśli iteracja 2, to kolumna 4, jeśli iteracja 3, to numer wiersza zwiększa się o 1, a kolumna jest znowu 0, itd.

cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9018
0

Możesz trochę jaśniej opisać problem? Bo tak średnio rozumiem, co chcesz osiągnąć. Znaczy inaczej - coś tam rozumiem, ale dużo mam domysłów, co masz na myśli.

GS
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
  stringgrid.RowCount := dataset.RecordCount;
  stringgrid.ColCount := 6;
  dataset.first;
  while not dataset.eof do
  begin
    recNo := dataset.recNo;
    for I := 0 to 2 do
    begin
      stringgrid.Cells[I * 2, recNo - 1] := dataset.fields[I * 2].asstring;
      stringgrid.Cells[I * 2 + 1, recNo - 1] := dataset.fields[I * 2 + 1].asstring;
    end;
    dataset.next;
  end;

BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0
grzegorz_so napisał(a):
Kopiuj
  stringgrid.RowCount := dataset.RecordCount;
  stringgrid.ColCount := 6;
  dataset.first;
  while not dataset.eof do
  begin
    recNo := dataset.recNo;
    for I := 0 to 2 do
    begin
      stringgrid.Cells[I * 2, recNo - 1] := dataset.fields[I * 2].asstring;
      stringgrid.Cells[I * 2 + 1, recNo - 1] := dataset.fields[I * 2 + 1].asstring;
    end;
    dataset.next;
  end;

Nie do końca tak. TADOQuery zwraca dokładnie jeden rekord, czyli ilość wierszy to ilość kolumn tego rekordu dzielona na 3 i plus 1 dla nagłówka. Oczywiście zaokrąglone w górę. I teraz w komórce 0,1 ma być pierwsze pole, w komórce 2,1 ma być drugie pole, w komórce 4,1 ma być 3 pole, w komórce 0,2 ma być 4 pole, w komórce 2,2 ma być 5 pole., w komórce 4,2 ma być 6 pole itd. Wartości mają być obok pól, czyli w kolumnach 1, 3 i 5.

BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0

@grzegorz_so Ale pól mam powiedzmy 50. To gdzie w Twoim kodzie zwiększanie numeru wiersza?

GS
  • Rejestracja: dni
  • Ostatnio: dni
0

I teraz w komórce 0,1 ma być pierwsze pole

Nieprecyzyjnie napisałeś. "Pierwsze pole" to nazwa pierwszego pola w datasecie czy jego zawartość ?

BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0

Układ ma być mniej więcej taki:

Kopiuj
Nazwa pola|Wartość|Nazwa pola|Wartość|Nazwa pola|Wartość
Pole1     |War1   |Pole2     |War2   |Pole3     |War3
Pole4     |War4   |Pole5     |War5   |Pole6     |War6
Pole7     |War7   |Pole8     |War8   |Pole9     |War9
...

GS
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
var
  sCol: integer;
  sRow: integer;
  i: integer;
begin
  StringGrid.ColCount := 6;
  StringGrid.RowCount := dataset.fields.count div 3 + byte(dataset.fields.count  mod 3 <> 0);
  for i := 0 to dataset.fields.count - 1 do
  begin
    sRow := i div 3;
    sCol := i mod 3;
    StringGrid.Cells[sCol * 2, sRow] := dataset.fields[i].FieldName;
    StringGrid.Cells[sCol * 2 + 1, sRow] := dataset.fields[i]AsString;
  end;
end;
GS
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
procedure datasetInStringGrid(aDataset: Tdataset; aStringGrid: TStringGrid; aFieldsCountInRow: integer);
var
  lCol: integer;
  lRow: integer;
  i: integer;
begin
  aStringGrid.ColCount := aFieldsCountInRow * 2;
  aStringGrid.RowCount := aDataset.Fields.Count div aFieldsCountInRow + byte(aDataset.Fields.Count mod aFieldsCountInRow <> 0) + 1;
  for i := 0 to aFieldsCountInRow - 1 do
  begin
    aStringGrid.Cells[i * 2, 0] := 'Nazwa pola';
    aStringGrid.Cells[i * 2 + 1, 0] := 'Wartość';
  end;
  for i := 0 to aDataset.Fields.Count - 1 do
  begin
    lRow := i div aFieldsCountInRow + 1;
    lCol := i mod aFieldsCountInRow;
    aStringGrid.Cells[lCol * 2, lRow] := aDataset.Fields[i].FieldName;
    aStringGrid.Cells[lCol * 2 + 1, lRow] := aDataset.Fields[i].AsString;
  end;
end;

przykład użycia

Kopiuj
datasetInStringGrid(self.adoQuery, self.StringGrid, 3);

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.