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.
- Rejestracja:ponad 22 lata
- Ostatnio:minuta
- Postów:296
0
- Rejestracja:ponad 14 lat
- Ostatnio:około 11 godzin
0
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;
edytowany 3x, ostatnio: grzegorz_so
- Rejestracja:ponad 22 lata
- Ostatnio:minuta
- Postów:296
0
grzegorz_so napisał(a):
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.
edytowany 1x, ostatnio: flowCRANE
- Rejestracja:ponad 22 lata
- Ostatnio:minuta
- Postów:296
0
@grzegorz_so Ale pól mam powiedzmy 50. To gdzie w Twoim kodzie zwiększanie numeru wiersza?
- Rejestracja:ponad 14 lat
- Ostatnio:około 11 godzin
0
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;
edytowany 2x, ostatnio: grzegorz_so
- Rejestracja:ponad 14 lat
- Ostatnio:około 11 godzin
1
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
datasetInStringGrid(self.adoQuery, self.StringGrid, 3);
edytowany 2x, ostatnio: grzegorz_so