Что нового

Несколько непонятных моментов в работе Autoit'а

mathem

Новичок
Сообщения
18
Репутация
0
Здравствуйте! Я хотел бы написать скрипт для автоматического ввода массива/матрицы в LaTeX'е, но столкнулся с несколькими непонятным для меня моментами. Не могли бы вы мне объяснить, в чем мои ошибки? Меня так же интересует, ошибаюсь ли я концептуально, т. е. так в принципе нельзя делать в автоите или все же можно, хоть и, возможно нежелательно: это признак дурного тона и т. д.

Первая проблема, которую я хотел бы обсудить, следующая. Вот я написал скрипт:
Код:
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <GUIConstants.au3>
#include <Misc.au3>

Global $GUI_1, $otmena_1, $ok_1, $otmena_2, $ok_2, $radio1, $radio2, $radio3, $vyrav, $abrakadabra

$GUI_0 = GUICreate("0Ввод окружения array", 300, 170)                           ;1
GUICtrlCreateLabel("Введите множество индексов столбцов", 10, 5)
$ok_0 = GUICtrlCreateButton("OK",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
GUICtrlCreateGroup("", 200, 128, 92, 32)
$otmena_0 = GUICtrlCreateButton("Cancel", 202, 130, 88, 28)
$stolb = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
GUICtrlSetData($stolb, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
ControlFocus("Ввод окружения array", "", $stolb)
GUISetState()

Global $a = 0

While 1
$msg = GUIGetMsg()
Switch $msg
   Case $GUI_EVENT_CLOSE
      ExitLoop
   Case $ok_0
      $a = $a-1
      ToolTip ($a, 0, 0)
   Case $otmena_0
      $a = $a+1
      ToolTip ($a, 0, 0)
EndSwitch
WEnd

Он работает так, как и было задумано, все хорошо. Там глобально объявляются переменные, которые я пропишу впоследствии. Но уже при попытке выполнения следующего скрипта
Код:
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <GUIConstants.au3>
#include <Misc.au3>

Global $GUI_1, $otmena_1, $ok_1, $otmena_2, $ok_2, $radio1, $radio2, $radio3, $vyrav, $abrakadabra

$GUI_0 = GUICreate("0Ввод окружения array", 300, 170)                           ;1
GUICtrlCreateLabel("Введите множество индексов столбцов", 10, 5)
$ok_0 = GUICtrlCreateButton("OK",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
GUICtrlCreateGroup("", 200, 128, 92, 32)
$otmena_0 = GUICtrlCreateButton("Cancel", 202, 130, 88, 28)
$stolb = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
GUICtrlSetData($stolb, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
ControlFocus("Ввод окружения array", "", $stolb)
GUISetState()

Func Massiv_1()
   GUIDelete($GUI_0)
   $GUI_1 = GUICreate("1Ввод окружения array", 300, 170)                           ;1
GUICtrlCreateLabel("Введите множество индексов строк", 10, 5)
$ok_1 = GUICtrlCreateButton("OK",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
$otmena_1 = GUICtrlCreateButton("Cancel", 202, 130, 88, 28)
$strok = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
GUICtrlSetData($strok, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
ControlFocus("Ввод окружения array", "", $strok)
GUISetState()
   EndFunc

Global $a = 0

While 1
$msg = GUIGetMsg()
Switch $msg
   Case $ok_0
        Massiv_1()
      Case $otmena_0
         $a = $a+1
         ToolTip ($a, 0, 0)
      Case $otmena_1
         $a = $a-1
         ToolTip ($a, 0, 0)
      EndSwitch
WEnd

Начинают происходить вещи, которые я местами могу понять лишь частично, а местами не понимаю и вовсе. А именно: при открытии первого окна число в тултипе начинает бешено убывать на 1. Но, мне кажется, я понимаю, почему это происходит: это из-за объявления $otmena_1 в самом начале. Правильно? Хотя вот сейчас я попробовал закомментировать эту кнопку в гуе 1 - так програ вообще перестала закрываться - тоже вещь для меня совершенно загадочная. Ладно. Допустим, эта кнопка не закомментена. Жму кнопку $ok_1. Число в тултипе останавливается, По нажатию кнопки $otmena_1 начинает на 1 уменьшаться, все ОК. Но... Програ перестает закрываться. А это почему так? Не могли бы вы мне пояснить?
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Начинают происходить вещи, которые я местами могу понять лишь частично, а местами не понимаю и вовсе.
1. При старте скрипта переменная $otmena_1 содержит ноль.
Функция GUIGetMsg() возращает тоже ноль, если не происходит ни каких нажатий на упр. элементы в окне.
Тогда и получается что Switch $msg = 0 и $otmena_1 = 0.
Вот по этому $a и уходит в глубокий минус.

2. После нажатия $ok_0, а не как вы сказали $ok_1, так вот при нажатии на $ok_0 запускается функция Massiv_1().
Теперь после вызова функции Massiv_1() переменная $otmena_1 содержит ID созданного эл. управления, т.е. уже не ноль.
Тогда и получается что Switch $msg = 0 а $otmena_1 > 0.
Вот по этому $a и перестает уходить в глубокий минус.

3. А программа не закрывается, так как в цикле Switch у вас не назначено проверка и действия при закрытии окна хоть первого, хоть второго.

ведь кнопка $ok_0 точно так же объявляется без присвоения значения.
переменной $ok_0 присваивается значение возращенное GUICtrlCreateButton()

Код:
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <GUIConstants.au3>
#include <Misc.au3>


Global $GUI_0, $ok_0, $otmena_0, $stolb
Global $GUI_1, $ok_1, $otmena_1, $strok
Global $a

$GUI_0 = GUICreate("0Ввод окружения array", 300, 170)                           ;1
GUICtrlCreateLabel("Введите множество индексов столбцов", 10, 5)
$ok_0 = GUICtrlCreateButton("OK",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
GUICtrlCreateGroup("", 200, 128, 92, 32)
$otmena_0 = GUICtrlCreateButton("Cancel", 202, 130, 88, 28)
$stolb = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
GUICtrlSetData($stolb, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
ControlFocus("Ввод окружения array", "", $stolb)
GUISetState()

While 1
   $msg = GUIGetMsg()
   If $msg = 0 Then ContinueLoop
   Switch $msg
      Case $GUI_EVENT_CLOSE
         ExitLoop
      Case $ok_0
        Massiv_1()
      Case $otmena_0
         $a = $a+1
         ToolTip ($a)
      Case $ok_1
         Massiv_2()
      Case $otmena_1
         $a = $a-1
         ToolTip ($a)
      EndSwitch
WEnd

Func Massiv_1()
   ;GUIDelete($GUI_0)
   ;WinWaitClose("0Ввод окружения array")
   $GUI_1 = GUICreate("1Ввод окружения array", 300, 170)                           ;1
   GUICtrlCreateLabel("Введите множество индексов строк", 10, 5)
   $ok_1 = GUICtrlCreateButton("OK",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
   $otmena_1 = GUICtrlCreateButton("Cancel", 202, 130, 88, 28)
   $strok = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
   GUICtrlSetData($strok, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
   ControlFocus("Ввод окружения array", "", $strok)
   GUISetState()
   GUIDelete($GUI_0)
EndFunc

Func Massiv_2()
   MsgBox(4096, "Test", "Это открылось сообщение от кнопки ok_2")
EndFunc
 
Последнее редактирование:
Автор
M

mathem

Новичок
Сообщения
18
Репутация
0
Нет не пустой строкой. Переменные типа Variant.
Нет, все-таки строкой:
Код:
Global $var
$type = VarGetType($var)
ConsoleWrite('1. ' & $type & @CRLF) ; String
ConsoleWrite(($var) & @CRLF)
ConsoleWrite('3. ' & (0 = $var) & @CRLF) ; True
$a = ""
ConsoleWrite('4. ' & ($a = $var) & @CRLF) ; True
ConsoleWrite('5. ' & ($a = 0) & @CRLF)  ; True
$type_a =  VarGetType($a)
ConsoleWrite('6. ' & $type_a & @CRLF) ;String
$b = "Какая-то там строка"
ConsoleWrite(('7. ') & ($b = 0) & @CRLF) ;True
$type_b = VarGetType($b)     ;String
ConsoleWrite('8. ' & $type_b & @CRLF) ; String
ConsoleWrite('9. ' & ($a = False) & @CRLF) ;True
ConsoleWrite('10. ' & ($b = True) & @CRLF) ;True

В консоли строки с первую по третью отображаются следующим образом:
Код:
1. String

3. True

Хотя да, в справке сказано, что
Типы данных
Используется только один тип данных - Variant. Он позволяет поддерживать текстовые/числовые данные и обеспечить контекстное преобразование тип по месту использования. Например, если переменная входит в состав арифметического выражения, то используется числовое предствление, а в текстовых выражениях это же выражение будет представлено в виде строки текста.
Получается, что нулю равна как пустая, так и непустая строка, тогда как False равна только пустая. Как-то странно. Получается что, что в автоите нет взаимно-однозначного соответствия 0 с False и 1 с True?
Сообщение автоматически объединено:

переменной $ok_0 присваивается значение возращенное GUICtrlCreateButton()
Потому что создание $ok_0 не ожидает себя в функции, а происходит сразу после старта скрипта, да?
Сообщение автоматически объединено:

Нет не пустой строкой. Переменные типа Variant. Если переменная создана но значение не присвоено, у нее нет типа как такового.
Получается, все же, строкой:
Код:
Global $var
$type = VarGetType($var)
ConsoleWrite('1. ' & $type & @CRLF) ; String

Сообщение автоматически объединено:


Сообщение автоматически объединено:

1. При старте скрипта переменная $otmena_1 содержит ноль.
Это в совокупности с тем, что $otmena_1 объявляется первой, да? Т. е. $otmena_1 - первый в объявлении равен 0. Поэтому срабатывает именно он, неважно, является ли он элементом управления или нет. Правильно?
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Это в совокупности с тем, что $otmena_1 объявляется первой, да? Т. е. $otmena_1 - первый в объявлении равен 0. Поэтому срабатывает именно он, неважно, является ли он элементом управления или нет. Правильно?
Да.
 
Автор
M

mathem

Новичок
Сообщения
18
Репутация
0
ледовательно, если вы хотите зарезервировать переменную для контрола, то объявляйте её с присвоением -1. Потому что GUIGetMsg не возвращает такой код (см. GuiConstantsEx.au3)
Код:
Это же получается, что для таких целей переменную можно объявить вообще с каким угодно значением, лишь бы это значение не было значением из файла GuiConstantsEx.au3?
Сообщение автоматически объединено:

Всем большое спасибо за ответы Продолжаю разбираться. Вот я написал код:
Код:
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <GUIConstants.au3>
#include <Misc.au3>

Global $a, $ok_0, $ok_1 = -1, $otmena_1 = -1, $ok_2 = -1, $otmena_2 = -1, $radio1 = -1, $radio2 = -1, $radio3 = -1 ;$otmena_1=-1, $ok_1 = -1, $otmena_2, $ok_2, $radio1, $radio2, $radio3, $vyrav, $abrakadabra

$GUI_0 = GUICreate("0Ввод окружения array", 300, 170)                           
GUICtrlCreateLabel("Введите множество индексов столбцов", 10, 5)
$ok_0 = GUICtrlCreateButton("OK",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) 
GUICtrlCreateGroup("", 200, 128, 92, 32)
$otmena_0 = GUICtrlCreateButton("Cancel", 202, 130, 88, 28)
$stolb = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
GUICtrlSetData($stolb, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
ControlFocus("Ввод окружения array", "", $stolb)
GUISetState()

Func Massiv_1()
   ;GUIDelete($GUI_0)
   ;WinWaitClose("0Ввод окружения array")
   Global $GUI_1 = GUICreate("1Ввод окружения array", 300, 170)
GUICtrlCreateLabel("Введите множество индексов строк", 10, 5)
$ok_1 = GUICtrlCreateButton("OK",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
$otmena_1 = GUICtrlCreateButton("Cancel", 202, 130, 88, 28)
$strok = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
GUICtrlSetData($strok, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
ControlFocus("Ввод окружения array", "", $strok)
GUISetState()
  GUIDelete($GUI_0)
   EndFunc

Func Massiv_2()
Global $GUI_2 = GUICreate("2Ввод окружения array", 300, 170)
;GUISetIcon(@ScriptDir & "\matrix.ico")
GUICtrlCreateLabel("Выберите желаемое горизонтальное" & @CRLF & "ыравнивание", 10, 5)
$radio1 = GUICtrlCreateRadio("l", 10, 40, 120, 20)
$radio2 = GUICtrlCreateRadio("c", 10, 70, 120, 20)
$radio3 = GUICtrlCreateRadio("r", 10, 100, 120, 20)
GUICtrlSetState($radio3,$GUI_CHECKED)

$ok_2 = GUICtrlCreateButton("OK",  10, 133, 88, 28, $BS_DEFPUSHBUTTON) ;
$otmena_2 = GUICtrlCreateButton("Cancel", 202, 130, 88, 28)

GUISetState()
GUIDelete($GUI_1)
EndFunc

Func Massiv_3()
      MsgBox(4096, "Test", "Это открылось сообщение от кнопки ok_2")
   EndFunc

Global $a = 0
Global $id_ok_0 = GUICtrlGetHandle($ok_0)
Global $id_radio1 = GUICtrlGetHandle($radio1)
Global $id_ok_2 = GUICtrlGetHandle($ok_2)

While 1
$msg = GUIGetMsg()
Switch $msg
      Case $GUI_EVENT_CLOSE
         ExitLoop
      Case $ok_0
        Massiv_1()
      Case $otmena_0
         ExitLoop
      Case $ok_1
         Massiv_2()
      Case $otmena_1
         ExitLoop
      Case $ok_2
         Massiv_3()
      Case $otmena_2
         ExitLoop
      EndSwitch
      If WinActive("2Ввод окружения array") Then
   $a = GUICtrlGetHandle($radio1)
Else
   $a = 10
EndIf
      ToolTip("$ok_0: " & $id_ok_0 & @CRLF & "$radio1: " & $a & @CRLF & "$ok_2: " & $id_ok_2, 0, 0)
   WEnd

Почему при выделении $radio1 открывается окно 1Ввод окружения array ? Создается такое впечатление, что идентификатор $ok_0 переходит на $radio1. Однако инфа в тултипе это как бы не подтверждает. А тогда что? Почему так происходит и как это устранить? Ситуация как будто похожа на ситуацию с кнопкой $ok_1 из поста 4. И как быть? На этот раз закрытие $GUI_0 в конце функции - явно не решение проблемы.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
537
Репутация
65
Почему при выделении $radio1 открывается окно 1Ввод окружения array ? Создается такое впечатление, что идентификатор $ok_0 переходит на $radio1.
Я отвечал на этот вопрос
Закрывая окно $GUI_0, автоматически освобождаются все элементы управления и есть вероятность что идентификатор $ok_1 будет равен $ok_0.
Я написал что они освобождаются и их дескрипторы система может использовать для других создаваемых элементов что и происходит.
Как этого избежать тоже написал
Не обрабатывайте события не существующих окон.
https://autoit-script.ru/threads/neskolko-neponjatnyx-momentov-v-rabote-autoita.28712/#post-157575
 
Автор
M

mathem

Новичок
Сообщения
18
Репутация
0
Попробовал так:
Код:
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <GUIConstants.au3>
#include <Misc.au3>

Global $GUI_1=0, $GUI_2=0, $otmena_1, $ok_1, $otmena_2, $ok_2, $radio1, $radio2, $radio3, $vyrav

$GUI_0 = GUICreate("0Ввод окружения array", 300, 170)                           
GUICtrlCreateLabel("Введите множество индексов столбцов", 10, 5)
$ok_0 = GUICtrlCreateButton("OK",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
GUICtrlCreateGroup("", 200, 128, 92, 32)
$otmena_0 = GUICtrlCreateButton("Cancel", 202, 130, 88, 28)
$stolb = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
GUICtrlSetData($stolb, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
ControlFocus("Ввод окружения array", "", $stolb)
GUISetState()

Func Massiv_1()
    $GUI_1 = GUICreate("1Ввод окружения array", 300, 170)                           
    GUICtrlCreateLabel("Введите множество индексов строк", 10, 5)
    $ok_1 = GUICtrlCreateButton("OK",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
    $otmena_1 = GUICtrlCreateButton("Cancel", 202, 130, 88, 28)
    $strok = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
    GUICtrlSetData($strok, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
    ControlFocus("Ввод окружения array", "", $strok)
    GUISetState()
    GUIDelete($GUI_0)
EndFunc

Func Massiv_2()

$GUI_2 = GUICreate("2Ввод окружения array", 300, 170)
GUICtrlCreateLabel("Выберите желаемое горизонтальное" & @CRLF & "ыравнивание", 10, 5)
$radio1 = GUICtrlCreateRadio("l", 10, 40, 120, 20)
$radio2 = GUICtrlCreateRadio("c", 10, 70, 120, 20)
$radio3 = GUICtrlCreateRadio("r", 10, 100, 120, 20)
GUICtrlSetState($radio3,$GUI_CHECKED)

$ok_2 = GUICtrlCreateButton("OK",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
$otmena_2 = GUICtrlCreateButton("Cancel", 202, 130, 88, 28)

GUISetState()

GUIDelete($GUI_1)
EndFunc

Global $a = 0

Func Massiv_3($vyrav)
   MsgBox(4096, "Test", $vyrav)

   EndFunc


While $GUI_0 or $GUI_1 or $GUI_2
    $msg = GUIGetMsg()

    if $GUI_0 Then
        Switch $msg
          Case $GUI_EVENT_CLOSE
             GUIDelete($GUI_0)
             $GUI_0=0
          Case $ok_0
            Massiv_1()
          Case $otmena_0
             ExitLoop
        EndSwitch
    endif

    if $GUI_1 Then
        Switch $msg
          Case $GUI_EVENT_CLOSE
             GUIDelete($GUI_1)
             $GUI_1=0
          Case $ok_1
            Massiv_2()
          Case $otmena_1
             ExitLoop
        EndSwitch
     endif

     if $GUI_2 Then
        Switch $msg
          Case $GUI_EVENT_CLOSE
             GUIDelete($GUI_2)
             $GUI_2=0
          Case $ok_2
         If BitAND(GUICtrlRead($radio1), $GUI_CHECKED) = $GUI_CHECKED Then Massiv_3("l")
         If BitAND(GUICtrlRead($radio2), $GUI_CHECKED) = $GUI_CHECKED Then Massiv_3("c")
         If BitAND(GUICtrlRead($radio3), $GUI_CHECKED) = $GUI_CHECKED Then Massiv_3("r")
          Case $otmena_2
             ExitLoop
        EndSwitch
     endif

 WEnd

Не-а: при выборе $radio1 упорно открывается окно 1Ввод окружения array и все тут. Что делать?
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
537
Репутация
65
После закрытия окна, переменную хранящую его идентивикатор нужно обнулять.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Код:
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <GUIConstants.au3>
#include <Misc.au3>

Global $a = -1

While $a
   Switch $a
   Case -1, 1
      $a = Massiv_1()
   Case 2
      $a = Massiv_2()
   Case 3
      $a = Massiv_3()
   EndSwitch
WEnd

Func Massiv_1()
   Local $i_Result
   Local $GUI_1 = GUICreate("0Ввод окружения array", 300, 170)
   GUICtrlCreateLabel("Введите множество индексов столбцов", 10, 5)
   Local $ok_1 = GUICtrlCreateButton("Next",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
   GUICtrlCreateGroup("", 200, 128, 92, 32)
   Local $otmena_1 = GUICtrlCreateButton("Exit", 202, 130, 88, 28)
   Local $stolb = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
   GUICtrlSetData($stolb, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
   ControlFocus("Ввод окружения array", "", $stolb)
   GUISetState()
   While 1
      Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE, $otmena_1
         ExitLoop
      Case $ok_1
         $i_Result = 2
         ExitLoop
      EndSwitch
   WEnd
   GUIDelete($GUI_1)
   Return $i_Result
EndFunc

Func Massiv_2()
   Local $i_Result
   Local $GUI_2 = GUICreate("1Ввод окружения array", 300, 170)
   GUICtrlCreateLabel("Введите множество индексов строк", 10, 5)
   Local $ok_2 = GUICtrlCreateButton("Next",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
   Local $otmena_2 = GUICtrlCreateButton("Back", 202, 130, 88, 28)
   Local $strok = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
   GUICtrlSetData($strok, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
   ControlFocus("Ввод окружения array", "", $strok)
   GUISetState()
   While 1
      Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
         ExitLoop
      Case $ok_2
         $i_Result = 3
         ExitLoop
      Case $otmena_2
         $i_Result = 1
         ExitLoop
      EndSwitch
   WEnd
   GUIDelete($GUI_2)
   Return $i_Result
EndFunc

Func Massiv_3()
   Local $i_Result
   Local $GUI_3 = GUICreate("2Ввод окружения array", 300, 170)
   GUICtrlCreateLabel("Выберите желаемое горизонтальное" & @CRLF & "ыравнивание", 10, 5)
   Local $radio1 = GUICtrlCreateRadio("l", 10, 40, 120, 20)
   Local $radio2 = GUICtrlCreateRadio("c", 10, 70, 120, 20)
   Local $radio3 = GUICtrlCreateRadio("r", 10, 100, 120, 20)
   GUICtrlSetState($radio3,$GUI_CHECKED)
   Local $ok_3 = GUICtrlCreateButton("OK",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
   Local $otmena_3 = GUICtrlCreateButton("Back", 202, 130, 88, 28)
   GUISetState()
   While 1
      Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
         ExitLoop
      Case $ok_3
         If BitAND(GUICtrlRead($radio1), $GUI_CHECKED) = $GUI_CHECKED Then Massiv_4("l")
         If BitAND(GUICtrlRead($radio2), $GUI_CHECKED) = $GUI_CHECKED Then Massiv_4("c")
         If BitAND(GUICtrlRead($radio3), $GUI_CHECKED) = $GUI_CHECKED Then Massiv_4("r")
      Case $otmena_3
         $i_Result = 2
         ExitLoop
      EndSwitch
   WEnd
   GUIDelete($GUI_3)
   Return $i_Result
EndFunc

Func Massiv_4($vyrav)
   MsgBox(4096, "Test", $vyrav)
EndFunc

Код:
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <GUIConstants.au3>
#include <Misc.au3>

$GUI_1 = GUICreate("0Ввод окружения array", 300, 170)
GUICtrlCreateLabel("Введите множество индексов столбцов", 10, 5)
$ok_1 = GUICtrlCreateButton("Next",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
GUICtrlCreateGroup("", 200, 128, 92, 32)
$otmena_1 = GUICtrlCreateButton("Exit", 202, 130, 88, 28)
$stolb = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
GUICtrlSetData($stolb, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
ControlFocus("Ввод окружения array", "", $stolb)

$GUI_2 = GUICreate("1Ввод окружения array", 300, 170)
GUICtrlCreateLabel("Введите множество индексов строк", 10, 5)
$ok_2 = GUICtrlCreateButton("Next",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
$otmena_2 = GUICtrlCreateButton("Back", 202, 130, 88, 28)
$strok = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 65, 280, 21)
GUICtrlSetData($strok, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
ControlFocus("Ввод окружения array", "", $strok)

$GUI_3 = GUICreate("2Ввод окружения array", 300, 170)
GUICtrlCreateLabel("Выберите желаемое горизонтальное" & @CRLF & "ыравнивание", 10, 5)
$radio1 = GUICtrlCreateRadio("l", 10, 40, 120, 20)
$radio2 = GUICtrlCreateRadio("c", 10, 70, 120, 20)
$radio3 = GUICtrlCreateRadio("r", 10, 100, 120, 20)
GUICtrlSetState($radio3,$GUI_CHECKED)
$ok_3 = GUICtrlCreateButton("OK",  10, 130, 88, 28, $BS_DEFPUSHBUTTON) ;
$otmena_3 = GUICtrlCreateButton("Back", 202, 130, 88, 28)

GUISetState(@SW_SHOW, $GUI_1)

While 1
   Switch GUIGetMsg()
   Case $GUI_EVENT_CLOSE, $otmena_1
      ExitLoop
   Case $ok_1
      GUISetState(@SW_HIDE, $GUI_1)
      GUISetState(@SW_SHOW, $GUI_2)
   Case $ok_2
      GUISetState(@SW_HIDE, $GUI_2)
      GUISetState(@SW_SHOW, $GUI_3)
   Case $otmena_2
      GUISetState(@SW_HIDE, $GUI_2)
      GUISetState(@SW_SHOW, $GUI_1)
   Case $otmena_3
      GUISetState(@SW_HIDE, $GUI_3)
      GUISetState(@SW_SHOW, $GUI_2)
   Case $ok_3
      If BitAND(GUICtrlRead($radio1), $GUI_CHECKED) = $GUI_CHECKED Then Massiv_4("l")
      If BitAND(GUICtrlRead($radio2), $GUI_CHECKED) = $GUI_CHECKED Then Massiv_4("c")
      If BitAND(GUICtrlRead($radio3), $GUI_CHECKED) = $GUI_CHECKED Then Massiv_4("r")
   EndSwitch
WEnd

Func Massiv_4($vyrav)
   MsgBox(4096, "Test", $vyrav)
EndFunc
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Получается что, что в автоите нет взаимно-однозначного соответствия 0 с False и 1 с True?
Все правила однозначно описаны здесь:

А так не проще?
Код:
#include <GUIConstants.au3>

$GUI = GUICreate("Ввод окружения", 300, 200)
GUICtrlCreateLabel("Введите или выберите множество индексов столбцов", 10, 10)
$stolb = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 25, 280, 20)
GUICtrlSetData($stolb, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
GUICtrlCreateLabel("Введите или выберите множество индексов строк", 10, 55)
$strok = GUICtrlCreateCombo('1, 2, \ldots, i-1, i, i+1, \ldots, j-1, j, j+1, \ldots, n', 10, 70, 280, 20)
GUICtrlSetData($strok, '1, 2, \ldots, i-1, i, i+1, \ldots, n-1, n|1, 2, \ldots, k-1, k, k+1, \ldots, n-1, n')
GUICtrlCreateLabel("Выберите желаемое горизонтальное выравнивание", 10, 100)
$radio1 = GUICtrlCreateRadio("l", 30, 115)
$radio2 = GUICtrlCreateRadio("c", 140, 115)
$radio3 = GUICtrlCreateRadio("r", 250, 115)
GUICtrlSetState($radio3, $GUI_CHECKED)
$otmena = GUICtrlCreateButton("Cancel",  10, 160, 80, 30)
$ok = GUICtrlCreateButton("OK", 210, 160, 80, 30, $BS_DEFPUSHBUTTON)
GUISetState()

While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE, $otmena
      Exit
    Case $ok
      $combo1 = GUICtrlRead($stolb)
      $combo2 = GUICtrlRead($strok)
      Select
        Case GUICtrlRead($radio1) = $GUI_CHECKED
          $align = "l"
        Case GUICtrlRead($radio2) = $GUI_CHECKED
          $align = "c"
        Case GUICtrlRead($radio3) = $GUI_CHECKED
          $align = "r"
      EndSelect
      MsgBox(0, "Выбор пользователя", $combo1 & @CRLF & $combo2 & @CRLF & $align, 0, $GUI)
      ; Exit
  EndSwitch
WEnd
 
Автор
M

mathem

Новичок
Сообщения
18
Репутация
0
Вы извините, пожалуйста, за мое резкое исчезновение из темы. Просто неожиданно появились проблемы. Я пока не смогу, наверное, в ближайшие дни продолжить обсуждение, несмотря на то, что тема не закончена. А пока я хочу поблагодарить всех помогавших мне людей. Спасибо большое.
 
Верх