Een draaiknop component voor Delphi


bekijk de source code
download hele Delphi-7 project

Dit artikel gaat over een draaiknop component voor de programmeertaal Delphi.
Muisbewegingen stellen de stand van de knop in.
De toepassing is in gesimuleerde laboratorium apparatuur.
Hieronder staan een paar voorbeelden van een draaiknop:



De knoppen hebben een 3D uiterlijk en tonen de rotatie.
Muisbeweging met ingedrukte muisknop verandert de positie van een knop.

Button properties

De rotation button component is een afstammeling van de TGraphicControl class.



Hierboven staan de (published) properties die de knop vorm geven.

Tekenen gebeurt in een bitmap die gecreëerd wordt als de knop voor het eerst wordt getekend.
De bitmap wordt automatisch met het component weer vrijgegeven.
Na tekenen van de knop wordt de bitmap gekopiëerd naar het canvas van de knop.
Dit voorkomt hinderlijk geknipper omdat het canvas niet tussentijds gewist wordt.

De positie van de knop is een getal van 0 tot maximaal 255 (byte).
Omdat een pixel afstand heel klein is is het onhandig de pixel afstand direct aan de positie van de knop te koppelen.
Daarom is er een instelbare vertraging.
De volgende (published) properties controleren de knop positie:
    - pixelratio : het aantal pixels dat de positie met één verhoogt of verlaagt
    - maximum : de maximum knop positie
    - position : de huidige knop positie
orientation
    - orHorizontal : knop verandert door horizontale muisbeweging
    - orVertical : knop verandert door vertikale muisbeweging

Events

    - onChange
    - onButtonPaint
    - onEnter
    - onLeave
onChange
levert een nieuwe knop positie.

onButtonPaint
Dit event treedt op nadat een knop in zijn bitmap is getekend maar nog niet naar het canvas is gekopiëerd.
Zodoende is er gelegenheid nog wat informatie toe te voegen.
Lees de property map om toegang tot de bitmap te verkrijgen.

onEnter, onLeave
Deze events treden op als de muispointer een knop binnengaat of verlaat.

Programma beschrijving

Het 3D effect

Bekijk een vertikaal geplaatst knopje:



Variable i loopt van 0 bij punt A tot de knophoogte bij punt B.
Voor elke stap bepalen we hoek a in radialen.
bij middelpunt C is a gelijk aan p/2
De arctan( ) functie geeft negatieve waarden voor kwadranten 2 en 4.
Nadat C is gepasseerd (kwadrant 2), moet a met p worden verhoogd.

Als de muispointer over de knop beweegt met ingedrukte muisknop
dan treden mousemove events op die de (x,y) coördinaten leveren.
Deze (x,y) waarden vergelijken we met de vorige om de afgelegde afstand te berekenen.
Variabele pixelcount geeft deze afgelegde afstand in pixels aan.
De positie van de knop is deze pixelcount gedeeld door de property pixelratio.

Rotatie
In de beschrijving hiervoor was er geen sprake van rotatie.
Die beweging voegen we toe door de pixelcount op te tellen
bij de cirkelboog (a.radius) voor berekening van de modulus.

Om de knop in dezelfde richting te doen bewegen als de muis is een verraderlijk verschilletje
nodig tussen horizontaal- en vertikaal geplaatste knoppen.
Zie de source code.

Het Delphi project

Dat bestaat uit:
    - form1, unit1 : knoppen en code om het component te testen
    - unit dav7rotationbtn bevat de TDav7RotationBtn class.
hiermee beëindig ik de beschrijving van de rotating button component