Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Problem] Problem z pętlą


.old

Rekomendowane odpowiedzi

Opublikowano

Siema. Robię programik i niestety, ale natknąłem się na pewien problem. Zrobiłem GUI i w nim są checkboxy. Zaczynam dopiero przypisywać pod nie funkcje więc na razie zrobiłem tylko pod pierwszy checkbox. Mniej więcej tak przypisuje funkcje chackboxowi:

 

Case $msg = $checkbox1

While 1

..mój kod..

WEnd

 

Tych checkboxów mam 20 i gdy wybiorę inny, to program nadal robi to, co jest przypisane $checkbox1, czyli ..mój kod.. :/ Mi chodzi o to, że jeżeli zaznaczę np. checkbox 1 to kod przypisywany checkbox 1 będzie cały czas działać (jak while 1) a gdy wybiorę np. checkbox nr. 17 to wtedy ten checkbox 1 zatrzymuje się i zaczyna działać ten checkbox 17. I potem zaznaczam np. 14 i "wyłącza się" checkbox 17 a włącza się 14 itp. Nie wiem jak to zrobić dlatego potrzebuje pomocy :P

Od dnia 1.11.2013r. 14:17 zobaczono moje posty licznik-56-90712-stat.png razy ;)


 


 

Opublikowano

Użyj guiCtrlCreateRadio i w pętli daj if guiCtrlRead( $radio ) Then.

WSZYSTKIE PLIKI W CHMURZE DLA MPCFORUM ZOSTAŁY USUNIĘTE. NIE KORZYSTAĆ Z MOICH PROGRAMÓW.

Proszę nie ingerować w moje posty/tematy, w razie potrzeby usunąć całą zawartość. Nie pomagam.

Opublikowano

@UP: Zmieniłem i teraz wyskakuje mi błąd "Variable used without being declared." i pokazało, że błąd jest w $radio [if GUICtrlRead($radio) Then].

 

Jak coś mam 20 checkboxów i każdy ma inną cyfrę (bo będę pod nie robić każdy Case z osobna) $checkbox[cyfra] np. $checkbox1 = GUICtrl..

Od dnia 1.11.2013r. 14:17 zobaczono moje posty licznik-56-90712-stat.png razy ;)


 


 

Opublikowano

... Zamiast checkboxów zrób radio. Radio to wybór JEDNEJ opcji, a checkbox wielu.

 

Zamień guiCtrlCreateCheckbox na guiCtrlCreateRadio i potem pod GUI, w loopie, pod switchem (usuń tamto case z checkboxem) dodaj coś takiego:

if guiCtrlRead( $radio1 ) Then

cos tam cos tam

elseif guiCtrlRead( $radio2 ) Then

cos tam cos tam

endIf

WSZYSTKIE PLIKI W CHMURZE DLA MPCFORUM ZOSTAŁY USUNIĘTE. NIE KORZYSTAĆ Z MOICH PROGRAMÓW.

Proszę nie ingerować w moje posty/tematy, w razie potrzeby usunąć całą zawartość. Nie pomagam.

Opublikowano

Ups.. Jednak od początku miałem tam GUICtrlCreateRadio ^_^ Nie o to mi chodziło ponieważ mój kod gdy wkleję go pod case wymaga pętli. Bez pętli po prostu zwyczajnie nic się nie dzieje. Zrobiłem to tak jak napisałeś i działa to jakby nie było pętli.

 

Oto wycinek jednego z Case:

 

Case $msg = $radio1
While 1
Sleep(120)
If _IsPressed(54, $DLL) Then
Sleep(50)
Send("tekst")
EndIf
WEnd

 

I każdy inny case, który stworze to po prostu inny tekst w
Send. w/w kod wymaga pętli niestety i przez tą pętle reszta programu
"laguje się" a wykonywana jest tylko pętla. A mi chodzi, że jak zaznaczę
GUICtrlCreateRadio, to wtedy działa to jak powinno a gdy zaznaczę inny GUICtrlCreateRadio to wykona się przypisany mu skrypt.

Od dnia 1.11.2013r. 14:17 zobaczono moje posty licznik-56-90712-stat.png razy ;)


 


 

Opublikowano

Mówiłem, żebyś nie używał case dla radio.

 

while 1
    guigetmsg..
    switch..
        case..
    endswitch


    if guiCtrlRead( $radio1 ) Then
        while guiCtrlRead( $radio1 )
            ...
            send( "shiet" )
            ...
        wEnd
    elseif guiCtrlRead( $radio2 ) Then
        while...


    endIf
wend
 

 

WSZYSTKIE PLIKI W CHMURZE DLA MPCFORUM ZOSTAŁY USUNIĘTE. NIE KORZYSTAĆ Z MOICH PROGRAMÓW.

Proszę nie ingerować w moje posty/tematy, w razie potrzeby usunąć całą zawartość. Nie pomagam.

Opublikowano

Zrobiłem to tak teraz:

 

	If GUICtrlRead($radio1) Then
			While GUICtrlRead($radio1)
		Sleep(120)
		If _IsPressed(54, $DLL) Then
		Sleep(50)
		Send("tekst1")
		EndIf
			WEnd
	
	ElseIf GUICtrlRead($radio2) Then
			While GUICtrlRead($radio2)
		Sleep(120)
		If _IsPressed(54, $DLL) Then
		Sleep(50)
		Send("tekst2")
		EndIf
			WEnd
    EndIf

I gdy nawet nie zaznaczę żadnego radio, to wpisuje się tekst "tekst1". Gdy zaznaczę inne radio, to też bez zmian chociaż przypisałem również pod niego. A może znów błąd mam? I jak coś jeszcze w tym kodzie co podałem jest While 1

Od dnia 1.11.2013r. 14:17 zobaczono moje posty licznik-56-90712-stat.png razy ;)


 


 

Opublikowano

Zamień: GUICtrlRead
Na:_IsChecked
I dodaj gdzieś niżej:

 

Func _IsChecked($control)
    return BitAND(GUICtrlRead($control), $GUI_CHECKED) = $GUI_CHECKED
EndFunc
 

WSZYSTKIE PLIKI W CHMURZE DLA MPCFORUM ZOSTAŁY USUNIĘTE. NIE KORZYSTAĆ Z MOICH PROGRAMÓW.

Proszę nie ingerować w moje posty/tematy, w razie potrzeby usunąć całą zawartość. Nie pomagam.

Opublikowano

Teraz działa ^_^ Wielkie THX !!! Zrobiłem to pod wszystkie radia i wszystko poprawnie działa :) Tematu proszę jeszcze nie zamykać ponieważ nigdy nie wiadomo czy w późniejszym czasie z czymś sobie nie poradzę B)

Od dnia 1.11.2013r. 14:17 zobaczono moje posty licznik-56-90712-stat.png razy ;)


 


 

Opublikowano

Pojawił się kolejny problem :/ Wszystko w programie już fajnie działa (po mojej myśli) ale:

 

Gdy zaznaczę jakiś checkbox, to wtedy cały program "laguje się" tzn. Zaznaczę checkbox i nic poza zaznaczeniem kolejnego checkboxa nic nie mogę zrobić. Chciałbym, aby program działał przez cały czas, a nie jeśli zaznaczę jakiś checkbox to muszę wyłączać go przez Menedżer zadań :C

Od dnia 1.11.2013r. 14:17 zobaczono moje posty licznik-56-90712-stat.png razy ;)


 


 

Opublikowano

Nie wiem jak teraz wygląda twój kod ale może to być spowodowane tym że program nie wraca do podstawowej pętli = ten który obsługuje buttony,checkboxy i przycisk wyjścia. Lub zapętla się gdzieś.

1387536187-U112334.png

Jeśli Ci pomogłem mógłbyś wynagrodzić lajkiem :)

Opublikowano

@UP: Z pewnością dlatego. Wiesz może jak zrobić by skrypt wracał do tej podstawowej pętli? Może bardziej to opisze:

 

Gdy zaznaczę checkbox, a jego kod to:

 

	If _IsChecked($radio1) Then
			While GUICtrlRead($radio1)
		Sleep(120)
		If _IsPressed(54, $DLL) Then
		Sleep(50)
		Send("tekst1")
		EndIf
			WEnd

To po kliknięciu na checkbox mogę również kliknąć inny checkbox (bo kod do innego checkboxa jest identyczny jak powyżej), ale gdy chcę na coś innego kliknąć (w sumie reszta programu z wyjątkiem checkboxów [np. kliknąć button, wyłączyć program z X]) to tego już nie mogę. Program muszę wyłączać przez Menedżera zadań bo inaczej po prostu się nie da.

Od dnia 1.11.2013r. 14:17 zobaczono moje posty licznik-56-90712-stat.png razy ;)


 


 

Opublikowano

Tak to ciężko coś zrobić. Checkboxy są "blokadą"?

 

Takie coś? Trudno jest mi coś zrobić nie wiedząc jak to ma wyglądać i jak to ma działać- jaką funkcje pełnić.

	If _IsChecked($radio1) And _IsPressed(54, $DLL) Then
		Send("tekst1")
			EndIf

If _IsPressed(54, $DLL) Then
If IsChecked($radio1) Then
        Send("tekst1")
            EndIf
            EndIf

W sumie to co napisałem jest bezsensu.

1387536187-U112334.png

Jeśli Ci pomogłem mógłbyś wynagrodzić lajkiem :)

Opublikowano

Więc tak:

 

Poprzedni skrypt:

 

	If _IsChecked($radio1) Then
			While _IsChecked($radio1)
		Sleep(120)
		If _IsPressed(54, $DLL) Then
		Sleep(50)
		Send("tekst1")
		EndIf

 

Zmieniłem dzięki Tobie na:

 

	If _IsChecked($radio1) And _IsPressed(54, $DLL) Then
			While _IsChecked($radio1)
		Sleep(170)
		Send("tekst1")
			WEnd

I teraz: Gdy kliknę na checkbox to tak, mogę normalnie klikać inne elementy GUI. Ale gdy wpiszę klawisz T (funkcja _IsPressed) to wtedy tekst1 wpisuje się w kółko i nic nie mogę kliknąć na GUI. A jeszcze to co napisałeś drugie to przerobiłem na:

 

If _IsPressed(54, $DLL) Then
If IsChecked($radio1) Then
        Send("tekst1")
            EndIf
            EndIf

I gdy zaznaczę checkbox i kliknę T, to wyskakuje error.

Od dnia 1.11.2013r. 14:17 zobaczono moje posty licznik-56-90712-stat.png razy ;)


 


 

Opublikowano

AdlibRegister - poszukaj sobie info :)
A laguje gdyż usypiasz całą główną pętle :)
Do tej pętli raczej sleep nie pasuję :)


Ewentualnie proponuję zrobić kilka funkcji z pętlami :) a w głównej pętli tylko

IF szotamkombinujemy then
adlibregister lub func ? :)
endif

v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v
 

Opublikowano

Najprostszy fix - zamień Sleep między while _isChecked, a wend na iSleep dodając po przecinku dane $radio (isleep( 100, $radio1)) i dodaj na dole:

 

Func iSleep( $iDelay, $Radio )
    Local $iBegin = TimerInit()
    Do
        Sleep(10)
        
        If _IsChecked( $Radio )  <> 1 Then Return False
        
    Until TimerDiff($iBegin) > $iDelay
    Return True
endFunc
 

WSZYSTKIE PLIKI W CHMURZE DLA MPCFORUM ZOSTAŁY USUNIĘTE. NIE KORZYSTAĆ Z MOICH PROGRAMÓW.

Proszę nie ingerować w moje posty/tematy, w razie potrzeby usunąć całą zawartość. Nie pomagam.

Opublikowano

 

Najprostszy fix - zamień Sleep między while _isChecked, a wend na iSleep dodając po przecinku dane $radio (isleep( 100, $radio1)) i dodaj na dole:

 

Func iSleep( $iDelay, $Radio )
    Local $iBegin = TimerInit()
    Do
        Sleep(10)
        
        If _IsChecked( $Radio )  <> 1 Then Return False
        
    Until TimerDiff($iBegin) > $iDelay
    Return True
endFunc
 

Troszkę mu zakręcisz w głowię :)

 

v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v
 

Opublikowano

Troszkę mu zakręcisz w głowię :)

 

 

Najłatwiejsze rozwiązanie. AdlibRegister jest najlepszym wyjściem, ale to flagi + funkcje do nauki, a sądząc po poprzednich postach, ten użytkownik jest początkującym.

Szybko zerkając do góry:

If _IsPressed(54, $DLL) Then
If IsChecked($radio1) Then
        Send("tekst1")
            EndIf
            EndIf

Pokazuje błąd jednoznacznie stwierdzający brak funkcji IsChecked. Jak ona brzmi w oryginale? _IsChecked. Pamiętaj o tym.

WSZYSTKIE PLIKI W CHMURZE DLA MPCFORUM ZOSTAŁY USUNIĘTE. NIE KORZYSTAĆ Z MOICH PROGRAMÓW.

Proszę nie ingerować w moje posty/tematy, w razie potrzeby usunąć całą zawartość. Nie pomagam.

Opublikowano

Najłatwiejsze rozwiązanie. AdlibRegister jest najlepszym wyjściem, ale to flagi + funkcje do nauki, a sądząc po poprzednich postach, ten użytkownik jest początkującym.

Szybko zerkając do góry:

If _IsPressed(54, $DLL) Then
If IsChecked($radio1) Then
Send("tekst1")
EndIf
EndIf

Pokazuje błąd jednoznacznie stwierdzający brak funkcji IsChecked. Jak ona brzmi w oryginale? _IsChecked. Pamiętaj o tym.

Więc właśnie o tym samym mówimy :)
Tylko nie rzucaj mu takiej ilości materiału post za postem :)
Niechaj podrasuje swoje umiejętności w jednym :)


Co do samego autora :)
google + autoit +wikibook
To co piszę kaje11 lub inni jest dobre.
To że ty to robisz źle jest tylko błędem źle zinterpretowanych informacji jakie posiadasz :)
Gdyż my podsuwamy opcje jakie możesz wykorzystać...
Nie będziemy Ci pisać całego skryptu bo to się mija z celem tego działu :)
Wiec skoro masz info o " AdlibRegister " poszukaj sobie..
Autoit wikibook jest po polsku więc nie ma żadnych przeciwwskazań byś sobie tam zaglądnął.

 

Nie staraj się zrobić !
Postaraj się zrozumieć :)

v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v
 

Opublikowano

No dobrze - Macie rację, że jestem początkującym (od 2 lat?). Po prostu prosty programik z jakimś GUI, funkcjami podstawowymi umiem zrobić, ale "głębiej" to niestety nie umiem :/ Niedawno temu też wróciłem więc niedługo popróbuję poczytać, metodą prób i błędów (jak i na logikę) umieścić w skrypcie podane przez was przykłady. Wiem też, że muszę prędzej czy później się tego pouczyć, ale teraz zabrałem się (według siebie) za największy projekt, program jaki w ogóle zrobiłem. Wcześniej to tylko jakieś GUI, coś pod Case lub Func i tyle.

 

Także dzięki, że próbujecie mi pomóc i popróbuje za niedługo ulepszyć skrypt :)

Od dnia 1.11.2013r. 14:17 zobaczono moje posty licznik-56-90712-stat.png razy ;)


 


 

Opublikowano

Porady dla Cb:)
Metoda prób i błędów 100% racji. Lubię to :)
Wrzuć może cały skrypt z komentarzami wyglądającymi tak:

Msgbox <------------Co to kur jest ?:D

Coś w tym stylu a później weź nasze rady.

Wstaw je zobacz jak działa.
Jeżeli dużo się nie zmieniło to wstaw tylko ten element.
Jeżeli zmieniłeś sporo lepiej wrzuć całość :)

 

Wikibook jak mówiłem po polsku sam się na tym szkolę.
Mimo że nie jestem profesjonalistą myślę że te rady na pewno ułatwią tobie naukę :)

v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v
 

Opublikowano

Najłatwiejsze rozwiązanie. AdlibRegister jest najlepszym wyjściem, ale to flagi + funkcje do nauki, a sądząc po poprzednich postach, ten użytkownik jest początkującym.

Szybko zerkając do góry:

If _IsPressed(54, $DLL) Then
If IsChecked($radio1) Then
        Send("tekst1")
            EndIf
            EndIf

Pokazuje błąd jednoznacznie stwierdzający brak funkcji IsChecked. Jak ona brzmi w oryginale? _IsChecked. Pamiętaj o tym.

 

Masz rację B) Dodałem _ i teraz Send("tekst1") wpisuje się tylko wtedy, gdy kliknę T, to ten tekst "tekst1" się wpisuje i programem już da się obsługiwać (o to właśnie chodziło) jesteś wielki! <3 Niedługo również podszkolę swoje umiejętności, bo stoję na zrobieniu GUI i podstawowych funkcji.

Od dnia 1.11.2013r. 14:17 zobaczono moje posty licznik-56-90712-stat.png razy ;)


 


 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...