Centrum skryptów - Systemy operacyjne

Jak odczytywać pojedyncze linie z wieloliniowego pola tekstowego?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

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 odczytywać pojedyncze linie z wieloliniowego pola tekstowego?

Cześć Skrypciarze! Pytanie

Cześć Skrypciarze! Jak w programie HTA odczytywać pojedyncze linie z wieloliniowego pola tekstowego?

-- KM

Cześć Skrypciarze! Odpowiedź

Hej, KM. Żeby być w pełni uczciwym trzeba powiedzieć, że Skrypciarz, który napisał tę rubrykę, zawsze z pełnym niechęci podziwem patrzył na ludzi, którzy mimo iż robili całkowicie absurdalne rzeczy, to zawsze potrafili tak wymanewrować, że uchodziło im to całkowicie na sucho. Na przykład w ciągu kilku ostatnich tygodni gros spamu jaki trafił do jego skrzynki to były wiadomości "tajne łamane przez poufne", pochodzące od dyrektora pewnej firmy. Oczywiście te emaile nie były przeznaczone dla Skrypciarza będącego autorem tej rubryki, lecz przez nieuwagę zaadresowane do niego, zamiast do kolegi z firmy owego dyrektora. (Czy Tobie też często się to zdarza, że siedzisz i piszesz adres kenmyer@fabrikam.com, a w efekcie okazuje się, że wpisałeś pilar.ackerman@contoso.org?)

Jak się okazało, zamiarem autora wszystkich tych "tajnych łamanych przez poufne" wiadomości było zawiadomienie swoich kolesi o możliwości dokonania niewiarygodnych transakcji, gdyż na skutek: wykupu kredytowanego/dramatycznego przełomu/kontraktu rządowego akcje pewnej firmy o której nikt przedtem nie słyszał, spadły na łeb na szyję. A teraz Ty dostałeś od losu tę niesamowitą okazję. Wszystko co musisz zrobić to kupić akcje, siedzieć na tyłku i czekać na kasę. Ale masz szczęście, że dyrektor nie wiedział jak używać emaila, co?

Uwaga. Dość ciekawe jest to, że wszystkie emaile tego dyrektora miały taki temat: sposób_na_zostanie_luzakiem. Leczy być może jest tak, że jeśli jesteś dyrektorem jakieś dużej firmy, to znasz sposób na zostanie luzakiem.

Najlepsze jest to, że firma wymieniona w emailu istnieje naprawdę, a jej akcje są wyceniane bardzo nisko. Wydawać by się mogło, że spamer sam nabył pakiet akcji tej firmy i próbuje zwabić możliwie jak najwięcej osób, którzy również kupią jej akcje. W efekcie cena akcji pójdzie w górę, spamer sprzeda swoje udziały, a tę samą historię powtórzy z inną firmą. Jednak de facto nie wiemy czy rzeczywiście o to chodzi. Być może sposob_na_zostanie_luzakiem rzeczywiście jest dziełem dyrektora pewnej firmy. Lecz brzmi to jak doskonała metoda kantowania ludzi. (Hmmm... wyobraź sobie, że ktoś opatentował ten sposób...). Wprawdzie trudno w to uwierzyć, że tajne i poufne zapiski dyrektora zostały przez przypadek pewnego dnia rozesłane emailem. Lecz trzeba sobie jasno powiedzieć, że jeśli kiedykolwiek widziałeś osoby kierujące dużymi firmami, to... hmmm.

W każdym razie wszystko to brzmi dziwnie, lecz widocznie działa i to działa całkiem nieźle.

Wracając do tematu, my Skrypciarze dobrze wiemy o tym, że nie ma możliwości odczytania poszczególnych linii z wieloliniowego pola tekstowego. Jednakże - i proszę zatrzymaj tę informację dla siebie jako nasz wspólny sekret - tak się składa, że wiemy w jaki sposób uzyskać ten sam efekt. Tak między nami, możesz rozważyć zakup akcji aplikacji HTML (HTA); kiedy choć słowo z tej rubryki zostanie ujawnione, ilość ludzi piszących aplikacje HTA osiągnie poziom wieżowca (co oznacza, że możesz również śmiało zainwestować w akcje firm budujących wieżowce):

<SCRIPT LANGUAGE="VBScript">



Sub TestSub

    strText = MojePoleTekstowe.Value

    arrLines = Split(strText, vbCrLf)

    For Each strLine in arrLines

        Msgbox strLine

    Next

End Sub



</SCRIPT>



<body>

    <textarea name="MojePoleTekstowe" rows=5 cols=70></textarea><p>

    <input type="button" value="Uruchom skrypt" onClick="TestSub">

</body>

Jak widzisz (widzisz to tylko Ty; pamiętaj, że to tajne oraz poufne) jest to bardzo prosty program HTA, składający się głównie z wieloliniowego pola tekstowego o nazwie MojePoleTekstowe oraz przycisku o nazwie Uruchom skrypt. Zamysł jest taki, że wpisujesz jakiś tekst do pola tekstowego i następnie klikasz przycisk. Kliknięcie przycisku uruchamia procedurę o nazwie TestSub. Z kolei ta procedura zwraca i wyświetla każdą pojedynczą linię z pola tekstowego.

Przy okazji można wspomnieć, że znaczniki HTML, które tutaj występują powodują wstawienie do programu HTA pola tekstowego (o wysokości 5-ciu wierszy i szerokości 60-ciu kolumn) oraz jednego przycisku:

<textarea name="MojePoleTekstowe" rows=5 cols=70></textarea><p>

<input type="button" value="Uruchom skrypt" onClick="TestSub">

No i co z tego? Cóż, masz rację: powiedzieliśmy że nie ma możliwości odczytania poszczególnych linii z wieloliniowego pola tekstowego, nieprawdaż? I to jest prawda, takiej możliwości nie ma. Czyżby zatem było to małe oszustwo? Zakładamy, że po wpisaniu informacji do jednej linii pola tekstowego nacisnąłeś ENTER, żeby przejść do linii następnej. Innymi słowy, w rzeczywistości wpisywałeś listę informacji, czyli coś w stylu kolejnych akapitów. Na przykład każda linia w Twoim polu tekstowym może zawierać imię i nazwisko użytkownika:

Ken Myer

Pilar Ackerman

Jonathan Haas

Jeśli to prawda, to wyodrębniamy poszczególne linie (to jest poszczególne osoby) używając poniższej procedury:

Sub TestSub

    strText = MojePoleTekstowe.Value

    arrLines = Split(strText, vbCrLf)

    For Each strLine in arrLines

        Msgbox strLine

    Next

End Sub

Jak widać najpierw pobraliśmy cały tekst do pola tekstowego i wrzuciliśmy go do zmiennej o nazwie strText. Oto linia kodu, która za to odpowiada:

strText = MojePoleTekstowe.Value

Po wykonaniu tego zadania, użyliśmy funkcji VBScript o nazwie Split do przekształcenia danych znajdujących się w zmiennej strText w tablicę, którą nazwaliśmy arrLines:

arrLines = Split(strText, vbCrLf)

Jak widzisz do funkcji Split przekazaliśmy dwa argumenty: wartość, którą chcesz przekształcić w tablicę oraz znak, który pełni rolę "rozdzielacza" (czyli musimy zastanowić się, jakiego znaku chcemy użyć do oddzielenia końca jednego elementu tablicy od początku następnego). Ponieważ po wpisaniu każdej linii nacisnęliśmy klawisz ENTER, chcemy aby znak podziału linii był znakiem podziału elementów tablicy, a by zapisać taki znak podziału możemy użyć stałej VBScript vbCrLf.

Co zatem osiągneliśmy? Otrzymaliśmy tablicę o nazwie arrLines, składającą się z następujących elementów:

Ken Myer

Pilar Ackerman

Jonathan Haas

No i masz absolutną rację: to jest tablica, której każdy element reprezentuje pojedynczą linię z pola tekstowego.

W tym momencie możesz zrobić z tą informacją co tylko zechcesz. Aby coś w ogóle z nią zrobić, wrzuciliśmy ją do pętli For Each i wyświetliliśmy poszczególne linie z pola tekstowego:

For Each strLine in arrLines

    Msgbox strLine

Next

Zakładamy jednak, że Ty wymyślisz coś bardziej ekscytującego i użytecznego.

Nawiasem mówiąc pętli For Each potrzebujesz tylko wówczas, gdy chcesz odczytać każdą linię z pola tekstowego. A co musiałbyś zrobić, gdybyś chciał odczytać na przykład tylko linię numer 2? To żaden problem. W końcu każda linia jest tylko elementem tablicy. Aby zatem pobrać wartość żądanego elementu, musisz odwołać się do odpowiedniego indeksu tablicy. Ponieważ pierwszy element w tablicy ma indeks 0, to drugi element (druga linia) będzie miała indeks 1. Ten pojedynczy wiersz kodu wyświetla na ekranie drugą linię z pola tekstowego:

Msgbox arrLines(1)

Ale jeszcze raz przypominamy, abyś pamiętał, że wszystko to zadziała tylko wówczas, gdy po każdej linii wpisanej do pola tekstowego naciśniesz klawisz ENTER. Przypuśćmy jednak, że tak nie zrobiłeś i wpisany przez Ciebie akapit wygląda tak:

To jest akapit wpisany do pola tekstowego. Ale zamiast nacisnąć ENTER po

każdej linii pozwalamy, żeby tekst sam się zawinął. A to oznacza, że w takim

polu tekstowym w rzeczywistości jest tylko jedna linia.

Jeśli teraz po wyświetleniu strony naciśniesz przycisk Uruchom skrypt procedura wyświetli po prostu cały akapit. Dzieje się tak dlatego, że procedura widzi tutaj tylko i wyłącznie jedną linię tekstu. Czy zatem istnieje jakiś sposób przetworzenia każdej linii z pola tekstowego bez używania klawisza ENTER? Cóż, nie możemy stwierdzić ze stuprocentową pewnością, że nie można tego zrobić. Lecz z praktycznego punktu widzenia trzeba powiedzieć, że nie da się tego zrobić.

Dlaczego nie? Cóż, z jednej strony przypuśćmy, że masz pole tekstowe, które rozszerza się wraz z rozszerzaniem okna aplikacji HTA. W takim przypadku zawartość każdej "linii" będzie się zmianiała w zależności od szerokości pola tekstowego. Oczywiście nawet w takim przypadku sztuczka ze stałą vbCrLf będzie wciąż działać, ponieważ dzielimy linie w miejscu naciśnięcia klawisza ENTER, bez względu na to ile linii pojawi się w polu tekstowym.

W każdym razie nie ma tutaj idealnego rozwiązania, jednak mamy nadzieję, że pomogliśmy Ci KM. Tymczasem teraz, gdy ludzie już wiedzą jak odczytywać poszczególne linie z pola tekstowego, Skrypciarz który napisał tę rubrykę, zamierza siedzieć na tyłku i czekać na masowo napływającą kasę.

Uwaga. Cóż, nie ma on całkowitej pewności co do tego w jaki sposób zdobyć te pieniądze. Czy uważasz więc, że powinien pomyśleć o tym zanim napisał tę rubrykę i spróbować takiego małego przekrętu jak ten tutaj?
 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne