Centrum Skryptów - Systemy Operacyjny

Jak ograniczyć liczbę znaków, które mogą zostać wpisane w dany obszar tekstu?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak ograniczyć liczbę znaków, które mogą zostać wpisane w dany obszar tekstu?

Cześć, Skrypciarze! Mam aplikację HTA służącą do wpisywania danych. Muszę zrobić dwie rzeczy: po pierwsze – chcę ograniczyć liczbę możliwych znaków do 256 (nie wiem, jak to zrobić); po drugie – chcę, aby w trakcie wpisywania wyświetlana była pozostała liczba znaków, które można wpisać w to pole. Czy znacie może jakiś skrypt, który upora się jednocześnie z obydwoma problemami?

-- RB

Cześć, RB! Fajnie jest tak podróżować, szczególnie na koszt firmy i bez wątpienia nie nudziliśmy się ani przez chwilę w Barcelonie. Na konferencji TechEd IT Forum (j.ang.) zresztą też się nie nudziliśmy i niniejszym chciałbym podziękować wszystkim, którzy zatrzymywali się przy naszym stoisku w celu wygrania laleczki Doktora Scripto. Byli też tacy śmiałkowie, którzy wstępowali, żeby po prostu sobie pogadać. Tym śmiałkom dziękujemy podwójnie, oznacza to bowiem, że nieprawdą jest wiadomość, którą otrzymałem od swojego szefa zaraz po przyjeździe. Jaka wiadomość? Zaraz się przekonacie.

Otóż od razu po powrocie szef kazał mi zerknąć na kilka grup w witrynie Facebook (j.ang.) . Żeby jednak sprostać temu zadaniu, musiałem oczywiście założyć swoje własne konto oraz profil. Co się okazało po założeniu profilu? Zobaczcie sami:

Wynika z tego, że nikt spośród 22 653 osób z naszej sieci nie jest moim przyjacielem. Uwierzylibyście???

Uwaga: Skąd oni mogą wiedzieć, że nie mam żadnych przyjaciół w firmie Microsoft? Skrypciarska Pani Redaktor mówi co prawda, że wszyscy wiedzą to od dawna, ale do tej pory nie wierzyłem, może to być możliwe.

Czas więc pozyskać nowych przyjaciół. Jak to się robi? Kupiłem parę książek na ten temat i rada jest jedna, choć nie tak dosłowna: „podlizuj się”. Niniejszym więc podlizuję się i oto skrypt, który ogranicza liczbę znaków obszarze tekstu aplikacji HTA, a ponadto informuje użytkowników, ile jeszcze znaków im pozostało:

<HTML>

<HEAD>

    <title>Character Counter</title>

</HEAD>



<SCRIPT Language="VBScript">

    Sub CharactersRemaining

        intCharacters=Len(BasicTextArea.Value)

        If intCharacters > 256 Then

            BasicTextArea.Value = Left(BasicTextArea.Value, 256)

        Else

            intRemaining = 256 - intCharacters

            DataArea.InnerHTML= "Characters remaining: " &intRemaining

        End If

    End Sub

</SCRIPT>



<BODY>

    <textarea name="BasicTextArea" rows="5" cols="75" onKeyPress="CharactersRemaining"></textarea><br>

    <span id=DataArea>Characters remaining: 256</span>

</BODY>

</HTML>

Spróbujmy teraz rozszyfrować działanie tego skryptu. Jak widzicie, mamy tu bardzo prostą aplikację HTA, która zawiera tylko dwa elementy: obszar tekstu textarea (o nazwie BasicTextArea) oraz obiekt span (czyli tag HTMLowy o nazwie ID DataArea). Tag obszaru tekstowego zawiera cztery parametry:

  • Name. Tego parametru używamy do nazwania obszaru tekstu, obszar musi się przecież jakoś nazywać, w przeciwnym wypadku nie moglibyśmy odwoływać się do niego programistycznie. (Lub przychodziłoby nam to z wielką trudnością.)
  • Rows. Tu ustawiamy wysokość (w rzędach) obszaru tekstu. W przykładzie ustawiliśmy liczbę rzędów na 5, ale można tę liczbę zmienić na każdą inną (jeżeli wybierzecie 2, to obszar tekstu będzie automatycznie zawierał pasek, dzięki któremu będziemy mogli przemieszczać się w górę i w dół w obrębie pola.)
  • Cols. To szerokość obszaru tekstu. Technicznie rzecz biorąc to szerokość w kolumnach (Cols), ale dla nasz oznacza ona po prostu liczbę znaków wyświetlanych w każdym rzędzie.
  • onKeyPress. Ostatnie na naszej liście jest zdarzenie onKeyPress. To zdarzenie uruchamiane jest za każdym razem, gdy fokus jest na obszarze tekstu, a użytkownik przyciśnie jakiś klawisz na klawiaturze. W takim momencie uruchamia się podprogram CharactersRemaining. Co robi taki podprogram? To bardzo proste, ale omówimy to za chwilę.

Zanim bowiem zajmiemy się podprogramem, warto wspomnieć, że tag oznaczający obiekt span zawiera jeden parametr: ID. ID musi być określone dokładnie, musimy przecież być w stanie odwołać się do niego programistycznie. Dlaczego chcemy się do niego odwoływać? Dlatego, że użytkownik musi mieć jakiś widoczny przelicznik znaków, musi wiedzieć ile ich mu jeszcze zostało do wpisania w obszar tekstu. Nie chcemy tego robić w polu wiadomości – wyobraźcie sobie, ze musicie odpowiadać na pole wiadomości za każdym przyciśnięciem klawisza na klawiaturze.

Zamiast więc aplikować Wam „niekończącą się opowieść” pól wiadomości, stwierdziliśmy, że lepszym rozwiązaniem będzie aktualizowanie tagu span (nazwanego obszaru naszej HTA) za każdym razem, gdy przyciśniemy klawisz. W momencie uruchomienia naszej aplikacji HTA, span zawiera następujący tekst:

Characters remaining: 256

Robimy tak z prostego powodu: mając puste pole tekstu, możemy w nie wpisać 256 znaków. Za każdym razem, gdy wpiszemy jakiś znak, aktualizujemy właściwość InnerHTML. Po wpisaniu jednego znaku obiekt span pokaże następujący komunikat:

Characters remaining: 255

Gdy wpiszemy drugi znak, otrzymamy tym razem taki komunikat:

Characters remaining: 254

Gdy wpiszemy trzeci komunikat… chyba nie muszę już pisać, nie? Domyślacie się sami (moi czytelnicy są nadzwyczaj inteligentni – ha, w sprytny sposób skorzystałem z metody „podliż się”).

Po zdefiniowaniu parametrów obiektu span… ominęliśmy coś? Twierdzicie zapewne, że zapomnieliśmy o jednym parametrze – zapomnieliśmy dodać parametr, który określa maksymalną ilość znaków, którą możemy wpisać w obszar tekstu? Chcecie wiedzieć jaki sens ma mówienie ludziom, ile im znaków jeszcze zostało w momencie, gdy nie sprecyzowaliśmy maksymalnej liczby znaków?

No, dajcie spokój, czy naprawdę myślicie, że Skrypciarze pominęliby tak ważny detal (tylko broń Boże nie odpowiadajcie, to było pytanie retoryczne)? Już się usprawiedliwiamy – jest przynajmniej jeden powód takiego uchybienia: formant obszaru tekstu nie ma po prostu takiego parametru. W HTML-u nasze stare dobre pole tekstowe ma parametr maxLength, czyli właściwość, która pozwala określić maksymalną liczbę znaków, które można wpisać. Obszar tekstu nie ma niestety takiej właściwości.

Nil desperandum! Pokażemy Wam zaraz metodę na obejście tego problemu. Czy kiedykolwiek Was zawiedliśmy (to także pytanie retoryczne)?

OK, nadszedł czas porozmawiania na temat podprogramu CharactersRemaining. Co robimy wewnątrz tego podprogramu? Już mówiliśmy – za każdym razem, gdy fokus jest na obszarze tekstu, a użytkownik naciśnie klawisz na klawiaturze, robimy, co następuje:

intCharacters=Len(BasicTextArea.Value)

Nie ma tu naprawdę nic wymyślnego – używamy po prostu funkcji Len, która przelicza nam ilość znaków wpisanych do obszaru tekstu (BasicTextArea.Value). Jak zapewne się domyślacie, istnieją dwa powody, dla których zależy nam, żeby wiedzieć ile znaków znajduje się obecnie w obszarze: musimy ograniczyć całkowitą liczbę znaków do 256, ponadto musimy też wiedzieć ile znaków można jeszcze wpisać (oczywiście poprzez odjęcie aktualnej liczby znaków od 256).

Jak ograniczyć liczbę znaków do 256? Prościzna, następujący wiersz kodu ustala, czy maksymalna ilość znaków jest większa niż 256:

If intCharacters > 256 Then

Kolejne pytanie – w jaki sposób można przekroczyć naszą magiczną liczbę 256? Już odpowiadam. Załóżmy więc, że mamy już wpisane 256 znaków. W momencie, gdy przyciśniemy jakiś klawisz na klawiaturze, znak będzie już znakiem nr 257, no i oczywiście uruchomi nasz podprogram.

Jak więc zapobiegamy wpisaniu takiego nadmiarowego znaku w obszarze tekstu? No cóż, szczerze mówiąc – nie zapobiegamy. Trochę za to oszukujemy. Jak się okazuje, pozwalamy na naciśnięcie klawisza (cóż zresztą moglibyśmy zrobić? przecież nie znikniemy klawiatury!), a następnie używamy poniższego wiersza kodu (i funkcji Left), by pobrać 256 pierwszych znaków i przypisać je ponownie do właściwości Value obszaru:

BasicTextArea.Value = Left(BasicTextArea.Value, 256)

Widzicie, jak to działa? Przez ułamek sekundy może i mieliśmy 257 znaków w naszym polu tekstowym, ale szybko i skutecznie się go pozbyliśmy, a teraz widoczne są tylko znaki od 1 do 256. Być może i trochę oszukaliśmy, ale to naprawdę działa (spróbujcie sami).

Co się dzieje, jeżeli mamy mniej niż 256 znaków w obszarze tekstu, na przykład 14? W takim przypadku uruchamiamy następujące dwa wiersze kodu:

intRemaining = 256 - intCharacters

DataArea.InnerHTML= "Characters remaining: " &intRemaining

W pierwszym wierszu trochę sobie liczymy – odejmujemy aktualną liczbę znaków (w naszym przypadku 14) od 256, po czym przechowujemy ten wynik w zmiennej o nazwie intRemaining. Następnie ustawiamy wartość właściwości InnerHTML obiektu span, na ciąg Characters remaining: po którym następuje wartość intRemaining. Innymi słowy:

Characters remaining: 242

Tylko tyle. Za każdym razem, gdy wpiszemy nowy znak, uruchomimy podprogram, który zaktualizuje obiekt span (i oczywiście komunikat dotyczący liczby znaków, które możemy jeszcze wpisać).

Mamy nadzieję, RB, że skrypt Ci się przyda i że dzięki niemu zjednam sobie wielu przyjaciół. W sumie to sprawdźmy czy już sobie kogoś nie zjednałem…

Hm…w następnym skrypcie spróbuję podlizać się trochę skuteczniej.

 Do początku strony Do początku strony

Centrum Skryptów - Systemy Operacyjny