Inleiding:
Ik ben nog steeds aan het werk aan m'n BVCL, m'n Big Visual Component Library. Eerder mochten jullie al genieten van m'n TBigLabel, en nu heb ik een nieuwe: TBigNumEdit
De naam zegt het al, 't is een edit om nummertjes in te tikken.
Download nu: BigEdit.pas of lees eerst even verder.
Aanleiding:
De laatste tijd zijn hier regelmatig vragen over geweest en de eindconclusie is toch wel dat je er niet komt met alleen het afvangen van OnKeyPress.
Hoewel ik die threads altijd aangeef dat het vooral belangrijk is om je input te controleren op het moment van verwerken (onder de OK knop, zeg maar), kan het natuurlijk wel handig zijn om een control te hebben dat je een handje helpt. Om niet iedereen door te wijzen naar de enorme puinhoop die Jedi heet, of naar een betaald component, heb ik hier een begin gemaakt met een los component, een unit met alleen die edit er in. Dit is dus in eerste instantie een demo voor NLDelphi.
Ik weet niet of alle oplossingen even elegant zijn. Deze edit is van scratch gemaakt, met alleen de VCL als referentie. Ik heb dus niet naar andere NumEdit implementaties gekeken. Na één klein avondje proggen kunnen er dus nog wel wat hiaten in mijn oplossing zitten.
Werking:
Deze edit filtert tijdens het wijzigen direct alle ongeldige tekens eruit. Daarbij probeer ik ook nog eens de cursorpositie op een logische plaats te houden. Dit gebeurt eigenlijk allemaal in één procedure. Bij het wijzigen van de tekst roep ik die dus aan, en die procedure wijzigt 'm eigenlijk nog een keer.
De edit heeft verder drie properties meer dan TEdit waarvan de namen denk ik voor zich spreken:
- Alignment (taLeftJustify, taRightJustify, taCenter)
- AllowNegativeNumbers (Bool)
- AllowFloatingPoint (Bool)
Verder zit er wel wat extra code in om wat speciale gevallen af te handelen. Ik heb de edit getest met verschillende situaties, zoals daar zijn:
Code:
e.Text := 'Koe67';
e.Perform(WM_SETTEXT, 0, Integer(PChar('koe67')));
SendMessage(e.Handle, WM_SETTEXT, 0, Integer(PChar('koe67')))
SendMessage(e.Handle, EM_REPLACESEL, 0, Integer(PChar('koe67')))
e.PasteFromClipboard;
e.SelText := 'koe67';
SetWindowText(e.Handle, 'Koe67');
Elk van deze werkt goed en levert dus alleen het getal '67' op in de edit. Ook heb ik gecontroleerd of ik kan afdwingen dat een '-' alleen aan het begin kan staan en er maximaal één komma in mag staan. Dit werkt ook.
Tekortkomingen:
Waar ik nog niet tevreden over ben:
- Lange invoer wordt afgebroken alsof WordWrap aan staat.
Er ontbreken nog wat properties, namelijk:
- AsInteger waarmee je de waarde kunt lezen (en schrijven) als integer of int64
- AsFloat, als boven, maar dan Double en/of Extended.
- Min en Max values
- OnGetValue event dat je in staat stelt de numerieke waarde van de edit te corrigeren, om zo zelf een exact bereik af te dwingen. Dit event kan gebruikt worden door AsInteger en AsFloat.
- Mogelijkheid om met een property een UpDown control op te nemen in de edit.
Feedback:
Maargoed, m'n avond is om, dus ik wilde het maar alvast posten, zodat de liefhebbers er op kunnen schieten. De code is rijkelijk voorzien van commentaar, al is die wel in het steenkolenengels. Mijn tests heb ik alleen nog gerund in Delphi 7. In mijn test heb ik 'm ook alleen runtime gemaakt. De installatie moet ik ook nog testen.
Bookmarks