Centrum skryptów - Systemy operacyjne

Jak utworzyć niestandardowe pole dialogowe?

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 utworzyć niestandardowe pole dialogowe?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak utworzyć niestandardowe pole dialogowe, które udostępnia użytkownikowi dwie opcje, a po wybraniu jednej z nich uruchamia odpowiedni podprogram, w zależności od dokonanego wyboru?

-- AM

Cześć Skrypciarze! Odpowiedź

Cześć, AM! Dziś zaskoczę Ciebie i wszystkich, ponieważ po upomnieniu otrzymanym przez Skrypciarską Panią Redaktor niniejszym przeprowadzam dzisiaj strajk anegdotowy. Pewien jestem, ze się z tym nie zgodzicie, ale według wyżej wspomnianej osoby moje dygresje są stanowczo za długie i mogą irytować czytelników. Niewiarygodne, prawda? Dzisiaj zatem ogłaszam strajk (słyszałem, że strajki, choć nieskuteczne, są dość popularne, szczególnie za Atlantykiem)! (Oczywiście czekam na protesty z Waszej strony...)

Anegdoty anegdotami (nie wiecie nawet, ile dzisiaj ich tracicie), a skrypt skryptem i pisze się go równie przyjemnie jak anegdoty, więc doprawdy – skrypt będzie dzisiaj długi. A czego ma dotyczyć? Rzecz jasna tworzenia niestandardowych pól dialogowych, które dają użytkownikowi dwie opcje, po czym (w zależności od wybranej opcji) uruchamiają odpowiedni podprogram:

Set objExplorer = CreateObject("InternetExplorer.Application")



objExplorer.Navigate "c:\scripts\test.htm"

objExplorer.ToolBar = 0

objExplorer.StatusBar = 0

objExplorer.Width = 400

objExplorer.Height = 250

objExplorer.Visible = 1



Do While (objExplorer.Document.All.ButtonClicked.Value = "")

    Wscript.Sleep 250

Loop



strSelection = objExplorer.Document.All.ButtonClicked.Value



objExplorer.Quit



Wscript.Sleep 250



Select Case strSelection

    Case "Option 1" 

        Wscript.Echo "You selected Option 1."

    Case "Option 2" 

        Wscript.Echo "You selected Option 2."

    Case "Option 3" 

        Wscript.Echo "You selected Option 3."

    Case "Cancelled"

        Wscript.Quit

End Select

Za sekundę wytłumaczę jak działa powyższy przydługi skrypt, ale najpierw kilka istotnych (i relewantnych, dziś tylko relewantnie!) informacji. Po pierwsze, ani VBScript, ani Windows Script Host nie ma wbudowanej metody do tworzenia okien dialogowych. Można w pewnym sensie tworzyć w nich niestandardowe pola wiadomości, ale wtedy mamy do dyspozycji ograniczoną liczbę przycisków (j.ang.). Dlatego też musimy uciec się do pewnego oszustwa. Należy utworzyć plik HTML, który będzie wyświetlał dwie opcje, dzięki czemu nasz skrypt będzie przywoływał plik HTML, a nie niestandardowe okno dialogowe. Właśnie temu służy poniższy wiersz kodu:

objExplorer.Navigate "c:\scripts\test.htm"

Więcej o tym za czas jakiś. Teraz przyjrzyjmy się naszemu plikowi HTML (C:\Scripts\Test.htm):

<SCRIPT language="VBScript">

    Sub OKClicked

        If UserOption(0).Checked Then

            ButtonClicked.Value = "Option 1"

        End If

        If UserOption(1).Checked Then

            ButtonClicked.Value = "Option 2"

        End If

        If UserOption(2).Checked Then

            ButtonClicked.Value = "Option 3"

        End If

    End Sub



    Sub CancelClicked

        ButtonClicked.Value = "Cancelled"

    End Sub

</SCRIPT>



<BODY>

    <input type="radio" name="UserOption" checked=True>Option 1<BR>

    <input type="radio" name="UserOption">Option 2<BR>

    <input type="radio" name="UserOption">Option 3<P>

    <input type="Button" value="OK" onClick="OKClicked">

    <input type="Button" value="Cancel" onClick="CancelClicked">

    <input type="hidden" name="ButtonClicked">

</BODY>

Mamy tutaj plik HTML wyświetlający trzy przyciski opcji. Służą do tego poniższe trzy tagi:

<input type="radio" name="UserOption">Option 1<BR>

<input type="radio" name="UserOption">Option 2<BR>

<input type="radio" name="UserOption">Option 3<P>

Jeżeli się zastanawiacie, czemu zdecydowaliśmy się na przyciski opcji, to odpowiedź jest prosta – daje nam to więcej możliwości (interfejs z dodatkowymi przyciskami opcji jest bardziej przejrzysty od interfejsu z wieloma przyciskami polecenia). Potrzebujecie tylko dwóch opcji? W takim wypadku usuńcie tag odpowiadający trzeciemu przyciskowi opcji (oznaczony Option 3). Co, jeżeli potrzebujecie czterech opcji? Zgadza się, kopiujecie tag dla trzeciej opcji, wklejacie go pod spodem, tylko zastępujecie liczbę 3 liczbą 4 (czyli zamieniamy Option 3 na Option 4). Łatwizna, no nie?

Uwaga: Jeżeli nie macie dużego doświadczenia w posługiwaniu się językiem HTML, wiele relewantnych i fachowych porad znajdziecie w HTA Developers Center (j.ang.).

Oprócz przycisków opcji, mamy tu jeszcze dwa stare, dobre zwykłe przyciski, czyli OK oraz Cancel:

<input type="Button" value="OK" onClick="OKClicked">

<input type="Button" value="Cancel" onClick="CancelClicked">

Jeżeli klikniemy przycisk OK, uruchomimy podprogram o nazwie OKClicked; jeżeli zaś (przewrotnie!) klikniemy na przycisk Cancel, uruchomimy odpowiednio podprogram o nazwie CancelClicked. Zaraz je omówimy dokładniej.

Zanim jednak przejdziemy do tego (tak, dziś relewantnie, acz chaotycznie), musimy poświęcić chwilę poniższemu wierszowi kodu:

<input type="hidden" name="ButtonClicked">

Dodajemy tutaj do naszej strony HTML ukryty formant, który nie będzie widoczny na ekranie, będzie mu można będzie jednak nadać wartość. Po co nam taki ukryty formant? Z technicznego punktu widzenia wcale nie jest nam potrzebny, użyliśmy jednak niestandardowego podejścia w celu rozwiązania zagadki zadanej przez AM, a ukryty formant bardzo nam rozwiązanie tej zagadki ułatwia. Nie ma on żadnej wartości, a nasz skrypt raz na jakiś czas sprawdza jego wartość. Jeżeli więc przypiszemy mu jakąś wartość, skrypt będzie wiedział, że dokonaliśmy wyboru w oknie dialogowym i będzie postępował w zależności od tego wyboru.

To oczywiście również wytłumaczę za czas jakiś.

Załóżmy, ze użytkownik uruchomił nasz skrypt, a na ekranie pojawiło się okno dialogowe. Wybrał następnie jeden z przycisków opcji, dajmy na to przycisk OK. Co się teraz dzieje?

Jak juz wspomnieliśmy powyżej, naciśnięcie OK uruchamia podprogram OKClicked. Wewnątrz tego podprogramu uruchamiamy serię twierdzeń If Then, które określają, jaki przycisk został wybrany:

If UserOption(0).Checked Then

    ButtonClicked.Value = "Option 1"

End If

Już wyjaśniamy, jak to działa. Przyciski opcji maja tę samą nazwę (UserOption); to zapewnia, że przyciski działają razem jako grupa. Każdemu automatycznie odpowiada jakiś numer porządkowy, pierwszy przycisk to 0, drugi to 1 itd. Instrukcję zawartą w tym fragmencie można przełożyć na ludzki język tak: jeśli pierwszy przycisk został zaznaczony, przypisz Option 1 do wartości naszego ukrytego formantu (ButtonClicked). Następnie zastosujemy taki sam fragment kodu do każdej opcji wyboru

Co się stanie, jeżeli użytkownik wybierze przycisk Cancel? W takim wypadku korzystamy z innego podprogramu (CancelClicked), a ukrytemu formantowi przypisujemy wartość Cancelled:

Sub CancelClicked

    ButtonClicked.Value = "Cancelled"

End Sub

To na tyle, jeżeli chodzi o plik HTML. Teraz przejdźmy (w końcu!) do skryptu. Zaczyna się on od utworzenia obiektu InternetExplorer.Application:

Set objExplorer = CreateObject("InternetExplorer.Application")

<p>Po utworzeniu wystąpienia programu Internet Explorer, korzystając z metody <strong>Navigate</strong>, otwieramy plik C:\Scripts\Test.htm; konfigurujemy rozmiar okna w programie Internet Explorer (ukrywszy pasek narzędzi oraz pasek stanu); następnie, ustawiając właściwość <strong>Visible</strong> na 1, powodujemy, że wszystko pojawia się nam na ekranie:</p>

objExplorer.Navigate "c:\scripts\test.htm"

objExplorer.ToolBar = 0

objExplorer.StatusBar = 0

objExplorer.Width = 400

objExplorer.Height = 250

objExplorer.Visible = 1

Teraz bierzemy się porządnie do roboty. Najpierw musimy sprawić, by skrypt wstrzymywał działanie, dopóki użytkownik nie dokona wyboru w pliku HTML. Pamiętając o tym, używamy poniższego wiersza kodu, by sprawdzać wartość formantu ButtonClicked:

Do While (objExplorer.Document.All.ButtonClicked.Value = "")

    Wscript.Sleep 250

Loop

Jeżeli przycisk ButtonClicked nie ma wartości (t.j. jego wartość równa jest „”, czyli pustemu ciągowi znaków), wstrzymujemy skrypt na 250 milisekund i próbujemy znowu. Tak dzieje się do momentu, kiedy ktoś w końcu naciśnie przycisk OK lub Cancel.

Uwaga: Co się stanie, jeśli użytkownik po prostu zamknie okno programu Internet Explorer? Spowoduje to błąd i zakończy działanie skryptu. Jeżeli chcecie, żeby nasz skrypt kończył się w bardziej profesjonalny sposób, warto zawrzeć w nim obsługę błędów. Ale za dużo tego chyba jak na jeden dzień...

W momencie, kiedy wartość formantu ButtonClicked się zmieni, przechowujemy ją w zmiennej strSelection i wywołując metodę Quit zamykamy wystąpienie obiektu Internet Explorer:

strSelection = objExplorer.Document.All.ButtonClicked.Value



objExplorer.Quit

Teraz czekamy 250 milisekund (dając tym samym czas programowi Internet Explorer na spokojne zamknięcie), a następnie za pomocą następującego bloku Select Case podejmujemy akcję zależną od wyboru użytkownika:

Select Case strSelection

    Case "Option 1" 

        Wscript.Echo "You selected Option 1."

    Case "Option 2" 

        Wscript.Echo "You selected Option 2."

    Case "Option 3" 

        Wscript.Echo "You selected Option 3."

    Case "Cancelled"

        Wscript.Quit

End Select

Nasze poczynania w powyższym skrypcie nie są wprawdzie ani ekscytujące, ani nawet ciekawe, ale kod użyty w przykładzie można zamienić na cokolwiek nam się żywnie podoba.

Voila, AM! Z całym tym obchodzeniem nasze rozwiązanie nie jest może tak eleganckie, jak utworzenie prawdziwego niestandardowego pola dialogowego, ale działa, a to się liczy!

Mam nadzieję, że wszystko, co napisałem, AM, odpowiada tylko i wyłącznie na Twoje pytanie i że nie znalazła się tam żadna inna informacja (a już broń Boże dowcipna!), którą musiałbyś sobie zaprzątać głowę. Myślę, ze osiągnąłem duży postęp, w następnym artykule postaram się dodatkowo nie używać pytań retorycznych...

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne