Wspominałam ostatnio o kontrolkach z pakietu RackCtls, o tym że darmowe i że są wespoł z kodem źródłowym.
I to jest mega ważne, ponieważ bardzo często zdarza się, że brakuje jakiejś drobnej nawet funkcjonalności, mogąc zbudować kontrolkę ze źródeł, przy odrobinie wysiłku możemy spokojne dosztukować sobie to co nam akurat zabrakło.
A zdarzyło się tak, że zabrakło mi minusa do wyświetlania wartości ujemnych na TLEDDisplay. Poprawnie wyświetlane są tylko nieujemne wartości podawane na Value wyświetlacza. No więc trzeba było bliżej przyjrzeć się, co on tam ma w środku.
Zmiany moje w telegraficznym skrócie, które wykonałam w klasie TLEDDisplay:
Kod: Zaznacz cały
private
FDigit : array [0..17] of TBitmap; // było 15 (A...F), doszlo puste i -
FSegCl : array [0..17, 1..7] of TColor; // podobnie, było 15, doszły dwie nowe kominacje segmentów
FSupportSign : boolean; //zmienna decyduje czy obsługiwac polaryzacje
procedure setSupportSign ( b : boolean ); // setterek do niej
published
// właściwość typu bool, zapis via metoda setSupportSign, odczyt na zywo, z pola klasy
property SupportSign : boolean read FSupportSign write setSupportSign default false;
setterek setSupportSign() potrafi zmusić komponent od odświeżenia się na ekranie nawet w trybie design, gdy kodujemy
Kod: Zaznacz cały
procedure TLEDDisplay.setSupportSign ( b : boolean );
begin
self.FSupportSign := b;
Invalidate; // zaznacz do odswiezenia
Change; // i odmaluj wyswietlacz po nowemu
end;
-- edytka poranna --
Zmiana rozmiaru tablic FDigit oraz FSegCl wynika oczywiście z dopisania dwóch nowych znaczków - pustego oraz minusa (zapalony segment G)
zatem drobna intruzja w metodę:
TLEDDisplay.CreateDigitBitmaps pisze:Kod: Zaznacz cały
AssignColors ($10,false,false,false,true,false,false,false); // minus
AssignColors ($11,false,false,false,false,false,false,false); // empty
No i zmiany w metodzie TLEDDisplay.Paint, która rysuje komponent, tu trzeba było nieco namotać:
TLEDDisplay.Paint pisze:Kod: Zaznacz cały
showMinus := FValue < 0; // proste zbadanie jaka jest polaryzacja wejścia
// gdy obsługiwane wartości ujemne dostawiaj - na najstarszej pozycji wyswietlacza
// a jak nie - rób po staremu
if self.FSupportSign and ( DigitNum = 1 ) then
begin
if showMinus then
Draw( DigitLeft, DigitTop, FDigit[$10] )
else
Draw( DigitLeft, DigitTop, FDigit[$11] );
end
else
begin
Draw(DigitLeft, DigitTop, FDigit[StrToInt('$'+outText[DigitNum])]);
end;
No i w programie głównym - podawanie wartości z kręcącej się gałki sprowadza się do przepisania liczby na Value wyświetlacza w procedurze obsługi zdarzenia Change() pokrętła
main.pas pisze:Kod: Zaznacz cały
procedure TForm1.uEKnob1Change(Sender: TObject);
begin
self.LEDDisplay1.Value := self.uEKnob1.Position;
end;
Tak wygląda projekt niejako na warsztacie, przy okazji można dodać mu śrubkowego klimatu, gałkę i wyświetlacz kładąc nie bezpośrednio na formie, ale na ScrewPanel - rozmiar śrubki ustawiłam na 4.
A tak jest pokazywane dla ujemnych, zerowych i dodatnik chartości gdy właściwość SupportSign jest na true
W podsumowaniu:
nie ma co się bać majstrować w cudzym kodzie, no przecież nikt nie umrze, a coś można się zawsze nauczyć.
To co zrobiłam działa jakoś ale ma i wady - na przykład robi się słabo gdy wyłączymy obsługę zer wiodących...
tak po prawdzie, to taki sprzętowy minus na segmencie G displaya jest z reguły na najstarszym wyświetlaczu, no ale tu, virtualnie, można by pokusić się o to aby zmieniał pozycję, wtedy wyglądałoby to o niebo ładniej
Laz7segTest.zip - cały projekcik, bez debug info, więc exe niewielkie
RackCtls.zip - plik RackCtls.pas, którym po zrobieniu kopii zapasowej proszę sobie nadpisać ten w /components, potem jak wczoraj było - otwieramy *.lpk, compile, use/install i gotowe
(tak naprawdę, ten pliczek wystawiłam już wczoraj, ale nie było kompletu zaznaczeń gdzie zmieniane)