CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - StrinGrid długo odświeża

StrinGrid długo odświeża

problemy z funkcjonowaniem bibliotek, komponentów itp.

StrinGrid długo odświeża

Nowy postprzez piotr.kwlk » wtorek, 10 stycznia 2012, 12:31

Witam
Mam StrinGrida z połączeniem baz danych. Wpisuje dane a poszczególne elementy koloruje tak aby wynik był bardziej przejrzysty. Do obsługi StringGrida zasięgnąłem z źródła Porady Cyfrowego Barona. Niestety przy dużej ilości danych kontrolka zaczyna zwalniać cały program, dodam że na rekord składają się minimum 2 linijki lub więcej i zaczytuje dwie tabele jedno pionowo druga pozioma wyświetla informacje w StringGridzie, a dla rozróżnienia zwężam wiersz i koloruje na czarno gdyż nie potrawie narysować grubej linie na całej długości StringGrida.
Oczekuje podpowiedzi lub porady jak można przyśpieszyć działanie kontrolki. A może znacie inne kontrolki które można by użyć zamiast StrinGrida.
Piotr
Avatar użytkownika
piotr.kwlk
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): środa, 9 marca 2011, 17:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: StrinGrid długo odświeża

Nowy postprzez Cyfrowy Baron » czwartek, 12 stycznia 2012, 12:56

To efekt kolorowania komórek. Nie podałeś sposobu w jaki je kolorujesz, więc jedyne co mogę doradzić, to realizacja kolorowania i wszelkich operacji graficznych na StringGrid powinna odbywać się w jego zdarzeniu OnDrawCell.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: StrinGrid długo odświeża

Nowy postprzez piotr.kwlk » piątek, 17 lutego 2012, 14:39

Po długiej nieaktywności powracam do wątku, mianowicie postanowiłem przerobić program, moje kolorowanie jest wykonywane OnDrawCell, lecz moje spowolnienie może wynikać dużą ilością danych i częstością odświeżania, aby uzyskać oczekiwany efekt. Pójście na skróty ma swoje konsekwencję dlatego postanowiłem od nowa wszystko odbudować, lecz związane jest to z problemami z którymi się borykam.
Jedno z nich dotyczy wyróżnienie wiersza aktualnie zaznaczonego, tak żeby pojawił się symbol w kolumnie pierwsze chioć zaznaczona komórka może być 2,3 jaka ktokolwiek dla tego wiersza. Poniżej przedstawiam moją próbę rozwiązania w zdarzeniu OnDrawCell.

KOD cpp:     UKRYJ  
if(ARow == StringGrid1->Row){
        Graphics::TBitmap *bmp = new Graphics::TBitmap;
        bmp->LoadFromFile("grafika/kursor.bmp");
        TRect r = StringGrid1->CellRect(0,ARow);

        StringGrid1->Canvas->FillRect(r);
        //StringGrid1->Canvas->FillRect(Rect);

        StringGrid1->Canvas->StretchDraw(r, bmp);
       

        StringGrid1->Canvas->Brush->Style = bsClear;
        StringGrid1->Canvas->TextOut(r.Left, r.Top, StringGrid1->Cells[0][ARow]);
        delete bmp;

    }

Pewnie rozwiązanie to zastosowanie na końcu StringGrid1->Repaint() , ale to moim zdaniem złe rozwiązanie, gdyż spowolni cały program. Macie jakiś pomysł ?
Piotr
Avatar użytkownika
piotr.kwlk
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): środa, 9 marca 2011, 17:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: StrinGrid długo odświeża

Nowy postprzez Cyfrowy Baron » piątek, 17 lutego 2012, 20:23

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):
KOD cpp:     UKRYJ  
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 ► patrz serwis: Cyfrowy Baron 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
KOD cpp:     UKRYJ  
private:
Graphics::TBitmap *bmp;


Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
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] );
 
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: StrinGrid długo odświeża

Nowy postprzez piotr.kwlk » niedziela, 19 lutego 2012, 19:57

Dziękuje za wskazówki, lecz nie rozwiązuje to mojego problemu, mianowicie chcę w kolumnie o nr 0 umieścić grafikę wskazującą że komórka w tym wierszu jest zaznaczona, a powyższy przykład powoduje wstawienie grafiki w komórce zaznaczonej, a nie w pierwszej kolumnie.
Piotr
Avatar użytkownika
piotr.kwlk
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): środa, 9 marca 2011, 17:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: Builder 6
Gadu Gadu: 0
    Windows 7Firefox

Re: StrinGrid długo odświeża

Nowy postprzez Cyfrowy Baron » poniedziałek, 20 lutego 2012, 09:26

Najwyraźniej nie rozumiesz tego mechanizmu, przecież wystarczy zmodyfikować warunek:

KOD cpp:     UKRYJ  
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
 StringGrid1->Canvas->FillRect(Rect);

 if( ARow == StringGrid1->Row && ACol == 0 )
 {
        StringGrid1->Canvas->StretchDraw(Rect, bmp);
 }

    StringGrid1->Canvas->Brush->Style = bsClear;
    StringGrid1->Canvas->TextOut( Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow] );
 
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Biblioteki i komponenty

Kto przegląda forum

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

cron