wtorek, 18 lutego 2014
Autolosowanie w Foobarze
piątek, 14 grudnia 2012
Oracle Forms z Jawą 7 po ludzku działające
- W wypadku okienek i przeglądarki o tej samej ilości bitów uruchamiamy po prostu Panel Sterowania i z niego wybieramy aplet Java. W wypadku systemu 64 bitowego i 32 bitowej przeglądarki (czyli też 32 bitowej jawy) musimy przejść do podkatalogu bin instalacji naszego jre i uruchomić plik javacpl.exe.
- W uruchomionym oknie wybieramy zakładkę Java i przycisk View

-
Wybieramy interesującą nas instancję jawy i w pole Runtime Parameters dodajemy argument -Djava.vendor="Sun Microsystems Inc."

- Zatwierdzamy i cieszymy się.
niedziela, 14 października 2012
Gorącym klawiszem wprost w okienko, czyli modyfikowanie skrótów klawiszowych w Windows
- Żeby było mi wygodnie to wolę dostosować świat do siebie, niż siebie do świata.
- Przyzwyczajenie drugą naturą człowieka.
środa, 25 kwietnia 2012
Tłumne zgromadzenie inspiruje, czyli o lekko bajeranckim testowaniu krotek słów kilka
niedziela, 16 października 2011
Bajeranckie Speca dogadanie się w kwestii ValueRecordera
niedziela, 31 lipca 2011
Intellij Idea i niedziałające indeksowanie repozytoriów Mavena
- Ściągamy archiwum zip z indeksem dla tego repozytorium.
- W międzyczasie przechodzimy do katalogu katalog_domowy/.IntelliJIdea10/system/Maven/Indices i znajdujemy podkatalog, który odpowiada repozytorium centralnemu (najczęściej będzie to Index1), poprzez spojrzenie w pliki index.properties.
- Kasujemy ze znalezionego katalogu podkatalogi typu data0.
- Zawartość podkatalogu update zastępujemy zawartością ściągniętego archiwum.
- Uruchamiamy Ideę i wymuszamy reindeksowanie repozytorium.
- Cieszymy się po chwili zindeksowanymi danymi.
wtorek, 5 kwietnia 2011
Księżycowe zmiany zależne
org.seleniumhq.selenium selenium 2.0b3
org.seleniumhq.selenium selenium-remote-control 2.0b3
czwartek, 10 marca 2011
Czytelnika X wredna przypadłość
- Otwieramy sam program Adobe Reader X (czyli, nie próbujemy jednocześnie otworzyć jakiegokolwiek pdfa).
- Wybieramy menu Edycja|Preferencje (lub korzystamy ze skrótu CTRL-K)
- Z listy po lewej wybieramy Ogólne
- Odznaczamy znajdującą się na samym dole opcję Podczas uruchamiania włącz tryb chroniony
- Naciskamy OK i zamykamy czytelnika. Od następnego uruchomienia problemy powinny zniknąć.
wtorek, 1 lutego 2011
Wyraziste ekranów zrzucanie
wtorek, 11 stycznia 2011
Łubudubne osadzanie SQL Developer
niedziela, 21 listopada 2010
Siećkierowcy tempomatu ustawianie
wtorek, 10 sierpnia 2010
Bzycząco pozorowane obiektów wspaniałości.
ClassImplentingIface ciff = Mockito.mock(ClassImplentingIface.class);
Mockito.when(ciff.doSomething(3)).thenReturn("ReturnedValue");
assert "ReturnedValue" == ciff.doSomething(3);java.lang.NullPointerException at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) at com.blogspot.pacykarz.Testowa.test(Testowa.groovy:19)
//This working always:
Iface mockedIface = Mockito.mock(Iface.class);
Mockito.when(mockedIface.doSomething(Mockito.anyInt())).thenReturn("ReturnedValue");
assert "ReturnedValue" == mockedIface.doSomething(3);
Mockito.verify(mockedIface, Mockito.times(1)).doSomething(Mockito.anyInt());
//This not working with matchers
ClassNotImplentingIface mockedClass = Mockito.mock(ClassNotImplentingIface.class, Mockito.withSettings().extraInterfaces(GroovyInterceptable));
Mockito.when(mockedClass.doSomething(3)).thenReturn("ReturnedValue");
assert "ReturnedValue" == mockedClass.doSomething(3);
Mockito.verify(mockedClass, Mockito.times(1)).doSomething(3);
//This also not working with matchers, but also returns wrong verifications.
ClassNotImplentingIface spiedClass = Mockito.spy(new ClassNotImplentingIface());
Mockito.when(spiedClass.doSomething(3)).thenReturn("ReturnedValue");
assert "ReturnedValue" == spiedClass.doSomething(3);
//Be aware of given 4 times invocation instead of 1!
Mockito.verify(spiedClass, Mockito.times(4)).doSomething(3);
//This also not working with matchers and returns wrong verifications.
ClassNotImplentingIface mockedClass2 = Mockito.mock(ClassNotImplentingIface.class, new Answer() {
Object answer(InvocationOnMock invocationOnMock) {
if (invocationOnMock.getMethod().getName() ==~ /.*get.*MetaClass/) {
return invocationOnMock.callRealMethod();
} else {
return null; /* or other default answer*/
}
}
});
Mockito.when(mockedClass2.doSomething(3)).thenReturn("ReturnedValue");
assert "ReturnedValue" == mockedClass2.doSomething(3);
//Be aware of given 4 times invocation instead of 1!
Mockito.verify(mockedClass2, Mockito.times(4)).doSomething(3);
niedziela, 20 czerwca 2010
Małe Co Nieco dla ciała, coby przy komputerze nie paść z głodu
- 35-40 dag kleiku ryżowego
- 1 szklanka cukru
- 1 paczka margaryny
- 1 łyżeczka proszku do pieczenia
- 5 średnich jajek
- zapach kokosowy, ew. 10 dag wiórków kokosowych
- dżem do przybrania
- Kleik ryżowy, cukier, łyżeczkę proszku, zapach kokosowy, zmiękłą margarynę i żółtka ugnieść na kruszonkę.
- Białka utrzeć na pianę, którą następnie dodać do kruszonki i ugnieść na jednolitą masę.
- Z otrzymanej masy formować małe kulki (mniej więcej wielkości orzecha włoskiego).
- W kulkach wyrobić palcem dziurki na dżem i je wypełnić.
- Piec 30 minut w wygrzanym piekarniku (temperatura piekarnika 155° C).
niedziela, 21 marca 2010
Mleczka kauczukowego swojskie bajanie...
- Uruchamiamy program konfiguracyjny dla admina (Maintenance (Admin)|Settings)
- Przechodzimy na zakładkę Languages i zaznaczamy ptaszka przy opcji polish
- Następnie wybieramy zakładkę Packages i w drzewie dla gałęzi Language Support|Polish zaznaczamy pakiety polski oraz Polish hyphenation patterns
- Zatwierdzamy przyciskiem OK. Powinny dociągnąć się brakujące pakiety, a baza formatów zostanie przebudowana.
- Uruchamiamy program konfiguracyjny dla zwykłego użytkownika (Maintenance|Settings)
- Na zakładce General naciskamy przycisk Update Formats
- Zatwierdzamy przyciskiem OK
- W większości przypadków dokumenty z pakietem polski powinny się teraz grzecznie kompilować :)
piątek, 15 stycznia 2010
Zaćmione znikłe asystenty
Sława!
W trakcie moich skoków w bok, które opisuję w poprzednim wpisie, miałem okazję od lat niepamiętnych (czyt. czterech ;)) uruchomić świeżą, nieśmiganą instalację Eclipse, i nawet coś po próbować na szybko pokodować. No więc piszę jakiś szybki całkowicie przykładowy kod, bach CTRL+SPACE i... O! A to co takie fajne? W podpowiedziach na pierwszym miejscu wpis typu Anonymous Inner Type, który po wybraniu od razu tworzy zręb anonimowej klasy z metodami implementowanego interfejsu, żadnego Add unimplemented... nie trzeba bajka. Czemu nie mam w swoim "produkcyjnym" Eclipsie? Tylko podpowiedzi co do samych typów, choć wersja środowiska ta sama?
Rzut oka na "domyślną" konfigurację podpowiadacza (Content Assist) nie rozwiązała problemu, gdyż w "produkcyjnym" środowisku mam nawet trochę więcej i ogólnie, i pozaznaczanych elementów (z tych widocznych na obrazku, zaznaczone mam jeszcze Java Type Proposals).
Chcesz się droczyć? To się podroczymy. Trochę ponaciskania, powłączania tego i owego, jakieś Apply po drodze i... Tak! Tak! Zepsuło się, i nie ma już tej zabawki. Restore Defaults. Nie pomogło. Hmmm... Ki diabeł? W końcu wyłączenie wszystkich związanych z jawą podpowiadaczy, zatwierdzenie, powrót do opcji, zaznaczenie od nowa Java Proposals i Java Type Proposals, zatwierdzenie. Nazad do przykładu, trach klawisze, i są oba. No mordka sama się śmiać próbuje już, ale wrodzona marudność powstrzymuje ją od tego i rzecze - te, te, poczekaj na poważnym spróbujmy. No to spróbujemy to samo, i voila! Jest! Teraz się może mordka radować do woli.
Tak to kolejny plus wspominanego przeglądu wyszedł niczym szydło z worka. Możliwość ponoć od dawna w środowisku dostępna, a jakoś jak się zabunkrowała to skutecznie. Ciekawe co jeszcze mi się bumeluje...
środa, 9 września 2009
Antidotum na zatrucie Clupea harengus membras...
- Otwieramy edytor tekstowy, np. notatnik i wpisujemy: #sledzik_box{display:none;}
- Zapisujemy plik w dowolnej lokalizacji, o dowolnej nazwie, ale z rozszerzeniem .css (np. sledzikssie.css)
- Otwieramy Operę, wchodzimy na Naszą Klasę (wystarczy strona główna, bez logowania), klikamy prawym przyciskiem myszy i z menu wybieramy Preferencje dla witryny...
- Wybieramy zakładkę Wyświetlanie
- W polu Mój arkusz stylów podajemy ścieżkę do pliku stworzonego w punkcie 1.
- Naciskamy Ok, i po odświeżeniu strony śledzik nie powinien już się nam odbijać...
niedziela, 28 czerwca 2009
NSIS - Ekslibrisowa ekwilibrystyka czyli piszemy własną bibliotekę
Sława!
Dziś chciałbym jakże szanownym Czytelniczkom i Czytelnikom zaprezentować parę wskazówek jak pisać własne biblioteki/pliki nagłówkowe dla NSIS. Po cóż, a po coż to się męczyć z czymś takim? - zapyta ktoś bardziej marudny. Ha! Otóż marudo moja kochana, po piersze primo zawsze warto wydzielać sobie wieloużywalne kawałki własnego kodu, żeby potem nie wymyślać koła po raz kolejny. A po drugie primo, w wypadku NSISa główny plik projektu przy większej komplikacji ma tendencje do bardzo szybkiego rozrostu, toteż pogubienie się w kodzie jest tylko kwestią czasu. I właśnie aby czas ten wydłużyć warto jednak powydzielać sobie funkcję do bibliotek.
Od czego zacząć? Wydaje mi się, że od wydzielenia, przynajmniej koncepcyjnie, tego co chcemy sobie zamknąć w funkcję w ramach biblioteki (a może bibliotek), oraz wymyśleniu sobie nazw zarówno dla funkcji, jak i dla biblioteki. Należy pamiętać, że nie powinny być zbyt lakoniczne, ani też za długie, bo na dzień dzisiejszy narzędzia wspierające pisanie w NSIS nie podpowiadają składni zawartej w bibliotekach. Jeżeli już wymyśliliśmy sobie to i owo, możemy przystąpić do dzieła (a może nawet Dzieła).
Załóżmy, że nową bibliotekę nazwaliśmy sobie PNG (od Przebłysk Naszego Geniuszu) i zawierać będzię ona jedną funkcję o nazwie, jakżeby inaczej, Funkcja. Jedną bo ma posłużyć za przykład, kolejne sobie możemy dorobić już siłą rozpędu. Dodajmy także, że będziemy chcieli jej używać zarówno w instalatorach jak i deinstalatorach.
Zaczynamy więc od następujacego szkieletu:
!ifndef PNG !define PNG !verbose push !verbose 3 !ifndef PNG_DELIM !define PNG_DELIM '.' !endif !ifndef PNG_UN !define PNG_UN !endif #Includes !ifndef NFUPREFIX !include nfUtils.nsh !endif #Installer----------------------------------------------------------------------------------------- #Callers----------------------------------------- #Bodies------------------------------------------ #Unistaller---------------------------------------------------------------------------------------- #Callers----------------------------------------- #Bodies------------------------------------------ !verbose pop !endif
Gdzie, PNG_DELIM określa delimiter między nazwą biblioteki, a nazwą funckji - przyjąłem założenie, że używać będziemy ich w sposób podobny do nsArray, czyli poprzez zapis ${PNG.Funkcja}. Definicja PNG_UN jest podstawą pewnej sztuczki przy wspieraniu deinstalatorów, o czym później może parę słów (Ale niczego nie obiecuję). W sekcji #Includes dodajemy niezbędne polecenia include dołączające zewnętrzne biblioteki (np. LogicLib). Warto dołączać je tutaj, żeby być pewnym, że żadnej nie zabraknie. Włączona tu została biblioteka nfUtils, wspomagająca tworzenie własnych bibliotek. Wreszcie sekcje #Callers zawierać będą "wołacze" do funkcji, czyli to co umożliwi użycie wspomnianego zapisu ${PNG.Funkcja}, a #Bodies już właściwe ciała funkcji.
Uzupełnijmy więc te sekcje dla cześci "instalacyjnej":
#Callers-----------------------------------------
;Funkcja
;
;parametr
; parametr
;
;zwraca
; wynik
!macro PNG${PNG_DELIM}Funkcja_Call _parametr _wynik
Push ${_parametr}
Call PNG${PNG_DELIM}Funkcja
Pop ${_wynik}
!macroend
#Bodies------------------------------------------
!macro PNG${PNG_DELIM}Funkcja
!ifndef ${PNG_UN}PNG${PNG_DELIM}Funkcja
!define ${PNG_UN}PNG${PNG_DELIM}Funkcja '!insertmacro ${PNG_UN}PNG${PNG_DELIM}Funkcja_Call'
;$1 - wynik
;$0 - parametr
${nfu.Function} ${PNG_UN}PNG${PNG_DELIM}Funkcja in $0 out $1 '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''
# Ciało funkcji
${nfu.FunctionEnd}
!endif
!macroend
W ciale funkcji w $0 znajdzie się przekazywany parametr, natomiast zawartość $1 przy wyjściu z funkcji będzie umieszczona na stosie. Po zakończeniu funkcji wartości $0 i $1 będą takie same jak przed jej wykonaniem. Jeżeli chcemy używać w ciele innych zmiennych $0-9 należy samemu obsłużyć podobne zachowanie za pomocą operacji na stosie.
Zostało więc uzupełnienie sekcji dla deinstalatora, tu już chyba nie ma większej magii:
#Callers-----------------------------------------
!macro un.PNG${PNG_DELIM}Funkcja_Call _parametr _wynik
Push ${_parametr}
Call un.PNG${PNG_DELIM}Funkcja
Pop ${_wynik}
!macroend
#Bodies------------------------------------------
!macro un.PNG${PNG_DELIM}Funkcja
!undef ${PNG_UN}
!define ${PNG_UN} 'un.'
!insertmacro PNG${PNG_DELIM}Funkcja
!undef ${PNG_UN}
!define ${PNG_UN}
!macroendI to było by na tyle. Wnikliwsza analiza, wykaże, że cała zabawa polega na sprytnym wykorzystaniu poleceń preprocesora NSIS do wpływania na proces generowania "wynikowego" źródła do kompilacji, podkładając mu odpowiedni kod w miejsce używanych definicji. Dlatego też, możemy używać naszej biblioteki podobnie jak LogicLib czy nsArray poprzez ${PNG.Funkcja} 'parametr' $Wynik
czwartek, 2 kwietnia 2009
NSIS - obsługa różnych typów plików konfiguracyjnych
Sława!
Czasami zdarza się, że robiąc instalator do swojej aplikacji, chcemy jednocześnie zawrzeć w nim podstawową konfigurację swojego produktu tak, aby po procesie instalacji nadawał się on w większości przypadków już do użycia. Jeżeli dla tego produktu konfiguracja taka sprowadza się do wypełnienia dwóch, trzech pól i zapisania ich wartości w docelowym pliku, nie nastręcza to zbytnich trudności. Ot, wystarczy zrobić plik *.ini strony, skrobnąć funkcję obsługi i voila. Pikuś, morda, gitara gra. :)
Problemik (ale przecież, jak zawsze w naszym wypadku, tyci, tyciunki ;)) może się zacząć robić wtedy, kiedy tych produktów zaczyna być więcej, albo tych pól do konfiguracji zaczyna się mnożyć ponad jedną stronę, albo...
Wtedy przydałoby się oczywiście jakoś sobie pracę usprawnić. Jednym z możliwych rozwiązań, jest wykorzystanie do tego celu plików... *.ini. Otóż okazuje się, że każdy z elementów strony, jak i strona jako całość może mieć również właściwości niestandardowe, które można wykorzystać do przechowywania informacji potrzebnych dla naszych uniwersalnych funkcji/makr obsługujących konfigurację.
Załóżmy, że plik konfiguracyjny jest plikiem XML, wtedy do pól dodawać możemy informację o XPath skąd i gdzie potrzebujemy pobrać i zapisać wartości. W naszym pliku ini znaleźć się może więc coś takiego.
[Settings] NumFields=3 TargetFile=config.xml [Field 3] Type=GroupBox Left=3 Top=4 Right=145 Bottom=135 Text=Configuration [Field 1] Type=Label Left=9 Top=15 Right=110 Bottom=24 Text=SMTP server: [Field 2] Type=Text Left=9 Top=26 Right=141 Bottom=36 State=smtp.host MinLen=1 Flags= XPath=/mail-module/mail-sender/smtp-host
Natomiast kod odpowiedzialny za inicjalizowanie wyświetlania strony miałby postać mniej więcej taką:
${xml::LoadFile} '$TARGETDIR\$TARGETFILE' $0
${If} $0 == 0
ReadIniStr $NUMFIELDS $INIFILE "Settings" "NumFields"
${For} $R9 1 $NUMFIELDS
${xml::RootElement} $0 $1
ReadIniStr $XP $INIFILE 'Field $R9' 'XPath'
${If} $XP != ""
${xml::XPathNode} $XP $0
${If} $0 == 0
${xml::GetText} $1 $0
${EndIf}
${If} $0 == 0
WriteINIStr $INIFILE 'Field $R9' 'State' '$1'
${Else}
MessageBox MB_OK|MB_ICONEXCLAMATION 'Error during reading:$\r$\nFile: $TARGETDIR\$TARGETFILE$\r$\nXpath: $XP'
${EndIf}
${EndIf}
${Next}
InstallOptions::initDialog /NOUNLOAD $INIFILE
Pop $HWND
InstallOptions::show /NOUNLOAD
${Else}
MessageBox MB_OK "Can't find file: $TARGETDIR\$TARGETFILE"
Abort
${EndIf}Na analogicznej zasadzie konstruujemy funkcje zapisujące do pliku XML, używając mniej więcej czegoś takiego:
ReadIniStr $NUMFIELDS $INIFILE "Settings" "NumFields"
${For} $R9 1 $NUMFIELDS
ReadIniStr $XP $INIFILE 'Field $R9' 'XPath'
${If} $XP != ''
ReadIniStr $0 $INIFILE "Field $R9" "State"
${xml::RootElement} $1 $1
${xml::XPathNode} $XP $1
${xml::SetText} $0 $1
${xml::SaveFile} '$TARGETDIR\$TARGETFILE' $1
${EndIf}
${Next}Dzięki temu tworzenie kolejnych konfiguracji sprowadzi się jedynie do ustawienie odpowiednich wartości w plikach *.ini. Jeżeli jeszcze wydzielimy sobie wieloużywalny kod do plików nagłówkowych, tworzenie instalatorów na pęczki będzie niczym bułka z masłem na śniadanko. :)
środa, 18 lutego 2009
Zamieszczanie kodów źródłowych w bloggerze
Sława!
Próbując odrobinkę sobie "upiększyć" swoje wypociny natrafiłem byłem na następujący wpis How to display code (nicely) in Blogger posts, więc długo się nie zastanawiając postanowiłem wykorzystać znajdujący się tam przepis i dodać to cudo. Jak można zresztą zauważyć niżej, wyżej, gdziekolwiek obok :)
Oczywiście nie było tak pięknie jakby nie trzeba czegoś poprawić, inaczej będziemy mieli brzydkie, za duże odstępy między liniami, aby temu zapobiec wszędzie zamiast:
<LINK href="http://alexgorbatchev.com/pub/sh/2.0.278/...">
wpisujemy łącza do nowszej wersji podświetlacza:
<LINK href="http://alexgorbatchev.com/pub/sh/2.0.287/...">
Mamy więc możliwość wstawiania teraz takich choćby o to cosiów:
private class SampleCode {
System.out.println("Kod w (pseudo)Java");
}Co poza tym można uzyskać, i w jaki sposób, można się dowiedzieć ze strony projektu SyntaxHighlighter gdzie serdecznie odsyłam
niedziela, 15 lutego 2009
NSIS i usługi Windows
Sława!
Dziś w ramach akcji ratowania doświadczenia przed sklerozą własną, zapiszę sobie jak z poziomu NSIS (podbudowa do tworzenia instalatorów dla aplikacji Windows), a nóż widelec i potomność będzie miała z tej notatki pożytek jakowyś.
Takowoż więc do obsługi usług potrzebujemy wtyczki Service Control Management (nsSCM). Wtyczka ta umożliwia na następujące operacje na usługach:
- Install - zarejstrowanie usługi
- Start - uruchomienie usługi
- Stop - zatrzymanie usługi
- QueryStatus - odpytanie o aktualny stan usługi
- Remove - wyrejestrowanie usługi
Używanie jest banalnie proste, gdyż poza rejestrowaniem usługi, sprowadza się do wywołania odpowiedniej funkcji wtyczki z podaniem nazwy usługi, a następnie zczytania wyniku operacji. Jakiś przykład? Proszę bardzo, niech będzie nim wyłączenie/włączenie usługi w zależności od jej aktualnego stanu.
Zaczniemy od odpytania o stan usługi poleceniem:
nsSCM::QueryStatus /NOUNLOAD nazwa_usługi
Polecenie to, oprócz informacji o powodzeniu/błędzie wywołania, zwróci nam stan usługi. Możliwe wartości to:
- 1 - usługa zatrzymana
- 2 - usługa w trakcie uruchamiania
- 3 - usługa w trakcie zatrzymywania
- 4 - usługa uruchomiona
- 5 - usługa w trakcie wznawiania
- 6 - usługa w trakcie wstrzymywania
- 7 - usługa wstrzymana
Załóżmy, że będziemy uruchamiać usługę, jeżeli jest zatrzymana lub wstrzymana, natomiast zatrzymywać jeżeli uruchomiona, pozastałe stany poprostu zignorujemy. Do zatrzymania usługi wykorzystamy kod:
nsSCM::Stop nazwa_usługi
Do uruchomienia natomiast:
nsSCM::Start nazwa_usługi
Tak więc nasz kod powinien uzyskać postać podobną do poniższej:
nsSCM::QueryStatus nazwa_usługi Pop $0Widzimy, więc, że usługi nie gryzą (przynajmniej nie za często ;)) i zostało nam tylko napisać aplikację, dzięki której możliwości nsSCM będziemy mogli wykorzystać, a to przecież dla nas pryszcz, co nie? ;)
${If} $0 == "success" Pop $1 ${Switch} $1 ;Usługa jest zatrzymana ${Case} 1 ;Usługa jest wstrzymana ${Case} 7 ;Uruchamiamy usługę nsSCM::Start <nazwa_usługi> Pop $2 ${If} $2 == "success" MessageBox MB_OK "Usługa uruchomiona" ${Else} MessageBox MB_ICONEXCLAMATION|MB_OK "Błąd uruchamiania" ${EndIf} ${Break} ;Usługa jest uruchomiona ${Case} 4 ;Wstrzymujemy usługę nsSCM::Stop <nazwa_usługi> Pop $2 ${If} $2 == "success" MessageBox MB_OK "Usługa zatrzymana" ${Else} MessageBox MB_ICONEXCLAMATION|MB_OK "Błąd zatrzymywania" ${EndIf} ${Break} ${EndSwitch} ${EndIf}






