Komponent TDBGrid - zmiana koloru siatki

0

Witam ,

Myślałem ze sprawa będzie wyglądała dość prosto ze zmianą koloru siatki (linii miedzy wierszami i kolumnami ) jednak okazało się że coś mi to nie idzie.
Szukałem po sieci, odpytywałem google, sam probowałem i nic .

Aplikacja nad która pracuje zawiera dość dużo TDBGrid w celu wyświetlania danych z bazy, osoby ktora juz na niej pracują mają sprzęt , zwłaszcza monitory delikatnie mówiąc stare i domyślny kolo ( to jest chyba szary) dla siatki nie jest u nich wyświetlany .

I teraz moje pytanie czy w TDBGrid da sie w ogole zmienic ten kolor siatki ?

Probowałem napisać metode Paint oraz kombinowałem z klasą TCustomDBGrid i nic...

Nawet w Grids.pas zmieniałem kolory siatki i tez to nie pomogło , nie wiem juz sam co z tym zrobic.

Chodź biore tez pod uwage ze moze po prostu sie "nie da" co by było delikatnie mówiąc śmieszne

Korzystam delphi XE 3 dla jasności. Jeśli ktoś ma jakies sugestie , pomysły a najlepiej sampla z jednym TDBGrid i zmienionym kolorem siatki to byłbym wdzieczny.

Wstyd mi troche ze musze o takiego w zasadzie bzdeta błagac pomocy

Pozdrawiam

0

Nie zmieniaj koloru siatki, tylko zmień kolor tła - najlepiej w zebrę (czyli na przemian, np. parzyste białe, nieparzyste szare).
Dodaj możliwość określenia w/w kolorków do konfiguracji i po sprawie.

0

Tak, wiem wiem, juz tak zrobiłem ze wiersze są naprzemiennie , nawet z konfiguracją kolorów , ale jak to szło "Ma wyglądać jak w exelu , bałe i czarna siatka" .. końcu klient nasz Pan.. i tamta koncepcaj upadła . Mam nadziej ze mimo wszystko ktos mi z tym pomoz

0
szaduj napisał(a):

Tak, wiem wiem, juz tak zrobiłem ze wiersze są naprzemiennie , nawet z konfiguracją kolorów , ale jak to szło "Ma wyglądać jak w exelu , bałe i czarna siatka"

Współczuję, trafiłeś na klienta-buca, który musi udowodnić, że w czymś ma racje, a Ty jesteś tylko małpą do klepania kodu. Osobiście wyjaśniłbym mu, że nie ma racji - ale...

.. końcu klient nasz Pan.. i tamta koncepcaj upadła . Mam nadziej ze mimo wszystko ktos mi z tym pomoz

...masz rację. Klient płaci, klient wymaga.
OK, to może inaczej - jakiem Delphi dysponujesz? Tego typu problemy można załatwić za pomocą VCL Styles, ale tylko od wersji XE2.
Jeśli coś starszego, to postaram się poszukać...

0

A nie możesz samemu tej Siatki narysować w OnDrawCell (czy jak to się nazywa nie chce mi się sprawdzać)?

0

Zrobiłem szybki research i... da się to zrobić, ale trzeba napisać własną implementację metody Paint dla Grida, ponieważ kolor lini jest wpisany na stałe w kodzie, a dodatkowo jest zmienną lokalną metody Paint.
Dasz radę sam, czy Ci pomóc?

0

kAzek : tez probowałem rysować siatke w tej metodzie korzystajac z Canvas ale ogolnie nie polecam :)

wloochacz : Wiem że trzeba napisać własną metode Paint ale własnie nie wiem jak, jesli to nie bedzie problemem dla ciebie to wez mi wklej jak ona ma wygladac i po jakiej klase dziedziczysz zeby dla jasnosci :) jakby to udało mi sie napisac to juz moze bym apke oddał....

1

To nie jest takie proste, jak się wydaje. Chodzi o metodę Paint w klasie TCustomGrid, czyli sporo niżej niż TDBGrid.
Ona odpowiada za rysowanie siatki itd., ale jest to pisane na kolanie przez uczniaka - chyba...
Za kolor odpowiada zmienna lokalna, ale nie tylko - między innymi jest też tam obsługa tematów "nowych" Windows. W nowszych Delphi (od XE2 w górę) jest dodane jeszcze obsługa VCL Styles. Poza tym używa szeregu procedur prywatnych dla modułu Grids, pól prywatnych obiektu TCustomGrid itd. Generalnie masakra i to powiązana drutem, zależna od konkretnej wersji VCL'a (czyli Delphi)...
Generalnie

Osobiście poszukałbym innego grida, albo wybił głupoty użytkownikowi z głowy. Tak będzie lepiej, bezpieczniej i prościej.

0

O TCustomGird tez wiem ale jak to zobaczyłem co ona tam zawiera to konto tutaj założyłem i sie zapytałem bo mysałem ze sie znajdzie jakies innego rozwiazanie , nic no, zrobie mu poziome linie w metodzie Paint i zostawie białe . Odnośnie pytań czemu tez nie pionowe, Otóż dla tego że w przypadku gdy pionowe linie sie pojawia a grid jest tak duzy ze wszystkie kolumny sie nie mieszcza na ekranie po przesunieciu suwakiem linie pionowe zaczynaja sie "rozjeżdżać " i nie do konca wiem jak obsłużyc przerywsowanie tego oraz obliczenia pozycji linii.. ale to juz inna historia , moze na inny temat ;)
Pozdro

0

No więc właśnie...
Spójrz jeszcze na to (dziedziczy z TCustomDBGrid):
http://www.codeproject.com/Articles/199506/Improving-Delphi-TDBGrid
Nie znam tego zupełnie, ale zauważyłem tam kilka ciekawych myków (np. ustawianie właściwości Options dla TCustomGrid, która jest niedostępna z poziomu TDBGrid, za pomocą RTTI) - być może uda Ci się uzyskać to co chcesz i sporo więcej ;-)

0

A tak sobie mysle czy zmiana koloru w kodzie komponentu by co dała ? Bo zmienic ten srebny na czarny , zapisac.. chyba ze to jeszcze jakos kompilowac trzeba czy inne cuda to temat juz totalnie odpuszcze :)

0

Jeżeli kompilujesz program bez pakietów (a więc standardowo do jednego EXE) i upewnisz się, że IDE nie weźmie do kompilacji wcześniej skompilowanego DCU, a skompiluje nowy ze źródeł, to powinno się udać.

0

Kiedyś pytałem jak zmienić kolor siatki w TDBGrid jako ze temat wrócił do mnie , szukałem szukałem i znalazłem w końcu , rozwiązanie trochę ... specyficzne chyba , ale zawsze jakieś jest .
Problem rozwiązałem tak :

Na formę wrzuciłem TDBGrid , oraz TImage . Później w paincie stworzyłem kwadrat , wypełniony na czarno i zapisałem jako .bmp .
Zapisany wcześniej plik załadowałem do TImage oraz właściwość visible ustawiłem na false .

Przed ostatnią rzeczą jest ustawienie na FALSE właściwości dgColLines oraz dgRowLines komponentu TDBGrid (znajdziemy je w rozsuwanym menu "Options" komponentu ) .

I na koniec w zdarzeniu TDBgrid "OnDrawDataCell " umiesciłem kod :

procedure TGodziny.DBGrid_hoursDrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var
 MyRect : TRect;
begin
  DBGrid_hours.Canvas.Brush.Bitmap := Image1.Picture.Bitmap;
  MyRect := System.Classes.Rect(Rect.left,Rect.Top,Rect.Right,Rect.Top);
  DBGrid_hours.Canvas.FillRect( MyRect  );
  MyRect := System.Classes.Rect(Rect.left-1,Rect.Top,Rect.Left+1,Rect.Bottom);
  DBGrid_hours.Canvas.FillRect( MyRect  );
  MyRect := System.Classes.Rect(Rect.Right+1,Rect.Top,Rect.Right-1,Rect.Bottom);
  DBGrid_hours.Canvas.FillRect( MyRect  );
  MyRect := System.Classes.Rect(Rect.Left,Rect.Bottom+1,Rect.Right,Rect.Bottom-1);
  DBGrid_hours.Canvas.FillRect( MyRect  );
end;
 

Rozwiązanie może się komuś nie spodobać, ale może też się komuś przydać w razie czego (jak nie będzie mieć nic innego ) .
Minusem tego jest taki ze w tytułach kolumn nie wyświetla lini siatki , ale spróbuje to rozwiązać , jak się uda , napisze jak .
P.S
Rozwiązanie wygrzebane gdzieś z sieci :)

0

daj screena jak to wygląda jak możesz :)

0

W załączniku screen:

grid.png

dodanie obrazka do treści posta - furious programming

0

@szaduj - problemem są tylko pionowe części siatki, które są grubsze od pozostałych;

Można to obejść przez rozróżnianie współrzędnych komórek na podstawie parametrów ACol i ARow, ale idealnego efektu nie uzyskasz, bo przy sąsiadujących komórkach jedna z nich będzie musiała posiadać część siatki, a druga już nie, aby linia była tej samej grubości.

0

Tak jak pisałem , rozwiązanie nie jest idealne , ale jeśli ktoś potrzebuje po prostu wyróżnić siatkę , a takie mankamenty jak brak separatorów tytułach kolumn oraz grubość linii pionowych nie przeszkadza tak jak w moim przypadku to myślę że taka improwizorka może zostać wykorzystana, bo normalny grid w Win XP z tym kolorem ustawionym domyślnie to jest masakra . Tak czy siak, dopisałem te rozwiązanie bo sam korzystałem z kilku rozwiązań które ktoś opisał , więc pomyślałem że a nóż to moje się komuś przyda .

@furious programming - co do grubości linii pionowych to jutro w pracy jak znajdę chwilę to spróbuje choćby z ciekawości zobaczyć czy da się coś z tym zrobić ( przy okazji z tytułami kolumn :):):) )

0

ale jeśli ktoś potrzebuje po prostu wyróżnić siatkę , a takie mankamenty jak brak separatorów tytułach kolumn [...]

Nie przesadzaj - jedno zdarzenie można podpiąć pod malowanie zarówno zwykłych komórek, jak i tych tytułowych; Wystarczy tylko ustawić odpowiednie kolory i tyle - obliczenia i warunki pozostaną te same, więc niewiele więcej roboty będzie;

Jak znajdę czas to zobrazuję takie rozwiązanie - nic w tym trudnego.

0

Tak teraz wygląda TDBGrid , separator między kolumnami jest, nie ma już tej pogrubionej linii miedzy komórkami .
W TDBGrid właściwość dgColLines oraz dgRowLines ustawiłem na TRUE .

a07b19410a.png

Z tego co sprawdzałem to działa dla DrawningStyle = gdsClassic , DrawningStyle = gdsGradient .
Przy DrawningStyle = gdsTheme już nie specjalnie .

@furious programming - jak będziesz mieć chwilę to chętnie zobaczę twoje rozwiązanie :)
Może Tobie się uda zrobić żeby kolorować siatkę grida bez wykorzystania TImage :)

Za dużych zmian w kodzie to chyba nie wprowadzałem ale na wszelki wypadek dokleje :

 
procedure TGodziny.DBGrid_hoursDrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
var
 MyRect : TRect;
begin
  DBGrid_hours.Canvas.Brush.Bitmap := Image1.Picture.Bitmap;
  MyRect := System.Classes.Rect(Rect.left,Rect.Top,Rect.Right,Rect.Top);
  DBGrid_hours.Canvas.FillRect( MyRect  );
  MyRect := System.Classes.Rect(Rect.left,Rect.Top,Rect.Left,Rect.Bottom);
  DBGrid_hours.Canvas.FillRect( MyRect  );
  MyRect := System.Classes.Rect(Rect.Right+1,Rect.Top,Rect.Right,Rect.Bottom);
  DBGrid_hours.Canvas.FillRect( MyRect  );
  MyRect := System.Classes.Rect(Rect.Left,Rect.Bottom,Rect.Right,Rect.Bottom-1);
  DBGrid_hours.Canvas.FillRect( MyRect  );
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1