Path: news.net.uni-c.dk!not-for-mail From: Mikkel Ricky Newsgroups: daimi.beta Subject: Re: Edittext/dialogfield - =?iso-8859-1?Q?begr=E6nsninger=2Bautomatik?= Date: Mon, 07 May 2001 13:22:15 +0200 Organization: UNI-C Lines: 195 Message-ID: <3AF68566.37C29C08@brics.dk> References: <3AEFD154.85DB4A37@cs.au.dk> NNTP-Posting-Host: russell.cs.au.dk Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Trace: news.net.uni-c.dk 989234535 9634 130.225.19.156 (7 May 2001 11:22:15 GMT) X-Complaints-To: usenet@news.net.uni-c.dk NNTP-Posting-Date: Mon, 7 May 2001 11:22:15 +0000 (UTC) X-Mailer: Mozilla 4.76 [en] (X11; U; IRIX 6.5 IP32) X-Accept-Language: en Xref: news.net.uni-c.dk daimi.beta:10555 Rene Kragh Pedersen wrote: > Kan man begrænse en edittext eller et dialogfield, så der kun kan være > et vist antal tegn i? Så det kun kan være heltal? Det overvejede jeg også i sin tid og nu har jeg efter lang tids uddannelse fundet svaret. Hvis du i stedet for 'editText' bruger 'TextField' kan du fange event'et 'onBeforeChange' og validere teksten i feltet. Se "https://beta.cs.au.dk/doc/lidskjalv-ref/interfaces/Guienv/fields.html" for oplysninger om TextField. Når der skal bruges mere avanceret validering end om hvorvidt teksten højst indeholder fx 6 tegn er det en god ide at bruge regulære udtryk og dfa'er. Hvis man ikke ved hvad et regulært udtryk er, så kan man spørge sin bedste ven der har haft dFM/dModLog om hvad det er. Nedenfor ses et Beta-program der bruger dfa'er til at begrænse indtasninger til henholdsvis et tal og en streng af længde højst 6. Hvis den nye tekst der indsættes i feltet får den underliggende dfa til at crash'e indsættes teksten ikke og derfor kan brugeren kun skrive tilladte værdier i feltet. > Kan man få fokus til automatisk at hoppe videre til næste felt, når det > foregående er fyldt ud? Dette skulle være muligt ved at sætte 'target' i det omgivende 'window'-object til "det næste felt", men jeg har ikke prøvet det ... Mvh Mikkel ---------------------------------------------------------------------- ORIGIN '~beta/guienv/guienv'; INCLUDE '~beta/basiclib/textUtils'; INCLUDE '~beta/guienv/controls'; INCLUDE '~beta/guienv/fields'; --- program: descriptor --- guienv (# dfa: (# size: @Integer; accepts: [0]@Boolean; transitions: [0]@Integer; addRange: (# fromState, toState: @Integer; fromChar, toChar: @Integer; enter (fromState, toState, fromChar, toChar) do (for c: toChar-fromChar+1 repeat toState->transitions[256*(fromState-1)+fromChar+c]; for); #); setAccept: (# state: @Integer; accept: @Boolean; enter (state, accept) do accept->accepts[state]; #); run: (# input: ^Text; state: @Integer; enter input[] do 1->state; input.reset; Loop: (for input.length repeat (if state < 1 then leave Loop; if); transitions[256*(state-1)+input.get+1]->state; for); exit (# result: @Integer; do (if state < 1 then -1->result; else (if accepts[state] then 1->result; else 0->result; if); if); exit result #) #); enter size do size->accepts.extend; 256*size->transitions.extend; (for i: size repeat (i, false)->setAccept; (i, 0, 0, 255)->addRange; for); #); theWindow: @window (# ValidateField: TextField (# theDfa: ^dfa; eventHandler::< (# onBeforeChange:: (# newText: ^Text; oldText: ^Text; do contents->oldText[]; (if length > 0 then contents->newText[]; (theText, position+1)->newText.insert; else (1, position+1+length)->oldText.sub->newText[]; (position+1-length, oldText.length)->oldText.sub->newText.append; if); (if not (theDfa[] = none) then ((newText[]->theDfa.run) > -1)->allow if) #); #); enter theDfa[] #); numberLabel: @StaticText (# open:: (# do (10, 10)->position; (80, 30)->size; 'Number:'->label; #) #); numberField: @ValidateField (# open:: (# number: @dfa; do (100, 10)->position; (100, 30)->size; 4->number; (1, 2, '-', '-')->number.addRange; (1, 3, '0', '0')->number.addRange; (1, 4, '1', '9')->number.addRange; (2, 4, '1', '9')->number.addRange; (3, true)->number.setAccept; (4, true)->number.setAccept; (4, 4, '0', '9')->number.addRange; number[]->theDfa[]; #); #); field6Label: @StaticText (# open:: (# do (10, 50)->position; (80, 30)->size; 'Text:'->label; #) #); field6: @ValidateField (# open:: (# max6: @dfa; do (100, 50)->position; (100, 30)->size; 7->max6; (for i: max6.size-1 repeat (i, true)->max6.setAccept; (i, i+1, 0, 255)->max6.addRange; for); (max6.size, true)->max6.setAccept; max6[]->theDfa[]; #); #); eventhandler:: (# onAboutToClose:: (# do terminate #) #); open:: (# do (400,400)->size; numberLabel.open; numberField.open; field6Label.open; field6.open; contents->target #) #); do theWindow.open; #)