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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] MsgBox (Ok, Cancel) с обратным отсчетом времени. (http://forum.oszone.net/showthread.php?t=149514)

A4S 01-09-2009 18:13 1208983

MsgBox (Ok, Cancel) с обратным отсчетом времени.
 
Перерыл гугл, но не нашел изящного решения данной задачи.
Необходимо сделать форму вроде этой:



PHP код:

Global $subject "Заголовок"$sms "Проверка"
Global $Wait 10
Global $smsMessage 'Тема: ' $subject & @CRLF 'Сообщение: ' $sms & @CRLF "Время до отправки SMS: "
Global $smsMessagEnd "сек. " & @CRLF & @CRLF "Нажмите Отмена, если Вы НЕ хотите получить эту СМС"
Global $smsWinTitle "Оповещение SMS"
$isSend MsgBox1$smsWinTitle$smsMessage $Wait ' ' $smsMessagEnd

с обратным отсчетом времени (не просто таймаутом)
то есть чтобы секунды в форме изменялись

$isSend должен принимать нужное значение (по умолчанию - отправить СМС = 1)

FlatX007 01-09-2009 18:54 1209010

Код:

Dim $iMsgBoxAnswer
$iMsgBoxAnswer
= MsgBox(5244593,Default,"Тут текст",10)
Select
  Case
$iMsgBoxAnswer = 1  ;OK

  Case $iMsgBoxAnswer = 2  ;Cancel

  Case $iMsgBoxAnswer = -1 ;Timeout

EndSelect


A4S 01-09-2009 18:57 1209014

Я же написал:

> с обратным отсчетом времени (не просто таймаутом)

Creat0R 01-09-2009 19:10 1209019

Если по проще, то вот:

Код:

Global $subject = "Заголовок", $sms = "Проверка"
Global $Wait = 10
Global $smsWinTitle = "Оповещение SMS"
Global $smsMessage = _
    'Тема: ' & $subject & @CRLF & 'Сообщение: ' & $sms & @CRLF & 'Время до отправки SMS: %s' & @CRLF & _
    'сек. ' & @CRLF & @CRLF & 'Нажмите Отмена, если Вы НЕ хотите получить эту СМС'

$isSend = _MsgBoxTimer(1, $smsWinTitle, $smsMessage, $Wait)

Func _MsgBoxTimer($iFlag, $sTitle, $sText, $iMBTimeOut = 0, $hWnd=0)
    Local $hFile, $sMBLine, $sSet_Text, $iRet

    $sSet_Text
= StringReplace($sText, @CRLF, '\n')

    $sMBLine = '#NoTrayIcon' & @CRLF
    $sMBLine &= 'Opt("WinWaitDelay", 1)' & @CRLF
    $sMBLine &= 'While Not WinExists("' & $sTitle & '")' & @CRLF
    $sMBLine &= '    Sleep(10)' & @CRLF
    $sMBLine &= 'WEnd' & @CRLF
    $sMBLine &= 'ControlSetText("' & $sTitle & '", "", "Static1", StringFormat("' & $sSet_Text & '", ' & $iMBTimeOut & '))' & @CRLF

    If $iMBTimeOut > 0 Then
        $sMBLine &= _
            '$TimerInit = TimerInit()' & @CRLF & _
            '$iTime = ' & $iMBTimeOut & @CRLF & _
            'While $iTime > 0' & @CRLF & _
            '  ControlSetText("' & $sTitle & '", "", "Static1", StringFormat("' & $sSet_Text & '", $iTime))' & @CRLF & _
            '  If Not WinExists("' & $sTitle & '") Then ExitLoop' & @CRLF & _
            '  Sleep(1000)' & @CRLF & _
            '  $iTime -= 1' & @CRLF & _
            'WEnd'
    EndIf

    $hFile = FileOpen(@TempDir & '\MiscMMB.tmp', 2)
    FileWrite($hFile, $sMBLine)
    FileClose($hFile)

    Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @TempDir & '\MiscMMB.tmp"')
    $iRet = MsgBox($iFlag, $sTitle, StringFormat($sText, $iMBTimeOut), $iMBTimeOut)

    While FileExists(@TempDir & '\MiscMMB.tmp')
        FileDelete(@TempDir & '\MiscMMB.tmp')
    WEnd

    Return
$iRet
EndFunc


A4S 01-09-2009 19:18 1209024

эм, мне необходимо автономное от самого autoit приложение..
Вообще сейчас я использую вот такой вариант:

PHP код:

Global $subject "Заголовок"$sms "Проверка"



Global $Wait 10
Global $smsMessage 'Тема: ' $subject & @CRLF 'Сообщение: ' $sms & @CRLF "Время до отправки SMS: "
Global $smsMessagEnd "сек. " & @CRLF & @CRLF "Нажмите ОК, если Вы НЕ хотите получить эту СМС"
Global $smsWinTitle "Оповещение SMS (" $sms ")"
Global $smsSend 1

;Const $WM_SETTEXT 0x000C
$gui 
GUICreate"dummy")
;
$egg GUICtrlCreatePic("egg01.png",0,0)

;
Beep 1001500 )
_Timer_SetTimer($gui,1000,"changetitle")
$isSend MsgBox256 262144$smsWinTitle$smsMessage $Wait ' ' $smsMessagEnd)

GUIDelete($gui)
;
$Wait $Wait 1



If $isSend 2 Then
    SendSMStoMegafon
($subject$sms)
EndIf


Func changetitle($a,$b,$c,$d)
    Global 
$Wait$smsMessageEnd
    
Global $smsSend
    
If winexists($smsWinTitleThen 
        $Wait 
$Wait 1
        
If $Wait 0 Then
            _Timer_KillAllTimers
($gui)
            
WinClose($smsWinTitle)
        EndIf        
        
        
$sd DllStructCreate("Char[500]")
        
DllStructSetData($sd,1$smsMessage $Wait ' ' $smsMessagEnd)
        
_SendMessage(controlgethandle($smsWinTitle,"","Static1"),0x000C,0,DllStructGetPtr($sd))

    ElseIf
        
_Timer_KillAllTimers($gui)
    EndIf
EndFunc 

хреновость варианта в том, что я не могу отслеживать нажатие кнопки Cancel
то есть в идеале мне нужно сделать обратную функцию
По ОК или по истечении таймера - отправлять смс
При нажатии Отмена - выходить из программы

В моём вариант Ок - это выход из программы а Cancel и таймаут - отправка.

P.S. Подскажите каким bb-кодом правильно подсвечивать синтаксис?

FlatX007 01-09-2009 19:23 1209028

Если по проще то это так :)

Сам подгониш под себя ... таймер тикает =)

Код:

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $subject = "Заголовок", $sms = "Проверка"
Global $Wait = 10
Global $smsMessage = 'Тема: ' & $subject & @CRLF & 'Сообщение: ' & $sms & @CRLF & "Время до отправки SMS: "
Global $smsMessagEnd = "сек. " & @CRLF & @CRLF & "Нажмите Отмена, если Вы НЕ хотите получить эту СМС"
Global $smsWinTitle = "Оповещение SMS"

$nForm = GUICreate($smsWinTitle, 442, 147, 192, 124)
$Button1 = GUICtrlCreateButton("OK", 272, 112, 75, 25)
$Button2 = GUICtrlCreateButton("Отмена", 360, 112, 75, 25)
$Label1 = GUICtrlCreateLabel("", 8, 8, 420, 81)
GUISetState(@SW_SHOW)

$Begin = TimerInit()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $Button2
            Exit

        Case
0
            $vTime = $Wait - Round(Round(TimerDiff($Begin)) / 1024)
            GUICtrlSetData($Label1, "Времени осталось :" & $vTime)
            If $vTime = 0 Then
                $isSend = MsgBox( 1, $smsWinTitle, $smsMessage & $Wait & ' ' & $smsMessagEnd)
                Exit
            EndIf

    EndSwitch
WEnd


Creat0R 01-09-2009 19:29 1209032

Цитата:

Цитата A4S
мне необходимо автономное от самого autoit приложение »

Я привёл то, что вам нужно (судя по описанию задачи).

Цитата:

Цитата A4S
По ОК или по истечении таймера - отправлять смс
При нажатии Отмена - выходить из программы »

В чём проблема, функция возвращет те же значения что и обычная MsgBox:

Код:

$isSend = _MsgBoxTimer(1, $smsWinTitle, $smsMessage, $Wait)
If $isSend = 2 Then Exit ;нажали Отмена

If $isSend = 1 Or $isSend = -1 Then SendSMS_Proc() ;Нажали OK или истекло время

Цитата:

Цитата A4S
каким bb-кодом правильно подсвечивать синтаксис? »

Никаким, это отдельная утилита Au3ToPost.

A4S 01-09-2009 19:38 1209043

В моём примере функция $isSend возвращает 2 и когда истек таймер и когда нажата кнопка отмены
то есть $isSend = -1 такого нет.


твой пример мне не подходит к сожалению, т.к. exe должен быть автономен (работать без AutoIt)
FlatX007, спасибо за вариант, но хотелось бы обойтись без рисования GUI, обычным msgbox

Creat0R 01-09-2009 20:00 1209058

Цитата:

Цитата A4S
В моём примере функция $isSend возвращает 2 и когда истек таймер и когда нажата кнопка отмены
то есть $isSend = -1 такого нет. »

И что? а тут есть, в чём проблема? Вместо проверки «If $isSend = 2» можно проверять «If $isSend <> 1», это индикация отмены.

Цитата:

Цитата A4S
твой пример мне не подходит к сожалению, т.к. exe должен быть автономен (работать без AutoIt) »

Вы хоть немного имеете понятие о чём говорите? В чём проблема скомпилировать этот код?

beve 01-09-2009 20:04 1209061

Цитата:

Цитата A4S
твой пример мне не подходит к сожалению, т.к. exe должен быть автономен (работать без AutoIt) »

Лучшего примера для своей задачи ты не найдеш!
P.S. Если твой код должен работать без Autoit, так пиши его на другом языке, или используй батник, или winapi.

A4S 01-09-2009 20:13 1209070

Цитата:

Цитата Creat0R
И что? а тут есть, в чём проблема? Вместо проверки «If $isSend = 2» можно проверять «If $isSend <> 1», это индикация отмены. »

Проблема в том, что при проверке нажатой кнопки Cancel в MsgBox в моём примере If $isSend <> 1 возвращает true, НО при таймауте, и не нажатой кнопке Cancel - этот If тоже возвращает значение true. Мне интересно по какой причине и как это можно изменить (чисто в образовательных целях)

Цитата:

Цитата Creat0R
Вы хоть немного имеете понятие о чём говорите? В чём проблема скомпилировать этот код? »

@AutoItExe - я думал для работы такого exe необходимо наличие установленного AutoIt
твой пример работает

Creat0R 02-09-2009 02:25 1209284

Цитата:

Цитата A4S
Проблема в том, что при проверке нажатой кнопки Cancel в MsgBox в моём примере If $isSend <> 1 возвращает true, НО при таймауте, и не нажатой кнопке Cancel - этот If тоже возвращает значение true. Мне интересно по какой причине и как это можно изменить (чисто в образовательных целях) »

Вот именно, это в вашем примере, как оно связано с моим примером?
А происходит оно из за отсутствия параметра timeout в вызове функции. С этим параметром по истечению таймаута функция возвращает -1, см. справку.

A4S 02-09-2009 02:29 1209288

Спасибо за информацию.
Уже пользуюсь твоим примером.

FlatX007 10-09-2009 16:12 1215784

Цитата:

Цитата Creat0R
Если по проще, то вот: »

А в каком месте в скрипте рисуется граффическое оконо сообщения ... чёто я немогу понять откуда оно берётся.

Creat0R 10-09-2009 16:26 1215801

FlatX007,
Цитата:

в каком месте в скрипте рисуется граффическое оконо сообщения
А кто сказал что оно рисуется? :)

Цитата:

откуда оно берётся.
Это встроены MsgBox, с изменением его данных из дополнительного скрипта.

FlatX007 10-09-2009 16:37 1215816

Цитата:

Цитата Creat0R
Это встроены MsgBox »

- где они встроенны, как к ним обращаются ? я ничего непонимаю

Creat0R 10-09-2009 16:55 1215845

Цитата:

Цитата FlatX007
где они встроенны, как к ним обращаются ? »

MsgBox встроен в AutoIt, обычная функция, вызывается из скрипта:

Цитата:

Цитата Creat0R
Код:

...
$iRet = MsgBox($iFlag, $sTitle, StringFormat($sText, $iMBTimeOut), $iMBTimeOut) »
...



FlatX007 10-09-2009 17:16 1215875

Ой ... :lol: просмотрел ... в самом конце оказвается. Всё дошло наконец.


Время: 11:11.

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