Czyli sugerujecie trzymać całą strukturę jako ... no właśnie TShape czy może TCustomControl?
Osobiście wolałbym TCustomControl
, bo oprogramować można własną kontrolkę od podstaw, zawierającą tylko potrzebne pola/metody; Roboty jest trochę więcej, ale warto - wszelką obsługę, rysowanie i zachowanie implementujesz sam;
Czyli tworzymy jeden obiekt następnie w pamięci trzymam array z poszczególnymi kratkami i całość rysuję na canvasie?
Dokładnie tak, tworzysz prywatne pole jako dynamiczna dwuwymiarowa macierz rekordowa i dorabiasz jej metody do modyfikacji elementów, ustalasz do niej dostęp itd. i wykorzystujesz ją podczas rysowania;
- Każda kratka musi mieć popup menu czyli jak rozumiem oprogramowujemy onMousDown czytamy parametry x i y, sprawdzamy która kratka jest na tych współrzędnych i odpowiednio budujemy popup (to samo onKeyPress) - dobrze rozumiem?
Tworzysz jedną właściwość PopupMenu
z tylko jednym menu kontekstowym, przechwytujesz komunikat naciśnięcia odpowiedniego przycisku myszy i pokazujesz (lub nie) je, przy czym możesz wcześniej modyfikować elementy tego menu, jeśli dla różnych kratek mają być różne; Według współrzędnych obliczasz która to kratka i jakie pozycje mają być w menu, ewentualnie pokazujesz/ukrywasz lub blokujesz/odblokowujesz odpowiednie dla danej kratki;
Jednak należy zwrócić uwagę, że klasa TCustomControl
nie posiada żadnych zdarzeń, a ilość właściwości jest ograniczona do niezbędnego minimum; Nawet fokusa nie ma, więc trzeba go dorobić, by móc przechwytywać wciskane klawisze; Musisz sam oprogramować fokusa oraz dodać interesujące Cię zdarzenia;
- W obecnej postaci po onClick Kratka dostaje "obwódkę", która wskazuje na zaznaczony element. W przypadku waszego rozwiązania musiałbym mieć zmienną globalną i na canvasie odpowiednio rysować obwódkę tak?
Nie - żadnych zmiennych globalnych; Wcześniej napisałem Ci, że dynamiczna macierz, która będzie przechowywać dane dla każdej kratki jest macierzą rekordową, stąd każdy element tablicy jest strukturą, w której zawarte są informacje o każdej kratce (takie jak wspomniana obwódka, kolor, tekst itd.); W ten sposób unikniesz zbędnych kombinacji;
- Mając osobne obiekty robię DrawText i mam tekst na całej szerokości/wysokości obiektu. W przypadku pojedynczego obiektu jak zrobić drawtext dla np polygona?
Jeśli dobrze rozumiem, to podczas rysowania wyliczasz pozycję danej kratki i według tych współrzędnych rysujesz obwódkę tylko i wyłącznie danej kratki - nie musisz zawsze przerysowywać całego komponentu (bo po co?); Dzięki temu, że masz jedną kontrolkę i wirtualną kratkę możesz narysować kilka kratek w jednej procedurze rysującej, przez co nie będzie zamętu z odwoływaniem się do innych obiektów-kratek; Po kliknięciu na kratkę możesz łatwo przerysować kilka kratek - wystarczy odczytać ich położenie i prostą arytmetyką obliczyć figurę, jaką trzeba narysować - tak samo dla wszelkich napisów;
- Mając obiekty dziedziczące po TPanel z automatu mam bevel i border, w przypadku użycia jednego obiektu musiałbym to ręcznie oprogramowywać prawda?
Owszem, bo tak jak wspomniałem wcześniej - klasa TCustomControl
posiada jedynie niezbędne właściwości; Możesz dorobić sobie takie właściwości, a styl rysowania ramki implementujesz w procedurze rysującej kontrolkę; Wystarczy do tego zwykły typ wyliczeniowy lub zbiór - zależy ile wartości może przyjmować ta obwódka;
- Ten pomarańczowy kwadracik, który widać na ostatnim screenie to podział danego obiektu na mniejsze, dzięki temu tekst mogę pisać jakby w dwóch obiektach. Jeżeli to będzie jeden obiekt całościowy to ... wracamy do punktu 3.
Jeśli zrobisz macierz, która będzie przechowywać struktury zawierające informacje o danej kratce, to możesz w tej strukturze zawrzeć informacje na temat podziału jednej kratki na mniejsze części, lub grupy kratek na mniejsze części; Niestety nie wiem na jakiej zasadzie mają być dzielone te kratki, więc ciężko na to pytanie odpowiedzieć; Pamiętaj, że wykorzystując macierz z informacjami o kratkach możesz obliczyć położenie tej ramki i styl uzupełniania kratek; Każda struktura kratki może zawierać tablicę, w której uwzględnisz podział na mniejsze części - te informacje należy uwzględnić podczas rysowania kontrolki; Jeśli dobrze przemyślisz tą strukturę, to wystarczy jedynie w odpowiednim miejscu narysować ramkę i tekst, a w strukturach zawrzesz o nich informacje.