Bardzo szybkie odmalowanie komórki string grida

dział ogólny

Bardzo szybkie odmalowanie komórki string grida

Nowy postprzez Corvis » środa, 24 marca 2010, 14:09

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
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Re: Bardzo szybkie odmalowanie komórki string grida

Nowy postprzez polymorphism » środa, 24 marca 2010, 14:25

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); 
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Corvis
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Bardzo szybkie odmalowanie komórki string grida

Nowy postprzez Corvis » środa, 24 marca 2010, 14:39

Wielką kaszanke powodowało włączenie doublebuffered w StringGridzie - wyłączyłem i jest to już w miare ok :)
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Re: Bardzo szybkie odmalowanie komórki string grida

Nowy postprzez Cyfrowy Baron » środa, 24 marca 2010, 15:14

Jeżeli chcesz by StringGrid rysował szybko to powinieneś posłużyć się jego zdarzeniem OnDrawCell a nie obiektem Timer.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości

cron