Znikająca zawartość PaintBoxa po wciśnięciu Alt lub Tab

0

Zmajstrowałem sobie PaintBox-a, który służy do pobierania od osoby podpisu (na ekranie dotykowym). Wszystko działa jak należy, ale nie mogę pozbyć się następującego objawu. PaintBox czyści się po wciśnięciu pierwszy raz Tab lub Alt. O dziwo dzieje się tak tylko za pierwszym razem - każde kolejne wciśnięcie Tab albo Alt nie powodują tego objawu. Myślałem, że jest to powiązane z focusem itd. ale zmiana aktywnego komponentu nie powoduje wyczyszczenia PaintBox. Ktoś ? Coś ?

0

Zrób malutki program testowy — zwykłe okienko, dorzuć TPaintBox, coś w nim maluj z poziomu kodu. Włącz go i sprawdź czy ten błąd nadal wystepuje i jeśli tak, załącz ten program w załączniku, abyśmy mogli go też przetestować (w załączniku daj też pełny jego kod źródłowy).

Poa tym, która wersja Lazarusa i na jaki system operacyjny?

0

Przepraszam za zwłokę. Zrobiłem nową formę - w groupboxie wstawiłem pantboxa. Po narysowaniu czegoś i wciśnięciu tab lub alt pierwszy raz zawartość znika. Podejrzewam, że ma to coś wspólnego z metodą OnPaint, ale nie wiem jak to oprogramować. Link do projektu https://drive.chickendev.it/index.php/s/JSzqFBMZnWmpdRB

1
chickendev napisał(a):

Zrobiłem nową formę

A mógłbyś to zrobić w Lazarusie, a nie w tym czego używasz jako alternatywnego IDE? bo nikt nie będzie instalował żeby móc projekt otworzyć…

0

@chickendev: to nie jest problem klawiszy TAB lub ALT. Tak samo dzieje się, gdy okno programu traci focus. Wystarczy kliknąć poza okno programu i zawartość paintboxa znika. Być może problem dotyczy też klawiszy ALT i TAB, bo służą do przełączania okien.
Gdy painboxa dałem bezpośrednio na formę główną, a nie na groupboxa, to po utracie focusa zawartość nie znika, ale nadal znika po naciśnięciu Alt lub TAB

3

To co jest wyrenderowane w komponencie typu TPaintBox nie jest cache'owane, więc jeśli okno straci focus, to klasa okna dostaje komunikat, który w trakcie jego przetwarzania wymusza odmalowanie komponentu, a że kodu odmalowującego nie ma (bo zdarzenia OnPaint nie ma), to i nic się nie renderuje (prócz domyślnego, jednokolorowego tła). Efekt na ekranie jest taki, że zawartość komponentu znika.

Robisz błąd, że nie wykorzystujesz zdarzenia OnPaint, bo ono właśnie do tego służy, aby wyrenderować zawartość, gdy komponent musi zostać przemalowany na ekranie. Możesz też skorzystać z tylnego buforowania, czyli stworzenia pomocniczej bitmapy, na której będziesz malował podpis użytkownika — w PaintBox wystarczy samo namalowanie bitmapy na płótnie kontrolki. Dodatkowy plus jest taki, że bitmapę będziesz miał do dowolnego użytku (np. zapisu do strumienia czy bazy danych), bez konieczności kopiowania płótna kontrolki.

1

Może napiszę to tak, aby nie pozostawiać niedomówień.

Jeśli potrzeba wyrenderować cokolwiek bezpośrednio na płótnie okna czy komponentu, to kod malujący musi się znajdować w zdarzeniu OnPaint. Natomiast jeśli używa się tylnego buforu, a płótna okna/komponentu tylko do wyświetlania obrazu bufora, to kod malujący powinien się znajdować poza zdarzeniem OnPaint, natomiast w kodzie tego zdarzenia powinno się tylko namalować bufor na płótnie.

W przeciwnym razie mogą się pojawić problemy pokroju znikania zawartości płótna, niskiej wydajności renderowania lub wręcz rekurencyjnego zapętlania się kodu malującego (w zalezności od przypadtku, bo różne rzeczy mogą się dziać).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.