Strona 1 z 1

Bardzo szybkie odmalowanie komórki string grida

Nowy postNapisane: środa, 24 marca 2010, 14:09
przez Corvis
Witam,

Poszukuje bardzo szybkiego odmalowania jednej komórki stringgrida. W timerze co jakiś czas zaznaczam jedną cele w gridzie i jeżeli koleja cela jest różna od zaznaczonej to musze zamalować starą i namalować nową.
Kod jaki napisałem:

v1. ( nie optymalna - bo wywołuje przemalowanie całego grida ) - działa ale za wolno :

Kod: Zaznacz cały
asgridMnoznik->Repaint();
asgridMnoznik->Canvas->Brush->Style = bsClear;
asgridMnoznik->Canvas->Pen->Color = clRed;
asgridMnoznik->Canvas->Pen->Width = 1;   
     
asgridMnoznik->Canvas->Rectangle(
          asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Left,
          asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Top,
          asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Right,
          asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Bottom
);


v2. ( Zapamiętanie poprzedniej celi i odmalowanie jej po namalowaniu nowej ) - efekt w załączniku screen v2:

Kod: Zaznacz cały
if(CelaMapyObciazenie != CelaPoprzedniaObciazenie ||  CelaMapyObroty != CelaPoprzedniaObroty) {
        asgridMnoznik->Canvas->Brush->Style = bsClear;
        asgridMnoznik->Canvas->Pen->Color = clRed;
        asgridMnoznik->Canvas->Pen->Width = 2;   
     
        asgridMnoznik->Canvas->Rectangle(
            asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Left,
            asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Top,
            asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Right,
            asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Bottom
        );

        asgridMnoznik->Canvas->Pen->Color = clWhite;
               
        asgridMnoznik->Canvas->Rectangle(
            asgridMnoznik->CellRect(CelaPoprzedniaObciazenie,CelaPoprzedniaObroty).Left,
            asgridMnoznik->CellRect(CelaPoprzedniaObciazenie,CelaPoprzedniaObroty).Top,
            asgridMnoznik->CellRect(CelaPoprzedniaObciazenie,CelaPoprzedniaObroty).Right,
            asgridMnoznik->CellRect(CelaPoprzedniaObciazenie,CelaPoprzedniaObroty).Bottom
        );
}

    CelaPoprzedniaObroty     = CelaMapyObroty;
    CelaPoprzedniaObciazenie = CelaMapyObciazenie;


v3. ( Zapamiętanie poprzedniej celi i wpisanie do niej wartości ) - działa ale nie dokońca dobrze - efekt jest taki że widać przemalowanie starej komórki i wygląda tak jak by się jedna za 2 ciągneła :
Kod: Zaznacz cały
if(CelaMapyObciazenie != CelaPoprzedniaObciazenie ||  CelaMapyObroty != CelaPoprzedniaObroty) {
        String val = asgridMnoznik->Cells[CelaPoprzedniaObciazenie][CelaPoprzedniaObroty];

        asgridMnoznik->Canvas->Brush->Style = bsClear;
        asgridMnoznik->Canvas->Pen->Color = clRed;
        asgridMnoznik->Canvas->Pen->Width = 2;   
     
        asgridMnoznik->Canvas->Rectangle(
            asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Left+1,
            asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Top+1,
            asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Right,
            asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Bottom
        );

        asgridMnoznik->Cells[CelaPoprzedniaObciazenie][CelaPoprzedniaObroty] = val;
    }

    CelaPoprzedniaObroty     = CelaMapyObroty;
    CelaPoprzedniaObciazenie = CelaMapyObciazenie;


Ma ktoś może jakiś pomysł na to ? :)


Pozdrawiam

Re: Bardzo szybkie odmalowanie komórki string grida

Nowy postNapisane: środa, 24 marca 2010, 14:25
przez polymorphism
Tak nawiasem. Jak już optymalizujesz, to pousuwaj tego typu kwiatki:
Kod: Zaznacz cały
asgridMnoznik->Canvas->Rectangle(
          asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Left,
          asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Top,
          asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Right,
          asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty).Bottom); 

Po co cztery razy wywoływać funkcję CellRect, która też musi zużyć trochę czasu na przeliczenie koordynat, jeśli możesz to zrobić raz?
Kod: Zaznacz cały
TRect rc = asgridMnoznik->CellRect(CelaMapyObciazenie,CelaMapyObroty);
asgridMnoznik->Canvas->Rectangle(rc.Left, rc.Top, rc.Right, rc.Bottom); 

Re: Bardzo szybkie odmalowanie komórki string grida

Nowy postNapisane: środa, 24 marca 2010, 14:39
przez Corvis
Wielką kaszanke powodowało włączenie doublebuffered w StringGridzie - wyłączyłem i jest to już w miare ok :)

Re: Bardzo szybkie odmalowanie komórki string grida

Nowy postNapisane: środa, 24 marca 2010, 15:14
przez Cyfrowy Baron
Jeżeli chcesz by StringGrid rysował szybko to powinieneś posłużyć się jego zdarzeniem OnDrawCell a nie obiektem Timer.