Hab ein kleines Problem

12/16/2013 14:40 Claiver#1
Also...
Ich hab ein kleines Script als Probe geschrieben, nur um nach diesem Fehler zu fragen...
Also

Code:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("", 135, 54, 4, 4)
$Label1 = GUICtrlCreateLabel("a", 8, 8, 288, 78)
GUICtrlSetFont(-1, 72, 400, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	GUICtrlSetData($Label1,@HOUR&":"&@MIN&":"&@SEC)
	Sleep(1000)
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
Ich will dass das Programm schließt wenn ich auf "X" drücke, aber wegen der While Schleife funktioniert es nicht... Ich will aber die While Schleife drinnen lassen und mit "X" das Programm schließen können...

HILFE!!!
12/16/2013 14:57 alpines#2
Es schließt nicht weil du nicht auf X drückst wenn die Msg abgerufen wird.
Wenn du die Sleep(1000) da entfernen würdest dann würde es funktionieren.
Wenn du aber alle 1s den setten möchtest kannst du das hier versuchen (im Browser getippt)
Du musst einen Timer initiieren und erst setten wenn es kleiner als Mod(TimerDiff($timer), 1000) kleiner als 50 z.B. ist.
12/16/2013 17:59 Shadow992#3
Quote:
Originally Posted by alpines View Post
Es schließt nicht weil du nicht auf X drückst wenn die Msg abgerufen wird.
Wenn du die Sleep(1000) da entfernen würdest dann würde es funktionieren.
Wenn du aber alle 1s den setten möchtest kannst du das hier versuchen (im Browser getippt)
Du musst einen Timer initiieren und erst setten wenn es kleiner als Mod(TimerDiff($timer), 1000) kleiner als 50 z.B. ist.
Prinzipiell eine mögliche Idee, aber die Mod-Variante hat ihre Tücken, wenn beispielsweise die Schleife aus irgendeinem Grund länger als 1msec braucht, kann es passieren, dass du Mod(...,1000) nie erfüllt hast.

Wenn du das Ganze abfangen willst mit "<50", dann kann es bei sehr kleinen Schleifen (wie hier) immernoch zu einem Flackern kommen, da es ca 50x die Schleife durchläuft, bis 50msec rum sind.

Daher empfiehlt sich mit Zeit-Differenzen zu arbeiten:

PHP Code:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 GUICreate(""1355444)
$Label1 GUICtrlCreateLabel("a"8828878)
GUICtrlSetFont(-1724000"MS Sans Serif")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

$timer=TimerInit()

While 
1
   
if (TimerInit()-$timer)>=1000 then
    GUICtrlSetData
($Label1,@HOUR&":"&@MIN&":"&@SEC)
     
$timer=TimerInit()
   endif
    
$nMsg GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
    EndSwitch
WEnd 
12/16/2013 18:05 alpines#4
Das hab ich schnell im Browser getippt, natürlich hätte ich das auch anders gelöst aber fürs erste hätte es ja gereicht.
12/16/2013 19:32 FacePalmMan#5
oder einfacher:
Code:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("", 135, 54, 4, 4)
$Label1 = GUICtrlCreateLabel("a", 8, 8, 288, 78)
GUICtrlSetFont(-1, 72, 400, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Adlibregister("SetData",1000)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
Func SetData()
GUICtrlSetData($Label1,@HOUR&":"&@MIN&":"&@SEC)
EndFunc
12/16/2013 19:34 alpines#6
Aber das Unregister am Ende nicht vergessen, wir wollen sauber scripten! ;)
12/16/2013 23:06 SoulCr4ck#7
Code:
 AdlibRegister("NFunc",1000)
Func NFunc()


;here what you want to do

endfunc
oder GuiSetOnEventMode
12/17/2013 00:15 lolkop#8
der einzige grund für das intervall des setzens liegt darinn, nicht zu oft das ganze zu aktualisieren... das ganze kann man auch viel einfacher und vorallem sauberer etwa so lösen:
Code:
GUICreate("", 135, 40, Default, Default, 0x10C80000)
$label = GUICtrlCreateLabel('', 10, 10, 115, 20)

While GUIGetMsg()<>-3
	SetControlText($label, @HOUR&":"&@MIN&":"&@SEC)
WEnd

Func SetControlText($control, $text)
	If GUICtrlRead($control)<>$text Then GUICtrlSetData($control, $text)
EndFunc