Odczytywanie zawartości komórki z TDrawGrid

0

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

0

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?

0

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.

0

Chyba już wiem w czym problem... To wszystko jest "rysowane" a nie zapisywane w postaci stringa....

0

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.

0

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.

0

Wpisać do grida tą nazwę pola z posta wyżej w komórkę Cell[ACol,0]

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?

0
      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

0

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)

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1