Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] как выдать сообщение не остонавливая скрипт до закрытия его пользователем? (http://forum.oszone.net/showthread.php?t=162684)

andr_mozg 07-01-2010 19:52 1313469

как выдать сообщение не остонавливая скрипт до закрытия его пользователем?
 
MsgBox устраивает всем, кроме того что до закрытия сообщения пользователем скрипт останавливается, а надо чтобы он не прекращал работать.
Как можно это реализовать, таймаут в MsgBox не предлагать

Coutty 07-01-2010 20:08 1313485

Может просто создать дочернее окно, в котором будет только сообщение и кнопка? Скрипт при этом не должен останавливаться.

andr_mozg 07-01-2010 20:11 1313488

так там будит то же цыкл, который будит следить не нажата ли кнопка, получится то же самое что и с MsgBox.

Creat0R 07-01-2010 23:43 1313692

Код:

$iRet = _MsgBoxEx(36, "My Title", "Message", 10, 0, "_SetData")

MsgBox(64, "", "Returned Value is: " & $iRet)

Func _SetData($iCount)
    ConsoleWrite("The script is not paused " & $iCount & " second(s)" & @LF)
EndFunc

Func _MsgBoxEx($iType, $sTitle, $sText, $iTimeOut=0, $hWnd=0, $sCallBackFunc="")
    Local $sAu3Line = '"ConsoleWrite(MsgBox(' & $iType & ', ''' & $sTitle & ''', ''' &  $sText & ''', ' & _
        $iTimeOut & ', ' & $hWnd & '))"'
    Local $iAu3PID = Run(@AutoItExe & ' /AutoIt3ExecuteLine ' & $sAu3Line, '', @SW_SHOW, 6)

    Local $iStdOutRead
    Local $iTimerInit = TimerInit(), $iTimerDiff = Round(TimerDiff($iTimerInit)/1000, 0), $iLastTimer = $iTimerDiff
    Local $iOld_WWD_Opt = Opt("WinWaitDelay", 0)

    WinWait($sTitle, $sText)

    Opt("WinWaitDelay", $iOld_WWD_Opt)

    While 1
        $iStdOutRead &= StdoutRead($iAu3PID)
        If @error <> 0 Then ExitLoop

        If $sCallBackFunc <> "" Then
            $iTimerDiff = Round(TimerDiff($iTimerInit)/1000, 0)

            If $iLastTimer <> $iTimerDiff Then
                $iLastTimer = $iTimerDiff
                Call($sCallBackFunc, $iTimerDiff)
            EndIf
        EndIf

        Sleep(1)
    WEnd

    Return $iStdOutRead
EndFunc


andr_mozg 08-01-2010 00:02 1313715

Спасибо

snoitaleR 09-01-2010 08:59 1314985

andr_mozg
Я для этих целей использую функцию SplashTextOn()...
А когда надо убрать сообщение (в любом месте скрипта) вызываю SplashOff()...

Creat0R 09-01-2010 11:50 1315041

Цитата:

Цитата snoitaleR
Я для этих целей использую функцию SplashTextOn()... »

Для каких целей?

Цитата:

Цитата snoitaleR
А когда надо убрать сообщение (в любом месте скрипта) вызываю SplashOff() »

А если нужно предоставить эту возможность пользователю? :)

snoitaleR 09-01-2010 18:28 1315460

Creat0R
Тогда по-другому:

Код:

; НАЧАЛО

 $GUI1=GUICreate("",300,300)
 $EDIT=GUICtrlCreateEdit("",0,0,300,200,0x1000)
 $BUTTON1=GUICtrlCreateButton("MsgBox",0,200,300,50)
 $BUTTON2=GUICtrlCreateButton("GUI2",0,250,300,50)

 GUISetState(@SW_SHOW,$GUI1)

 $GUI2=GUICreate("Внимание!",200,100,-1,-1,0x00400000)
 $LABEL1=GUICtrlCreateLabel("Приложение продолжает работу"&@CRLF&"Нажмите OK, чтобы закрыть окно",10,10)
 $BUTTON0=GUICtrlCreateButton("Ok",-1,45,50,25)

 $R=""

 While true

  Switch GUIGetMsg()
  Case -3
    ExitLoop
  Case $BUTTON1
    MsgBox(0,"Внимание!","Приложение заблокировано"&@CRLF&"Нажмите OK, чтобы закрыть окно")
  Case $BUTTON2
    GUISetState(@SW_SHOW,$GUI2)
  Case $BUTTON0
    GUISetState(@SW_HIDE,$GUI2)
  EndSwitch

  $R=$R&Chr(Random(32,127,1))

  GUICtrlSetData($EDIT,$R)

  Sleep(50)

 Wend

; КОНЕЦ


Creat0R 09-01-2010 18:36 1315470

Цитата:

Цитата snoitaleR
Тогда по-другому »

Что подругому, разве мой пример не подходит?

snoitaleR 09-01-2010 18:42 1315475

Creat0R
Не в этом дело...
Мой пример сначала не подходил, а теперь подходит... :)

Creat0R 09-01-2010 23:42 1315799

Цитата:

Цитата snoitaleR
Мой пример сначала не подходил, а теперь подходит »

Не совсем, т.к нужно каждый раз следить за событиями дочернего окна, и что если нужно несколько сообщений выводить?

Если делать по этому методу, тогда лучше так:

Код:

Global $aMsgBox_Data[2][2] = [[0, -1], [0, -1]]

$hGUI = GUICreate("", 300, 300)
$nEDIT = GUICtrlCreateEdit("", 0, 0, 300, 200, 0x1000)
$nBUTTON1 = GUICtrlCreateButton("MsgBox", 0, 200, 300, 50)
$nBUTTON2 = GUICtrlCreateButton("GUI2", 0, 250, 300, 50)

GUISetState(@SW_SHOW, $hGUI)

AdlibEnable("_SetEditData_Proc", 50)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case -3
            ExitLoop
        Case $nBUTTON1
            MsgBox(48, "Внимание!", "Приложение заблокировано" & @CRLF & "Нажмите OK, чтобы закрыть окно", 0, $hGUI)
        Case $nBUTTON2
            _GUI_MsgBox("Внимание!", "Приложение продолжает работу" & @CRLF & "Нажмите OK, чтобы закрыть окно", $hGUI)
        Case 0
            ;None
        Case Else ;Any event except 0, it's can be only the new created elements of child GUIs
            Local $aTmp_Arr[1][2]

            For $i = 1 To $aMsgBox_Data[0][0]
                If $aMsgBox_Data[$i][1] <> $nMsg Then
                    $aTmp_Arr[0][0] += 1
                    ReDim $aTmp_Arr[$aTmp_Arr[0][0]+1][2]
                    $aTmp_Arr[$aTmp_Arr[0][0]][0] = $aMsgBox_Data[$i][0]
                    $aTmp_Arr[$aTmp_Arr[0][0]][1] = $aMsgBox_Data[$i][1]
                Else
                    GUISetState(@SW_HIDE, $aMsgBox_Data[$i][0])
                    GUIDelete($aMsgBox_Data[$i][0])
                    If Not WinActive($hGUI) Then WinActivate($hGUI)
                EndIf
            Next

            $aMsgBox_Data = $aTmp_Arr
    EndSwitch
WEnd

Func _SetEditData_Proc()
    GUICtrlSetData($nEDIT, Chr(Random(32, 127, 1)), 1)
EndFunc

Func _GUI_MsgBox($sTitle, $sMsg, $hWnd)
    Local $hGUI, $nButton, $iIndex

    $hGUI = GUICreate("GUI #" & $aMsgBox_Data[0][0] + 1 & " - " & $sTitle, 200, 100, -1, -1, 0x00400000, -1, $hWnd)
    GUICtrlCreateLabel($sMsg, 10, 10)
    $nButton = GUICtrlCreateButton("Ok", -1, 45, 50, 25)

    GUISetState(@SW_SHOW, $hGUI)

    $iIndex = -1

    For $i = 1 To $aMsgBox_Data[0][0]
        If $aMsgBox_Data[$i][0] = $hGUI Then
            $iIndex = $i
            ExitLoop
        EndIf
    Next

    If $iIndex = -1 Then
        $aMsgBox_Data[0][0] += 1
        $iIndex = $aMsgBox_Data[0][0]
        ReDim $aMsgBox_Data[$iIndex+1][2]
    EndIf

    $aMsgBox_Data[$iIndex][0] = $hGUI
    $aMsgBox_Data[$iIndex][1] = $nButton
EndFunc



Время: 20:51.

Время: 20:51.
© OSzone.net 2001-