Seuraavassa listauksessa on tehty oma komponentti Autolaskurin tekemistä varten. Tarpeelliset teko- ohjeet on kommenteissa.
unit laskuri; { Tehdään malliksi uusi komponentti TLaskuri, joka on kuten TLabel, mutta siinä pidetään kokonaislukuarvoa oikeassa reunassa, sinisellä pohjalla kentän leveys säilyttäen (oletuksena) ja siinä on lisäksi lisäys-metodi. Caption-ominaisuuden muuttaminen kelpuuttaa vain kokonaisluvut ja Caption on aina synkronissa Value-arvon kanssa. Vesa Lappalainen 26.8.1996 "Kirjastoa" voidaan testata ennen varsinaiseen komponenttikirjastoon lisäämistä seuraavasti: 1) Tee uusi projekti, lisää uses-osaan laskuri, samoin projektiin 2) Formin private osaan laita esim: lask : TLaskuri 3) Formin alustukseen kirjoitat: lask := TLaskuri.Create(self); lask.Parent := self; lask.SetBounds(20,20,50,lask.Height); 4) Lisää vaikkapa nappula, jonka painamisen koodiksi kirjoitat: lask.Inc(1); Kopmponentti voidaan lisätä kirjastoon seuraavasti: 1) Käännä tämä tiedosto (vaikka jonkin projekti osana), esim. edellisen testin käännös riittää 2) Kopioi laskuri.dcu sinne kirjastoon, jossa sinulla on komponentit (ks. vaikka Components/Install/Search Path) 3) Kopioi laskuri.dcr samaan paikkaan (tänne on tehty komponenttisivulle tuleva bittikartta TLASKURI, 24x24, Huom! nimi isolla Pitää olla näköjään oma .dcr Delphi 1.0:lle ja Delphi 2.0:lle!). 4) Valitse Components/Install/Add ja kirjoita Laskuri ja OK OK (Delphi 1.0:ssa Options/Install Components/....) 5) Jos jatkossa havaitset komponentissa, riittää korjausten jälkeen Rebuild Library Tehtäviä (komponentit voi lisätä tähän samaan tiedostoon): 1) Tee uusi komponentti TLisaaButton, jolla on ominaisuutena Laskuri : TLaskuri - laskuri, jonka arvoa lisätään aina kun nappia painetaan Lisays : Integer - paljollako laskuria lisätään 2) Tee autolaskuri em. komponenteilla niin, että tarvitsee kirjoittaa vain yksi rivi koodia: Nollaa-nappulalle 3) Tee vielä komponentti TNollaa, joka nollaa kaikki samalla lomakkeella olevat laskurit (ks. ComponentCount ja Components). 4) Tee autolaskuri kirjoittamatta riviäkään koodia. Jos lisätään uusi laskuri-lisää -pari, niin taritaanko vieläkään koodia? 5)*Modifioi em komponnettia siten, että sille voidaan antaa ominaisuutena kaikki komponentit, jotka halutaan nollata. } interface uses SysUtils, Classes, Controls, Graphics, StdCtrls; type TLaskuri = class(TLabel) private FValue : integer;{ Ominaisuuksien attribuutit nimetään yleensä F-alkuisiksi} public constructor Create(AOwner:TComponent); override; function Inc(i:integer) : integer; virtual; procedure SetValue(i:integer); virtual; procedure SetCaption(const s:string); virtual; function GetCaption:string; virtual; published { Published declarations } { Yleensä vain ominaisuudet. } { Ominaisuuksiin ilmoitetaan miten niitä luetaan ja miten asetetetaan sekä } { mahdollinen oletusarvo. Oletusarvo on ainoastaan ohje siitä, ettei } { arvoa talleteta resurssitiedostoon, jos arvo on sama kuin oletus. } { Luku/kirjoitusohje voi olla saman tyyppisen attribuutin nimi tai } { aliohjelma asettamiseen ja funktio lukemiseen } property Value:integer read FValue write SetValue default 0; property Caption:string read GetCaption write SetCaption; { Seuraavat ominaisuudet isältä, ainoastaan oletusarvot erilaiset } property Alignment default taRightJustify; property AutoSize default False; property Color default clAqua; property ParentColor default false; { Kaikki muut isän ominaisuudet tulee sellaisenaan } end; procedure Register; implementation {$IFDEF VER80} { Delphi 1.0:sta puuttuu trim } uses strtrim; {$ENDIF} constructor TLaskuri.Create(AOwner:TComponent); begin inherited Create(AOwner); { Muista tämä!!! Muuten käy huonosti!!!} Value := 0; { Defaulteissa luvatut arvot: } Alignment := taRightJustify; AutoSize := False; Color := clAqua; ParentColor := False; end; function TLaskuri.Inc(i:integer) : integer; begin Value := Value + i; end; procedure TLaskuri.SetValue(i:integer); begin FValue := i; inherited Caption := IntToStr(i)+' '; { Välilyönti loppuun on paremman näk. } end; procedure TLaskuri.SetCaption(const s:string); begin Value := StrToInt(Trim(s)); end; function TLaskuri.GetCaption:string; begin Result := Trim(inherited Caption); { Varo rekursiota!!! } end; procedure Register; { Komponentit pitää rekisteröidä komponenttisivulle } begin RegisterComponents('Samples', [TLaskuri]); end; end.