CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Kolorowanie DBGrida

Kolorowanie DBGrida

dział ogólny

Kolorowanie DBGrida

Nowy postprzez Corvis » środa, 24 października 2012, 11:26

Witam,

Pisałem różne wersje kolorowania TDBGrida ale na tym się wyłożyłem :)

Raport.png


Mam takie o to dane. Chce żeby grid był pokolorowany w 2 kolorach każdy numer faktury musi być w 1 z 2 kolorów.

Czyli z przykładu:

numer FV/000256/12 -> Kolor 1
numer FV/000249/12 -> Kolor 2
numer FV/000247/12 -> Kolor 1
numer FV/000245/12 -> Kolor 2

Czyli ze zmianą numeru faktury musi ustawić się odpowiedni kolor wiersza. Ma ktoś jakiś dobry 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 7Chrome

Re: Kolorowanie DBGrida

Nowy postprzez Mironas » środa, 24 października 2012, 11:51

Nie bardzo rozumiem o co Ci chodzi, ale jeśli o pokolorowanie Grid-a w paski to np. w OnDrawColumnCell:

KOD cpp:     UKRYJ  
  // kolor wiersza
  DBGrid1->Canvas->Brush->Color = ( sqlTabela->RecNo % 2 ) ? clWhite : clSilver;

  // Rysowanie
  DBGrid1->DefaultDrawDataCell(Rect,Column->Field,State);
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Kolorowanie DBGrida

Nowy postprzez Corvis » środa, 24 października 2012, 12:03

Tak w paski ale ilość pasków w jednym kolorze zależy od numeru faktury:

numer FV/000256/12 Kolor 1
numer FV/000249/12 Kolor 2
numer FV/000247/12 Kolor 1
numer FV/000245/12 Kolor 2

Ty podałeś kod na kolorowanie co 2 paska :) a tu powinno wyglądać to tak:

Wiersz 1 - FV/000256/12 - Kolor 1
Wiersz 2 - FV/000249/12 - Kolor 2
Wiersz 3 - FV/000249/12 - Kolor 2
Wiersz 4 - FV/000247/12 - Kolor 1
Wiersz 5 - FV/000245/12 - Kolor 2

itd.
"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 7Chrome

Re: Kolorowanie DBGrida

Nowy postprzez Mironas » środa, 24 października 2012, 12:28

No to faktycznie gorsza sprawa.

Ja zdefiniował bym tablicę dwuwymiarową (albo vektor/TList/TStrings/...) i po każdym SELECT przejechał bym tabelę od góry do dołu i wpisał do tablicy:
1: numer rekordu (RecNo)
2: 0 lub 1 - zapisuję 0 dopóki mam taki sam numer faktury. Jak faktura się zmieni zaczynam zapisywać 1, aż do następnej zmiany. Potem znowu piszę 0 i tak dalej.
Na koniec DBGrid->Refresh()

W OnDrawColumnCell sprawdzić odpowiednią wartość w tablicy i w zależności od niej zastosować właściwy kolor.

Aby uniknąć przewijania DBGrid-a w trakcie zapisywania informacji do tablicy użyłbym oddzielnego DataSet-a z identycznym ORDER BY i z jednym polem NUMER_FAKTURY.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Kolorowanie DBGrida

Nowy postprzez Corvis » środa, 24 października 2012, 12:30

A no widzisz ;)

No miałem takie pomysły ze strukturami ale nie wiem czy to gra warta świeczki. Dumam nad jakimś prostszym sposobem.


Edit:

Bardzo na szybko wymyśliłem takie coś :)

KOD cpp:     UKRYJ  
void __fastcall TFrmRaportyHandlowe::dbgrdRaportyDaneDrawColumnCell(TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State) {

        static int Id = 0;
        static int Kolor = 0;

        if(DtmMain->cdsRaportHandlowy->FieldByName("idDokumentu")->AsInteger != Id) {
                Id = DtmMain->cdsRaportHandlowy->FieldByName("idDokumentu")->AsInteger;

                if(Kolor == 0) {
                        Kolor = 1;
                } else if(Kolor == 1) {
                        Kolor = 0;
                }
        }

        if(Kolor == 0) {
                dbgrdRaportyDane->Canvas->Brush->Color  = (TColor)0x00FCF0E9;
        } else if(Kolor == 1) {
                dbgrdRaportyDane->Canvas->Brush->Color  = clWhite;
        }

        dbgrdRaportyDane->Canvas->Font->Color   = clBlack;
        dbgrdRaportyDane->Canvas->Pen->Mode     = pmCopy;

        dbgrdRaportyDane->DefaultDrawColumnCell(Rect, DataCol, Column, State);
}
 


Ma to jednak swoją wadę jeszcze bo jak poklikam w wiersze to po kliku myszką kolor potrafi się zmienić. Wiąże się to chyba ze zmiennymi statycznymi, że nie pamięta odpowiedniej wartości
"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 7Chrome

Re: Kolorowanie DBGrida

Nowy postprzez Cyfrowy Baron » środa, 24 października 2012, 16:58

Najpierw to musisz ustalić jakaś powtarzalną regułę, bo puki co to jedyne co jest powtarzalne to ten sam numer faktury:

KOD text:     UKRYJ  
Wiersz 2 - FV/000249/12 - Kolor 2
Wiersz 3 - FV/000249/12 - Kolor 2


Ale i to nie jest trudno ująć w jakąś regułę, gdyż fakt, że faktura nie ma bliźniaka nie oznacza, że ma być w innym kolorze. Gdyby istniała taka reguła: koloruj na czerwono tylko te komórki, które zawierają powtarzające się numery faktur, a na zielono tylko te które nie mają swoich odpowiedników w innych komórkach - to dałoby się to oprogramować.

Podaj więc prostą regułę według której komórki mają być kolorowane. Bo z tego co napisałeś ja widzę dwie reguły, jedna to ta którą zaproponował Mironas, czyli kolorowanie co drugiej komórki, a druga to ta którą ja zaproponowałem. I oprogramowanie tych dwóch reguł też dałoby się zrobić, gdyż w zdarzeniu OnDrawColumnCell wprowadzasz najpierw kod zaproponowany przez Mironas, a potem tworzysz drugi kod, który sprawdza zawartość komórek po kolei i koloruje dodatkowo te, które się powtarzają. Jednak to nie da dobrego efektu, gdyż kolory mogą się powtórzyć trzy razy z rzędu, dwa raz wynikające z pierwszej reguły i dwa razy z reguły drugiej. Dobrym rozwiązaniem mogłoby być użycie trzech kolorów, czyli dwoma kolorami zaznaczasz co drugą komórkę (pierwsza reguła) a potem przeszukujesz komórki w poszukiwaniu numeru faktur które występują więcej niż raz i kolorujesz je na trzeci kolor.

Stwórz regułę, a z opracowaniem kodu nie będzie problemu.
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: Kolorowanie DBGrida

Nowy postprzez Corvis » czwartek, 25 października 2012, 09:08

koloruj na czerwono tylko te komórki, które zawierają powtarzające się numery faktur, a na zielono tylko te które nie mają swoich odpowiedników w innych komórkach


Dokładnie tak to można opisać. Zawsze mi słów brakuje ;)

Edit:

Zrobiłem to przy użyciu mapy i dodatkowego TClinetDataSet jeżeli ktoś ma lepszy i łatwiejszy sposób może dodać. Podam to trochę pseudo kodem bo za dużo kopiowania :)

Deklaracja mapy:

KOD cpp:     UKRYJ  
std::map<int, int> mapaKolorowRaportHandlowy; // First - Faktura,  Second- Kolor
 


Po pobraniu danych z bazy:

KOD cpp:     UKRYJ  
mapaKolorowRaportHandlowy.clear();

cdsKoloryRaporHandlowy->First();
int IdDokumentu = -1;
int Kolor               = 0;
while(!cdsKoloryRaporHandlowy->Eof) {

        if(cdsKoloryRaporHandlowy->FieldByName("IdDokumentu")->AsInteger != IdDokumentu) {
                IdDokumentu = cdsKoloryRaporHandlowy->FieldByName("IdDokumentu")->AsInteger;

                if(Kolor == 1) Kolor = 0;
                else if(Kolor == 0) Kolor = 1;
        }

        mapaKolorowRaportHandlowy[cdsKoloryRaporHandlowy->FieldByName("IdDokumentu")->AsInteger] = Kolor;
        cdsKoloryRaporHandlowy->Next();
}
 


No i samo kolorowanie:

KOD cpp:     UKRYJ  
if(DtmMain->mapaKolorowRaportHandlowy[DtmMain->cdsRaportHandlowy->FieldByName("idDokumentu")->AsInteger] == 1) {
        dbgrdRaportyDane->Canvas->Brush->Color  = (TColor)0x00FCF0E9;
} else {
        dbgrdRaportyDane->Canvas->Brush->Color  = clWhite;
}

dbgrdRaportyDane->Canvas->Font->Color   = clBlack;
dbgrdRaportyDane->DefaultDrawColumnCell(Rect, DataCol, Column, State);
 


Tak jak pisze są to raczej wyciki kodu. Ale z samej idei wiadomo o co chodzi.
"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 7Chrome

Re: Kolorowanie DBGrida

Nowy postprzez admszczep » poniedziałek, 5 listopada 2012, 16:02

Czy nie prościej dodać numerowanie wierszy i dla dzielonych bez reszty dać kolor 2 a pozostałych 1
Avatar użytkownika
admszczep
Homos antropiczny
Homos antropiczny
 
Posty: 66
Dołączył(a): wtorek, 3 listopada 2009, 23:25
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP PRO SP3
Kompilator: Embarcadero RAD Studio XE
C++Builder XE
Gadu Gadu: 0
    Windows XPFirefox

Re: Kolorowanie DBGrida

Nowy postprzez Mironas » poniedziałek, 5 listopada 2012, 16:22

admszczep napisał(a):Czy nie prościej dodać numerowanie wierszy i dla dzielonych bez reszty dać kolor 2 a pozostałych 1

Wczytaj się jeszcze raz w ten konkretny problem. Nie chodzi o zmianę koloru co drugi pasek, tylko o zmianę koloru przy zmianie faktury. A taki sam nr faktury może być w kilku kolejnych rekordach (i te kolejne rekordy mają mieć taki sam kolor).
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome


  • 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