piotr.kwlk napisał(a):Pewnie rozwiązanie to zastosowanie na końcu StringGrid1->Repaint()
W zdarzeniu OnDrawCell w żadnym razie nie należy wywoływać ten funkcji.
piotr.kwlk napisał(a):Graphics::TBitmap *bmp = new Graphics::TBitmap;
bmp->LoadFromFile("grafika/kursor.bmp");
Nie wczytuj grafiki w zdarzeniu OnDrawCell gdyż to może powodować opóźnienia, ponieważ za każdym razem, gdy zachodzi potrzeba odrysowania tabeli program wczytuje plik z dysku. W poradzie na stronie
jest co prawda zrobione tak jak ty to robisz, ale to tylko prosty kod przykładowy.
Poza tym nigdy nie podawaj względnej ścieżki dostępu do pliku, gdyż w pewnych warunkach program może ją zgubić. Zawsze podawaj ścieżkę bezwzględną, względem programu, jeżeli zachodzi taka potrzeba.
Popraw swój kod:
Plik nagłówkowy np. Unit1.h
private:
Graphics::TBitmap *bmp;
Plik źródłowy np. Unit1.cpp
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
bmp = new Graphics::TBitmap;
String sFile = ExtractFilePath( Application->ExeName ) + "grafika\\kursor.bmp";
bmp->LoadFromFile( sFile );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
StringGrid1->Canvas->FillRect(Rect); // tutaj następuje zamazanie aktualnej zawartości komórek - koniecznie poza warunkiem
if( ARow == StringGrid1->Row ) /* warunek odnosi się do wszystkich komórek w wierszu */
{
// TRect r = StringGrid1->CellRect(0,ARow); <-- zdecydowanie nie
// StringGrid1->Canvas->FillRect(r); <-- zdecydowanie nie
// StringGrid1->Canvas->FillRect(Rect); <-- nie tutaj
StringGrid1->Canvas->StretchDraw(Rect, bmp);
}
// koniecznie poza warunkiem
StringGrid1->Canvas->Brush->Style = bsClear;
StringGrid1->Canvas->TextOut( Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow] );
}