Ich habe ein Programm, das etwas tut. Das soll man durch Druck auf einen "Pause"-Button unterbrechen können. Soweit so gut, bei Druck auf Pause, abgefragt mit Clicked() wird das Programm unterbrochen und eine einfache Funktion wird aufgerufen, die in einer waitinput-Schleife wartet, dass der Benutzer noch einmal Pause anklickt und das Programm weitergehen soll. So weit so gut, leider wird beim Rücksprung ins eigentliche Programm immer wieder "Pause" angeklickt. Obwohl das der Benutzer nicht tut. Es ist so, als ob die Message nicht gelöscht wird.
Kann man das irgendwie umgehen? So dass das Clicked() erst wieder reagiert, wenn wirklich geklickt wird. Oder gibt es gar eine bessere Möglichkeit das zu bewerkstelligen?
Clicked() ohne waitinput
-
-
-
Moin...
Code
Alles anzeigenDEF GetDlgCtrlID(1) !"USER32","GetDlgCtrlID" DEF ButtonClicked(1) GetDlgCtrlID(&(1)) = -%MENUITEM Declare Button%, x& CLS Button% = Create("Button", %HWND, "Click", 30 ,30, 300, 30) While 1 Sleep 10 If ButtonClicked(Button%) Beep LOCATE 0,0 Print str$(X&) x& = X& +1 SetMenuitem 0 endif EndWhile
-
Oh, danke. Das probiere ich morgen mal aus. Muss leider gleich zur Arbeit.
-
Nein, das funktioniert leider nicht. Das Verhalten ist identisch mit Clicked().
Code
Alles anzeigenDEF GetDlgCtrlID(1) !"USER32","GetDlgCtrlID" DEF ButtonClicked(1) GetDlgCtrlID(&(1)) = -%MENUITEM proc pause declare ende% SetMenuItem 0 settext btn&,"Weiter" whilenot ende% waitinput if Clicked(btn&) Inc ende% endif endwhile SetMenuItem 0 SetText btn&,"Pause" endproc cls btn&=Create("Button",%hWnd,"Pause",8,8,120,32) while 1 'Tu etwas case ButtonClicked(btn&):Pause 'Tu noch mehr endwhile
-
Du hast das Setmenuitem 0 vergessen.
Baut man beim Auto den Motor aus, fährt das Ding nicht los, auch wenn die Räder dran sind. -
Sorry - hast du ja doch drin.
Bei mir läuft das (XProfan9). Liegt es an der XProfan Version? -
Möööp. XProfan X4.
Irgendwie müssen nach de Waitinput-Schleife die anliegenden Messages gelöscht werden. Gibt's da so 'ne Art Flush-Befehl? -
Hast du evtl. ein Beispielcode, mit dem man das ungewöhnliche
Verhalten nachvollziehen kann ?Normalerweise sollte Clicked() nur nach jedem Mausklick des Users
reagieren und nicht selbständig, unabhängig von Mausklicks. -
Hast du evtl. ein Beispielcode, mit dem man das ungewöhnliche
Verhalten nachvollziehen kann ?Normalerweise sollte Clicked() nur nach jedem Mausklick des Users
reagieren und nicht selbständig, unabhängig von Mausklicks.Leider nicht mehr als den oben. Mein Code ist recht komplex. Es geht dort um die Übertragung von Dateien per FTP. Der Vorgang soll pausiert werden können, um ihn dann entweder fortzusetzen, abzubrechen oder den aktuellen Fortschritt für später zu speichern.
Eigentlich stimmt der Code ja auch so. Clicked() ermittelt den zuletzt gedrückten Button, in dem Fall der Pausen-Button. Das wird sicher nicht zurückgesetzt, wenn man SetMenuItem benutzt.
-
Statt Clicked ButtonClicked verwenden - dann kannst du mit Setmenuitem 0 den Klick zurücksetzen.
Das klappt wunderbar - auch in dem Code, den du gepostet hast. Wenn es dir um Usermessages geht, die zusätzlich zurückgesetzt werden müssen, musst du da noch etwas mehr tricksen. -
Statt Clicked ButtonClicked verwenden - dann kannst du mit Setmenuitem 0 den Klick zurücksetzen.
Das klappt wunderbar - auch in dem Code, den du gepostet hast. Wenn es dir um Usermessages geht, die zusätzlich zurückgesetzt werden müssen, musst du da noch etwas mehr tricksen.Ich habe ein paar Usermessages definiert, aber nur 563. 16 wird vor Beginn der Operation per -16 zurückgesetzt...
Vielleicht kann Roland uns helfen. Ein Befehl, der %Key, Clicked(), %LastMessage etc. zurücksetzt. Momentan hab ich es so gelöst, dass der Button durch einen anderen Button an gleicher Stelle ersetzt wird. Nicht übermäßig schön, aber funktioniert.
-
Was tut denn dein Testcode, was du nicht möchtest?
Für mich tut er genau das, was du willst. -
Hier nochmal Code zum Beweis, dass das geht:
Code
Alles anzeigenDeclare Button%, x&, y&, Ende& DEF GetDlgCtrlID(1) !"USER32","GetDlgCtrlID" DEF ButtonClicked(1) GetDlgCtrlID(&(1)) = -%MENUITEM CLS Button% = Create("Button", %HWND, "Pause", 30 ,30, 300, 30) Proc Pause SetText Button%, "Weiter" While Ende& = 0 y& = y& + 1 LOCATE 1, 1 Drawtext 0, 130, "Zahl Nummer 2: " + str$(y&) + " " If ButtonClicked(Button%) Ende& = 1 SetMenuitem 0 SetText Button%, "Pause" endif Sleep 100 EndWhile endproc While 1 Ende& = 0 Sleep 100 X& = x& + 1 Drawtext 0, 0, "Zahl Nummer 1: " + str$(X&) + " " If ButtonClicked(Button%) LOCATE 0, 0 SetMenuitem 0 Pause endif EndWhile
-
Der Testcode tut was er soll, aber im fertigen Produkt klappt's nicht. Dort werden mehrere Dateien per FTP übertragen. Man kann das halt abbrechen. Mehr ist da nicht dabei...
Leider tun sich da noch andere Probleme auf: Wenn ich die Übertragung einer Datei unterbreche schließe ich das Handle normal mit InternetCloseHandle(), aber danach kann ich keine FTP-Operationen mehr ausführen, so als wäre das Ding blockiert. Ich muss dort erstmal eine genaue Fehlerbeschreibung abfragen... -
Vielleicht blockiert ja was bei dem FTP-Zeug.
Wäre vielleicht ein Überlegung wert, das in einen
Prozess zu verlegen.Mit der Containerfunktionen Process(Kill, Suspend, Resume)
könnte man das doch schön steuern und das Hauptprogramm
ist entlastet. -
Vielleicht blockiert ja was bei dem FTP-Zeug.
Wäre vielleicht ein Überlegung wert, das in einen
Prozess zu verlegen.Mit der Containerfunktionen Process(Kill, Suspend, Resume)
könnte man das doch schön steuern und das Hauptprogramm
ist entlastet.Hab ich auch schon überlegt. Es wäre aber sehr unpraktisch den Übertragungsprozess in einen eigenen Prozess auszugliedern. Wenn ich ihn abbreche habe ich weniger Kontrolle was genau übertagen wurde. da müsste viel Kommunikation stattfinden. Außerdem dauert es immer 3 Sekunden bis eine FTP-Verbindung aufgebaut ist.
Mit den 2 Buttons klappts ganz gut, ist nur nicht ganz sauber. -
Ich glaube, im Purebasic Forum war auch mal so eine Diskussion.
Der Autor von PB hatte dann die FileDownloads und Uploads
threadsafe gemacht.PS: Die Kommunikation zwischen Prozess und Hauptprogramm
ist ja da. Sei es über FileMapping oder aber auch einfach
mit SendMessage, wenn man das Hauptprogrammfenster
als Parameter mitgibt und eine UserMessage definiert. -
Ich glaube, im Purebasic Forum war auch mal so eine Diskussion.
Der Autor von PB hatte dann die FileDownloads und Uploads
threadsafe gemacht.PS: Die Kommunikation zwischen Prozess und Hauptprogramm
ist ja da. Sei es über FileMapping oder aber auch einfach
mit SendMessage, wenn man das Hauptprogrammfenster
als Parameter mitgibt und eine UserMessage definiert.Aber die Kommunikation würde ich gern vermeiden.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!