Что нового

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

михаил15

Новичок
Сообщения
8
Репутация
0
Здравствуйте участники форума и знатоки сайта.
Мне нужна помощь в следующем вопросе:
В процессе создания программы у меня возникла некая проблема,- как при запущенной программе, выполняющей какую-либо функцию, иметь возможность работать с другими элементами окна?
Для примера выкладываю код простенькой программы с окном и тремя кнопками, которая просто прибавляет единицу к указанному числу, с указанной задержкой, и в указанном диапазоне.
Одна кнопка запускает действие, две другие просто открывают окно с какими-либо сообщениями.
Проблема в том, что в процессе работы программы (в процессе складывания чисел), другие кнопки окна не действуют. И не получается заставить их работать.
Пробовал оформить блок сложения в функцию, вынесенную за пределы части которая опрашивает состояние элементов окна, - кнопки не заработали.
Пробовал вывести блок сложения в отдельную программу (.exe- файлом),- работает, но этот вариант не устраивает, т. к. передавать переменные в отдельную программу и брать из неё результаты в основное окно, я пока не умею.
Пробовал оформить блок сложения внутрь части программы, опрашивающей состояние элементов окна, - работает, но коряво, к кнопкам появляется доступ только тогда, когда программа до них "доходит".

Это простенький пример для наглядности проблемы.
Единственный вариант который работал - это оформить блок сложения в отдельную программу (.exe- файлом), но это не вариант при работе с переменными. Если кто знает как решить проблему, прошу научить меня передавать переменные в отдельную программу и брать из неё результаты.
Или научить меня правильно оформлять программу, чтобы работа одной её часть не мешала функционированию других элементов окна.
Код:
#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ProgressConstants.au3>
#include <ButtonConstants.au3>

#Region ### START Koda GUI section ### Form=C:\Documents and Settings\Home\Рабочий стол\Новая папка\программа счёта.kxf
$Form1 = GUICreate("Form1", 505, 87, 193, 125)
$Input1 = GUICtrlCreateInput("Input1", 40, 16, 41, 21)
$Input2 = GUICtrlCreateInput("Input2", 112, 16, 41, 21)
$Button1 = GUICtrlCreateButton("НАЧАТЬ", 424, 16, 65, 25, 0)
$Input3 = GUICtrlCreateInput("Input3", 368, 16, 41, 21)
$Label1 = GUICtrlCreateLabel("ОТ", 16, 16, 19, 17)
$Label2 = GUICtrlCreateLabel("ДО", 88, 16, 21, 17)
$Label4 = GUICtrlCreateLabel("ПРИБАВЛЯТЬ 1, С ЗАДЕРЖКОЙ (СЕК)", 160, 16, 204, 17)
$Button2 = GUICtrlCreateButton("СООБЩЕНИЕ 1", 16, 48, 137, 25, 0)
$Button3 = GUICtrlCreateButton("СООБЩЕНИЕ 2", 160, 48, 137, 25, 0)
$Label3 = GUICtrlCreateLabel(" ", 312, 48, 175, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

GUICtrlSetData($Input1, "")
GUICtrlSetData($Input2, "")
GUICtrlSetData($Input3, "")
$i2=0

While 1
$Msg = GUIGetMsg()

If $msg = $GUI_EVENT_CLOSE Then Exit ; это встроенное значение для проверки состояния кнопки закрытия окна

If $Msg=$Button1 Then
$s1=GUICtrlRead($Input1)
$s2=GUICtrlRead($Input2)
$s3=GUICtrlRead($Input3)
$s3=$s3*1000
$i2=$s1

for $i1=$s1 to $s2
$i2=$i2+1
sleep($s3)
GUICtrlSetData($Label3, $i2)
Next

GUICtrlSetData($Label3, $i2 &" выполненно")

EndIf

If $msg=$Button2 Then MsgBox(4096, "Сообщение 1", "что-то," &@CRLF &"что-то")

If $msg=$Button3 Then MsgBox(4096, "Сообщение 2", "о чём-то," &@CRLF &"о чём-то")

sleep(10)
WEnd

Заранее спасибо.
 
Последнее редактирование модератором:

Tempo

Скриптер
Сообщения
515
Репутация
159

joiner

Модератор
Локальный модератор
Сообщения
3 090
Репутация
517
Автор, код нужно обозначить тегом </>
 
Автор
М

михаил15

Новичок
Сообщения
8
Репутация
0
Предыдущее сообщение исправить не смог - отключилось редактирование.
Код с тегом.

Код:
#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ProgressConstants.au3>
#include <ButtonConstants.au3>

#Region ### START Koda GUI section ### Form=C:\Documents and Settings\Home\Рабочий стол\Новая папка\программа счёта.kxf
$Form1 = GUICreate("Form1", 505, 87, 193, 125)
$Input1 = GUICtrlCreateInput("Input1", 40, 16, 41, 21)
$Input2 = GUICtrlCreateInput("Input2", 112, 16, 41, 21)
$Button1 = GUICtrlCreateButton("НАЧАТЬ", 424, 16, 65, 25, 0)
$Input3 = GUICtrlCreateInput("Input3", 368, 16, 41, 21)
$Label1 = GUICtrlCreateLabel("ОТ", 16, 16, 19, 17)
$Label2 = GUICtrlCreateLabel("ДО", 88, 16, 21, 17)
$Label4 = GUICtrlCreateLabel("ПРИБАВЛЯТЬ 1, С ЗАДЕРЖКОЙ (СЕК)", 160, 16, 204, 17)
$Button2 = GUICtrlCreateButton("СООБЩЕНИЕ 1", 16, 48, 137, 25, 0)
$Button3 = GUICtrlCreateButton("СООБЩЕНИЕ 2", 160, 48, 137, 25, 0)
$Label3 = GUICtrlCreateLabel(" ", 312, 48, 175, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

GUICtrlSetData($Input1, "")
GUICtrlSetData($Input2, "")
GUICtrlSetData($Input3, "")
$i2=0

While 1
$Msg = GUIGetMsg()

If $msg = $GUI_EVENT_CLOSE Then Exit ; это встроенное значение для проверки состояния кнопки закрытия окна

If $Msg=$Button1 Then
$s1=GUICtrlRead($Input1)
$s2=GUICtrlRead($Input2)
$s3=GUICtrlRead($Input3)
$s3=$s3*1000
$i2=$s1

for $i1=$s1 to $s2
$i2=$i2+1
sleep($s3)
GUICtrlSetData($Label3, $i2)
Next

GUICtrlSetData($Label3, $i2 &" выполненно")

EndIf

If $msg=$Button2 Then MsgBox(4096, "Сообщение 1", "что-то," &@CRLF &"что-то")

If $msg=$Button3 Then MsgBox(4096, "Сообщение 2", "о чём-то," &@CRLF &"о чём-то")

sleep(10)
WEnd


Примечательно то, что все нажатия на кнопки программа запоминает, но выполняет их только после завершения работы модуля счёта. А нужно чтобы все кнопки работали независимо друг от друга.
 
Последнее редактирование:

ra4o

Скриптер
Сообщения
993
Репутация
183
Можно опрашивать кнопки в Adlib-функции (AdlibRegister ( "function" [, time = 250 ] )) с небольшими промежутками , НО : Во время работы фунции работа по основному счёту прервётся , так же работа скрипта остановится на время , пока будут показаны MsgBox
 

joiner

Модератор
Локальный модератор
Сообщения
3 090
Репутация
517
Как пример.
только нужно учесть, в функции WM_COMMAND нельзя встраивать циклы, MsgBox или графический показ массива. Если такое требуется, то лучше использовать флаг, как в работе с $Button1
Код:
#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ProgressConstants.au3>
#include <WinAPIEx.au3>


Global $Form1 = GUICreate('Form1', 505, 100, 193, 125)
Local $Input1 = GUICtrlCreateInput('', 40, 16, 41, 21, $ES_NUMBER)
Local $Input2 = GUICtrlCreateInput('', 112, 16, 41, 21, $ES_NUMBER)
Global $Button1 = GUICtrlCreateButton('НАЧАТЬ', 424, 16, 65, 25, 0)
Local $Input3 = GUICtrlCreateInput('', 368, 16, 41, 21, $ES_NUMBER)
Local $Label1 = GUICtrlCreateLabel('ОТ', 16, 16, 19, 17)
Local $Label2 = GUICtrlCreateLabel('ДО', 88, 16, 21, 17)
Local $Label4 = GUICtrlCreateLabel('ПРИБАВЛЯТЬ 1, С ЗАДЕРЖКОЙ (СЕК)', 160, 16, 204, 17)
Global $Button2 = GUICtrlCreateButton('СООБЩЕНИЕ 1', 16, 48, 137, 25, 0)
Global $Button3 = GUICtrlCreateButton('СООБЩЕНИЕ 2', 160, 48, 137, 25, 0)
Local $Label3 = GUICtrlCreateLabel('', 312, 48, 175, 17)
Local $Label4 = GUICtrlCreateLabel('', 16, 80, 175, 17)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUIRegisterMsg($WM_SYSCOMMAND, 'WM_SYSCOMMAND')
Local $i2 = 0
Global $nB
While 1
    Sleep(10)
    If $nB Then
        $nB = 0
        $s1 = GUICtrlRead($Input1)
        $s2 = GUICtrlRead($Input2)
        $s3 = GUICtrlRead($Input3)
        $s3 = $s3 * 1000
        $i2 = $s1
        For $i1 = $s1 To $s2
            $i2 = $i2 + 1
            Sleep($s3)
            GUICtrlSetData($Label3, $i2)
        Next
        GUICtrlSetData($Label3, $i2 & ' выполненно')
    EndIf
WEnd

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $nID = _WinAPI_LoWord($wParam) 
    Switch $nID
        Case $Button1
            $nB = 1
        Case $Button2
            GUICtrlSetData($Label4, 'Сообщение 1')
        Case $Button3
            GUICtrlSetData($Label4, 'Сообщение 2')
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Switch $wParam
        Case 0xF060 ; системная кнопка Закрыть
            Exit
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SYSCOMMAND
 
Автор
М

михаил15

Новичок
Сообщения
8
Репутация
0
Спасибо.
Жаль что не запускается последний код, - не смог найти рабочий WinAPIEx.au3. Где только ни лазил, в попытках скачать WinAPIEx.au3, но, - либо страница недоступна, либо скачивает но ошибается при работе.

Спасибо за советы, AdlibRegister, _Timer_SetTimer поизучаю детальнее. Но если программа притормаживается при применении AdlibRegister, то этот вариант тоже не подходит.

Тогда вопрос от иного.
Программу можно оформить фрагментарно, - в виде отдельных программ (.au3 или .exe - файлами), а визуальное окно будет их запускать. Если так сделать, тогда один работающий блок не будет мешать другому. Но встают вопросы: как данные вносимые в окно, отправлять в другие программы? и как окну получать данные из этих программ?
Можно ли оформить выполняемые функции в отдельных (.au3 или .exe) файлах, и основному окну обмениваться с ними данными?
У меня получается сделать рабочие блоки отдельными файлами, а посылать в них переменные из окна, и принимать из них переменные в окно, - не получается.
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3 090
Репутация
517
Укажи просто winapi.au3
Какая версия языка?
 
Автор
М

михаил15

Новичок
Сообщения
8
Репутация
0
AutoIt3, Version 1.79, Apr 16 2010 08:48:29. Некоторые библиотеки дополнительно скачиваю и собираю в папку программы AutoIt3, но указание на файл WinAPIEx.au3 в шапке создаваемой программы - не работает.
За совет спасибо, сообщения по поводу интеракции пока изучаю.
Несколько раз пытался скачать файлы по указателям на форуме, вида: (Файл: communication.au3), но меня выбрасывают на главную страницу форума. Я что-то неправильно делаю?
 

joiner

Модератор
Локальный модератор
Сообщения
3 090
Репутация
517
поищи по функции
Код:
_WinAPI_CreateFileMapping()

простая работа, передает строчные данные
 
Верх