[Pascal][Lazarus] Obsługa polaryzacji w kontrolce TLEDDisplay, czyli dorabiamy minusa

Tutaj umieszczamy tematy związane z językami programowania niepasującymi do innych działów.
Regulamin forum
Temat prosimy poprzedzić nazwą języka umieszczonego w nawiasach kwadratowych np. [Pascal].
Awatar użytkownika
tasza
Expert
Expert
Posty: 647
Rejestracja: czwartek 12 sty 2017, 10:24
Lokalizacja: Ostrowiec Św. / Warszawa
Kontaktowanie:

[Pascal][Lazarus] Obsługa polaryzacji w kontrolce TLEDDisplay, czyli dorabiamy minusa

Postautor: tasza » wtorek 20 cze 2017, 13:47

#slowanawiatr

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.
1_projekt.png

A tak jest pokazywane dla ujemnych, zerowych i dodatnik chartości gdy właściwość SupportSign jest na true
2_dzialanie.png


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

Laz7segTest.zip - cały projekcik, bez debug info, więc exe niewielkie

RackCtls.zip

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)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony środa 21 cze 2017, 07:57 przez tasza, łącznie zmieniany 1 raz.
eyes wide open but still blind to see what really matters...
#slowanawiatr ♫ ♥ ☕ ☘ ♌ ♫
pzdr,
Natasza

gaweł
User
User
Posty: 384
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [Pascal][Lazarus] Obsługa polaryzacji w kontrolce TLEDDisplay, czyli dorabiamy minusa

Postautor: gaweł » wtorek 20 cze 2017, 19:56

tasza pisze:nie ma co się bać majstrować w cudzym kodzie, no przecież nikt nie umrze, a coś można się zawsze nauczyć.

Ty chyba powinnaś nauczać w szkole ;)

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse


Wróć do „Inne języki programowania”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość