PDA

Показать полную графическую версию : [решено] MsgBox (Ok, Cancel) с обратным отсчетом времени.


A4S
01-09-2009, 18:13
Перерыл гугл, но не нашел изящного решения данной задачи.
Необходимо сделать форму вроде этой:

http://s47.radikal.ru/i117/0909/1c/b836fe8da885.jpg


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


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

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

FlatX007
01-09-2009, 18:54
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
Я же написал:

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

Creat0R
01-09-2009, 19:10
Если по проще, то вот:

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



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 ( 100, 1500 )
_Timer_SetTimer($gui,1000,"changetitle")
$isSend = MsgBox( 1 + 256 + 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($smsWinTitle) Then
$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
Если по проще то это так :)

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

#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
мне необходимо автономное от самого autoit приложение »
Я привёл то, что вам нужно (судя по описанию задачи).

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

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

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


каким bb-кодом правильно подсвечивать синтаксис? »
Никаким, это отдельная утилита Au3ToPost.

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


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

Creat0R
01-09-2009, 20:00
В моём примере функция $isSend возвращает 2 и когда истек таймер и когда нажата кнопка отмены
то есть $isSend = -1 такого нет. »
И что? а тут есть, в чём проблема? Вместо проверки «If $isSend = 2» можно проверять «If $isSend <> 1», это индикация отмены.

твой пример мне не подходит к сожалению, т.к. exe должен быть автономен (работать без AutoIt) »
Вы хоть немного имеете понятие о чём говорите? В чём проблема скомпилировать этот код?

beve
01-09-2009, 20:04
твой пример мне не подходит к сожалению, т.к. exe должен быть автономен (работать без AutoIt) »
Лучшего примера для своей задачи ты не найдеш!
P.S. Если твой код должен работать без Autoit, так пиши его на другом языке, или используй батник, или winapi.

A4S
01-09-2009, 20:13
И что? а тут есть, в чём проблема? Вместо проверки «If $isSend = 2» можно проверять «If $isSend <> 1», это индикация отмены. »
Проблема в том, что при проверке нажатой кнопки Cancel в MsgBox в моём примере If $isSend <> 1 возвращает true, НО при таймауте, и не нажатой кнопке Cancel - этот If тоже возвращает значение true. Мне интересно по какой причине и как это можно изменить (чисто в образовательных целях)

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

Creat0R
02-09-2009, 02:25
Проблема в том, что при проверке нажатой кнопки Cancel в MsgBox в моём примере If $isSend <> 1 возвращает true, НО при таймауте, и не нажатой кнопке Cancel - этот If тоже возвращает значение true. Мне интересно по какой причине и как это можно изменить (чисто в образовательных целях) »
Вот именно, это в вашем примере, как оно связано с моим примером?
А происходит оно из за отсутствия параметра timeout в вызове функции. С этим параметром по истечению таймаута функция возвращает -1, см. справку.

A4S
02-09-2009, 02:29
Спасибо за информацию.
Уже пользуюсь твоим примером.

FlatX007
10-09-2009, 16:12
Если по проще, то вот: »

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

Creat0R
10-09-2009, 16:26
FlatX007, в каком месте в скрипте рисуется граффическое оконо сообщения
А кто сказал что оно рисуется? :)

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

FlatX007
10-09-2009, 16:37
Это встроены MsgBox »
- где они встроенны, как к ним обращаются ? я ничего непонимаю

Creat0R
10-09-2009, 16:55
где они встроенны, как к ним обращаются ? »
MsgBox встроен в AutoIt, обычная функция, вызывается из скрипта:

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

FlatX007
10-09-2009, 17:16
Ой ... :lol: просмотрел ... в самом конце оказвается. Всё дошло наконец.




© OSzone.net 2001-2012