Stworzenie przezroczystego TEdit

0

Hej ,
Czy macie doswiadczenie w tej kwestii?
Stawiam edit.width:=1; w zdarzeniu klikniecia na region gdzie on jest - trzeba oczywiscie region odczytac szerszy niz 1... jest setfocus i startsel...dla edita
I na innym komponencie - tym pod spodem np na formie
rysuję to co zostalo napisane w edit... przesuwajac edit o dlugosc danego znaku odczytanego z canvas.textwidth();
Czy efekt jest dobry i daje zludzenie przezroczystosci kursor miga na koncu napisanego tekstu. czy tez myslicie ze wyglada źle i metoda jest kiepska?
U mnie sprawdzilem na jednej formie wyglada calkiem calkiem ale
chcialem zapytac czy sa jakies ograniczenia żeby sie nie napracowac duzo tworzac funkcje obslugi takiego edita dla calej aplikacji.

Jesli ten temat byl juz sto razy i jest to wymyslanie na nowo kola to przepraszam.

0

Że co?! Jak chcesz mieć przezroczystą kontrolkę to rozszerz sobie tę standardową, obsłuż komunikat WM_ERASEBKGND i w metodzie obsługującej go maluj kontrolkę-rodzica, czyli to co jest pod spodem. Zresztą takie kontrolki już istnieją – wystarczy poszukać w sieci, pobrać, zainstalować i używać.

Przykładową masz tutaj – sprawdź sobie, w razie czego zobacz też na torry.net.

0

Jest takie cos dla lazarusa?

Bo to nie bedzie multiplatformowo chyba co piszesz. Ten program dziala na os x i windows.

0

Możesz po prostu nadpisać metodę WMEraseBkgnd, która już jest zaimplementowana w bazowej klasie dla kontrolek, a dokładniej w klasie TWinControl.

0

Wielkie dzieki , poszukalem spróbuje to jakos sobie dograc bedzie duzo bardziej eleganckie niz rysowanie zawartosci edita na tle i przesuwanie migajacego kursora w edicie o szerokosci 1 i robienie z edita kursora.

Mam jeszcze jedno pytanie i problem w moim programie liczacym kilkadziesiat form działa jedna z wątkiem przelaczajacym widoczne formy- taka procedra sterująca aplikacją.
Czy jest jakis latwy sposob żeby nadac temu wątkowi bardzo niski priorytet albo zawiesic go z poziomu form jakimi steruje? Proste to nie jest bo lazarus nie pozwala na wsteczne sprzeżenie między formami i sterowanie mozna uzyskac tylko w jedną stronę. Ja to robie za pomocą zmiennych globalnych.
Jak wlaczam nenadżera zadan aplikacja praktycznie nic nie robi poza nasluchiwaniem komunikatow z poszczegolnych form a jednak wątek zjada 40-50% pracy procesora. Oczywiscie gdy system jako taki jest bezczynny. Przy odtważaniu filmu jest to 2-3% juz tylko ale jednak bezsensowne zjadanie zasobów.

0

Problem rozwiazany dzięki :)

0

@Windowbee: zrobiłeś tę przezroczystość czy pozbyłeś się niepotrzebnego zjadania zasobów? Bo teraz to w sumie nie wiadomo który z tych dwóch problemów rozwiązałeś. A może oba? ;)

0

Przezroczystosci nie osągnąlem bo to nie 5 min ale znalazlem artykuły jak to zrobic, jak sie da na os x to bedzie super a jak nie to zrobie moj sposob z rysowaniem zawrtosci edita na tle... działa jakby edit byl przezroczysty...(proste rozwiazanie) i kompatybilne z os x.
A sprawę zasobożernosci przez ciagłe uruchmienie w wątku nieskonczonej pętli nasluchującej zmiennych globalnych i przydzielającej zadania widocznosci itd form... obszedlem przez dolozenie dodatkowej formy która nie jest już zapętlona z innymi i steruje wątkiem- włacza go lub wyłacza poprzez uruchmienie zwyklego buttonclick z wlacznikiem i wylacznikiem wątku rozdzielajacego.
W ten sposob z 50% zjadania zasobow spadlo do 25%...
I aby bylo okolo zera %- ciaglą pętle wątku rysujacego efekty graficzne najazdu myszką na opcje zastąpiłem wlaczaniem go dopiero gdy myszka najeżdza na obiekt i wylaczaniem gdy z niego schodzi. Poza tym wątkom dalem najnizszy priorytet.

0
Windowbee napisał(a):

A sprawę zasobożernosci przez ciagłe uruchmienie w wątku nieskonczonej pętli nasluchującej zmiennych globalnych i przydzielającej zadania widocznosci itd form...

Wątek poboczny będzie niepotrzebnie zżerał moc procesora, jeśli swoje zadanie będzie wykonywał w ciągłej pętli. Jeśli chcesz tego uniknąć to albo dorzuć Sleep do tej pętli z jakimś przyzwoitym interwałem (100 powinno wystarczyć), albo skorzystaj ze zwykłego timera, który co prawda działa w ramach głównego wątku, ale nie zamraża jego działania podczas oczekiwania na wywołanie zdarzenia OnTimer.

W ten sposób zużycie procesora spadnie do 0%. Zakładam, że nie musisz sprawdzać stanu zmiennych milion razy na sekundę, więc dodanie Sleepa lub skorzystanie z timera w niczym nie przeszkodzi.

0

Hmm
Sleep moze byc ok, mialem wczesniej ale nie zapewnia jednakowego czasu dla kazdego procesora na szybszym kompie dziala znacznie krocej. Efekty graficzne znacznie przyspieszaja lub zwalniaja. Dlatego jest jeszcze jeden watek dziajacy jak sleep ale odczytujacy czas systemowy w ms... wtedy niezaleznie od systemu szybkosc animacji i ruchu czasteczek jest taka sama.
Z tych powodow watek teraz wyłączam i tez problemu nie ma bo uzycie procesora tylko na czas animacji albo przelaczania form albo zmian w nich zwieksza sie na chwile tylko.

0

Sleep korzysta z systemowego zegara pracującego z dokładnością do 16 milisekund. Dokładność pracy tego zegara nie jest zależna od mocy obliczeniowej procesora w danym komputerze. Minimalna wartość jaką obsługuje Sleep to 10 lub 16, w zależności od systemu operacyjnego i sprzętu. Jeśli wywoła się Sleep(1) to program nie zostanie wstrzymany na jedną milisekundę. Chyba że przez przypadek akurat złoży się to z momentem inkrementacji zegara.


Dokładniejszy ”zegar” dostępny pod Windows nie bazuje na odmierzaniu czasu, a na liczeniu cykli procesora. Dostęp do wartości jego częstotliwości i bieżącego stanu licznika uzyskać można odpowiednio za pomocą funkcji QueryPerformanceFrequency oraz QueryPerformanceCounter. Dla innych platform przewidziane są inne funkcje, np. dla uniksów są to clock_getres i clock_gettime.

Na podstawie tych wartości można sobie napisać funkcję, która wstrzyma działanie programu na dowolnie mały okres – milisekundę, mikrosekundę czy nawet na jeszcze krócej. Tyle że taka funkcja będzie zżerać całą dostępną moc jednego jądra procesora.


Przykład implementacji takiej funkcji i klasy opakowującej znajdziesz w źródłach projektu Deep Platformer (w załączniku jest kompletny kod źródlowy) – moduł Platformer.Time.pp, klasa TClock i metoda WaitForNMI.

0

Dzieki wielkie to by tlumaczylo nie dzialanie dobrze sleep-u....
Skoro raz 16 raz 10 a ja mialem ustawione na 1 to nie jest dziwne ze na jednym komputerze dzialo sie wszystko przynajmniej 1,5x szybciej niz na drugim.
Wróce do tego podczas finalizacji programu. Jeszcze raz dziekuję za porady.

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