Witam,
znalazłem interesujący mnie kod łączący się z bazą danych i wyświetlający jej zawartość do TDrawGrid. Niestety nie wiem jak dane z TDrawGrid wyciągnąć i wyświetlić np. na Label'u. Proszę o pomoc.
Pozdrawiam,
Łukasz
Witam,
znalazłem interesujący mnie kod łączący się z bazą danych i wyświetlający jej zawartość do TDrawGrid. Niestety nie wiem jak dane z TDrawGrid wyciągnąć i wyświetlić np. na Label'u. Proszę o pomoc.
Pozdrawiam,
Łukasz
znalazłem interesujący mnie kod łączący się z bazą danych i wyświetlający jej zawartość do TDrawGrid.
Szkoda że my tego kodu nie znaleźliśmy to byśmy więcej wiedzieli.
Proszę o pomoc.
Pomoc z czym? Nie ma pytania, ale to już nawet nic nowego.
Pewnie googla też zapytać nie umiesz więc zobacz sobie co ja znalazłem (tak, umiem używać googla, brawa dla mnie):
http://lazarus-ccr.sourceforge.net/docs/lcl/grids/tdrawgrid.html
Property Columns
?
Plik z biblioteką i Demo znajduje się na stronie: http://www.audio-data.de/mysql.html
procedure TForm1.TableGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
MYSQL_ROW: PMYSQL_ROW;
mySQL_Field: PMYSQL_FIELD;
begin
if mySQL_Res<>nil
then begin
if (ARow=0)
then begin
mySQL_Field := mysql_fetch_field_direct(mySQL_Res, ACol);
if mySQL_Field<>nil
then begin
TableGrid.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, mysql_field_name(mySQL_Field));
end;
end
else
if (ARow>0) and (ARow<=mysql_num_rows(mySQL_Res))
then begin
mysql_data_seek(mySQL_Res, ARow-1);
MYSQL_ROW := mysql_fetch_row(mySQL_Res);
if MYSQL_ROW<>nil
then begin
TableGrid.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, MYSQL_ROW^[ACol]);
end;
end;
end;
end;
Powyższy kod służy do zapisania zawartości tabeli MySQL do tabeli DrawGrid.
Ja potrzebuję odczytać zawartość komórek tej tabeli już po wczytaniu do niej danych.
Chyba już wiem w czym problem... To wszystko jest "rysowane" a nie zapisywane w postaci stringa....
Owszem rysowanie zaś to:
mySQL_Field := mysql_fetch_field_direct(mySQL_Res, ACol);
if mySQL_Field<>nil then NazwaPolaKolumnyACol:=mysql_field_name(mySQL_Field);
zwraca ci nazwę pola z bazy danych, o ile w select mie użyto czegoś w rodzaju 'select Count-Done from tblcom' wtedy nazwą będzie 'Count-Done'.
Ogólnie odradzam użycia nazw pól bazy danych do wyświetlenia, no chyba że robisz program administrujący.
To ma być program pomagający mi w podglądaniu bazy danych. Tak więc wszystkie dane do serwera będą wpisane w kodzie.
Zastanawiam się jak przerobić kod programu aby zapisywało dane do StringGrid'a.
Wpisać do grida tą nazwę pola z posta wyżej w komórkę Cell[ACol,0]
Doszedłem do takiej wersji:
procedure TForm1.TableGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
MYSQL_ROW: PMYSQL_ROW;
mySQL_Field: PMYSQL_FIELD;
begin
if mySQL_Res<>nil
then begin
//if (ARow=0)
//if (ARow=0)
//then begin
begin
mySQL_Field := mysql_fetch_field_direct(mySQL_Res, ACol);
if mySQL_Field<>nil
then begin
StringGrid1.Cells[ACol,0] :=mysql_field_name(mySQL_Field);
end;
end
{else
if (ARow>0) and (ARow<=mysql_num_rows(mySQL_Res))
then begin
mysql_data_seek(mySQL_Res, ARow-1);
MYSQL_ROW := mysql_fetch_row(mySQL_Res);
if MYSQL_ROW<>nil
then begin
//StringGrid1.Cells[ACol,ARow-1] :=mysql_field_name(mySQL_Field);
//TableGrid.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, MYSQL_ROW^[ACol]);
end;
end;
}
end;
end;
Przypisuje mi teraz dobrze tytuły kolumn. A jak odczytać jeszcze dane z tej tabeli?
ARow=1;
MYSQL_ROW := mysql_fetch_row(mySQL_Res);
while MYSQL_ROW<>nil do
begin
for ACol:=0 to 2 do // tu pobierz ilość kołumn
StringGrid1.Cells[ACol,ARow]:=MYSQL_ROW^[ACol];
end;
Z tym że nie rób tego w OnPaint
Zrobiłem coś takiego:
procedure TForm1.TableGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
MYSQL_ROW: PMYSQL_ROW;
mySQL_Field: PMYSQL_FIELD;
begin
if mySQL_Res<>nil
then begin
if (ARow=0)
then begin
begin
mySQL_Field := mysql_fetch_field_direct(mySQL_Res, ACol);
if mySQL_Field<>nil
then begin
StringGrid1.Cells[ACol,0] :=mysql_field_name(mySQL_Field);
end;
end;
end
else
if (ARow>0) and (ARow<=mysql_num_rows(mySQL_Res))
then begin
mysql_data_seek(mySQL_Res, ARow-1);
MYSQL_ROW := mysql_fetch_row(mySQL_Res);
if MYSQL_ROW<>nil
then begin
StringGrid1.Cells[ACol,ARow]:=MYSQL_ROW^[ACol];
end;
end;
end;
end;
Dziwne jest tylko to, że nie wczytuje wszystkich kolumn i wierszy. Zapytanie ustawiłem na Limit 50 i tworzy 50 wierszy ale wypełnia tylko część.
Dodatkowo nie wczytuje wszystkich kolumn (tylko pierwsze 5) a powinno 8. Co może na to wpływać?
Wygląda to tak jakby tabela DrawGrid i StringGrid były niejako połączone - gdy rozszerzam coś na DrawGridzie to pojawiają mi wypełnione pola w StringGrid (wcześniej są puste)
Owszem, bo to jest pomysł na rysowanie, to miało być podpięte pod OnDrawCell i miało rysować widoczne komórki.
To ma swoje zalety, bo ściąga aktualne dane z bazy danych.
W twoim przypadku trzeba zrobić to nie pod OnDrawCell oraz zrobić to tak jak ja powiedziałem w poprzednim poście.