Results 1 to 4 of 4

Thread: TBigNumEdit

  1. #1

    Cool TBigNumEdit

    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.
    1+1=b

  2. #2
    Quote Originally Posted by GolezTrol View Post
    Er ontbreken nog wat properties, namelijk:
    - AsInteger waarmee je de waarde kunt lezen (en schrijven) als integer of int64
    Publish de Text property niet en maak een Value property aan die je daarvoor gebruikt.

    Wat ook handig is is een TInputErrorEvent
    Code:
      TInputErrorEvent = procedure (Sender: TObject; IllegalText: string) of object;
      //een aangepast event als er geen nummer ingegeven wordt
      //parameters:
                   //Sender: TObject = het component zelf
                   //IllegalText: string = de tekst dat de gebruiker trachtte in te voeren en niet geaccepteerd wordt
    Verder wil ik zeggen dat het een mooi begin is
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  3. #3
    Hoi Henkie, thanks voor de feedback.
    De text property is nu inderdaad vooral published omdat ik die andere properties nog niet heb. Ik dacht ook dat het wel logisch zou zijn om onderscheid te maken tussen integer en float, maar misschien is een enkele Value property wel voldoende. Deze kan dan wel gewoon Extended zijn.

    Wat betreft het event: Dat zie ik niet zo. De edit is er juist op gemaakt dat er geen illegale input mogelijk is. Zo'n event heeft dan niet zo heel veel zin. Je kunt natuurlijk wel per getypte letter zo'n event gaan genereren, maar ik denk dat dat niet zoveel toevoegt. Dat zou logischer zijn bij het type edit waarin je wel alles mag typen. De getter van de Value property kan in zo'n geval een check doen en het event aanroepen.
    1+1=b

  4. #4
    Een OnInputErrorEvent zou handig kunnen zijn maar jij vangt alle fouten direct af, je filtert de Text zodat enkel de interges overblijven. In dit geval zou je de gebruiker kunnen laten weten dat er enkele tekens in zaten die je niet kon verwerken als getal.
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •