Kolorowanie PageControl w Lazarusie

0

Witam,

Jest jakiś sposób aby zakładki PageControl miały kolor taki jak okno? Po wstawieniu na formularz są białe włącznie z przyciskami którymi się przełącza zakładki, co niezbyt ładnie wygląda. W necie można znaleźć jakiś kod który niby to umożliwia, ale mi to nie zadziałało. Pozostaje albo inny komponent który umożliwia większą konfigurację, albo np. dodawanie Panelu do każdej zakładki TabSheet i umieszczanie reszty na nim. Tyle że to też nie wygląda tak jak powinno. No chyba że ktoś zna prostą metodę żeby pokolorować PageControl. Najlepiej z jakimś przykładem kodu.

0

Rozumiem, że klasa dziedzicząca po ComCtrls.TTabSheet z własną obsługą WM_ERASEBKGND nie sprawdza się pod Lazarusem? Bo pod Delphi wystarcza. Z tym, że dla Delphi 7, a może i nie tylko, należy użyć dodatkowego modułu, który jakby patchuje wywołanie funkcji API czy tam obsługę komunikatów. Ponieważ inaczej są niestety zakładki rysowane bez własnych etykiet i wygląd nie jest do końca prawidlowy. Ma to miejsce chyba tylko na 64 bitowych systemach.

Moduł ten mam pod nazwą vclfixes i znalazłem go w Google. Ideą jego jest krótko opisana w komentarzu na początku kodu // WMDrawItem fails under WOW64, see http://qc.codegear.com/wc/qcmain.aspx?d=19859. Poniżej screeny jak wygląda program z modułem i bez niego. Program był pisany dla jednego znajomka. Obecnie nie rozwijam już tego kodu. Ale właśnie malowanie PageControl jest zrobione przez nadpisanie obsługi wspomnianego na początku komunikatu.

Schowek01.png

Schowek02.png

EDIT: teraz o ile dobrze widzę, to TPageControl nie ma pod Lazarusem w ogóle zdarzenia OnDrawTab. Tutaj może coś doradzi @furious programming, bo ja Lazarusa używam od święta i nie znam dobrze tego IDE oraz LCL.

0
olesio napisał(a):

Rozumiem, że klasa dziedzicząca po ComCtrls.TTabSheet z własną obsługą WM_ERASEBKGND nie sprawdza się pod Lazarusem?

Tak, to ten sam fragment kodu. Trochę to dla mnie zamotane ;) Chyba lepiej pokombinuję coś po swojemu, albo poszukam lepszego komponentu. Albo zainstaluję wiekowe Delphi 2005 i problem się rozwiąże ;)

0

Kiedyś dużo bawiłem się w implementowanie własnego malowania, ale miałem do dyspozycji jedynie to, co VCL z Delphi7 pozwalało mi pomalować (odpowiednie zdarzenia), bez różnych kombinacji w hooki itp.; Jednak PageControl nigdy nie potrzebowałem malować po swojemu, więc tutaj niewiele doradzę;

Spróbuj zaimplementować trick opisany w tym artykule, czyli stworzyć nową klasę zakładki, dziedzicząc po TTabSheet i nadpisać metodę obsługującą komunikat WM_ERASEBKGND (w Lazarusie jest to stała LM_ERASEBKGND z modułu LMessages); Reszta jest opisana także w tym samym artykule, a efekt działania nowej klasy zakładki masz na samym jego dole.

0

Trochę to jednak dla mnie za skomplikowane. Próba wykorzystania kodu kończy się problemami których rozwiązanie jest dla mnie obecnie zbyt trudne. Jak coś uda mi się poprawić to pojawia się kolejny błąd. W Delphi był fajny komponent, można było zmieniać nawet styl przycisków przełączających. Jedną z możliwych opcji jest zrobienie takiego pseudo PageControl - zwykłe przyciski i przełączane panele. Tylko tutaj znów będzie problem na etapie wizualnego rozmieszczania kontrolek, bo panele się zasłaniają. Trzeba je przerzucać na wierzch w inspektorze obiektów.

0

Próba wykorzystania kodu kończy się problemami których rozwiązanie jest dla mnie obecnie zbyt trudne. Jak coś uda mi się poprawić to pojawia się kolejny błąd.

Najpierw trzeba się zapoznać z wnętrzem klasy danego komponentu i zrozumieć co się w nim dzieje, aby móc cokolwiek zmodyfikować; Bez tej wiedzy, zmodyfikowanie klasy prowadzi do mnożenia się kolejnych błędów - i tak praktycznie bez końca; Dlatego sam wolę pisać komponenty zupełnie od podstaw;

W Delphi był fajny komponent, można było zmieniać nawet styl przycisków przełączających.

No widzisz - ktoś taki komponent albo napisał sam, albo był na tyle cierpliwy, że stworzył go na podstawie istniejących klas z VCL; Samo się nie zrobi - coś trzeba samemu napisać;

Jedną z możliwych opcji jest zrobienie takiego pseudo PageControl - zwykłe przyciski i przełączane panele. Tylko tutaj znów będzie problem na etapie wizualnego rozmieszczania kontrolek, bo panele się zasłaniają. Trzeba je przerzucać na wierzch w inspektorze obiektów.

To akurat jest najmniejszy problem, bo komponenty w edytorze formularzy układasz raz, a program już później korzysta z wybranego ułożenia; Pamiętaj tylko, że zbudowanie pseudo-PageControl z przycisków i paneli nie będzie miało takiej funkcjonalności, jak oryginalny komponent z zakładkami - wszystko będziesz musiał implementować sam, na dodatek w klasie formularza; Ale jakieś to rozwiązanie jest - użytkownik i tak nie będzie miał pojęcia o tym, jak program został zbudowany.

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