Что нового

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

mathem

Новичок
Сообщения
26
Репутация
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
Сообщения
259
Репутация
66
Начинают происходить вещи, которые я местами могу понять лишь частично, а местами не понимаю и вовсе.
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

Новичок
Сообщения
26
Репутация
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
Сообщения
259
Репутация
66
Это в совокупности с тем, что $otmena_1 объявляется первой, да? Т. е. $otmena_1 - первый в объявлении равен 0. Поэтому срабатывает именно он, неважно, является ли он элементом управления или нет. Правильно?
Да.
 
Автор
M

mathem

Новичок
Сообщения
26
Репутация
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

Продвинутый
Сообщения
598
Репутация
77
Почему при выделении $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

Новичок
Сообщения
26
Репутация
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

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

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Код:
#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,951
Репутация
1,446
Получается что, что в автоите нет взаимно-однозначного соответствия 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

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

И снова здравствуйте! Примеры кодов, обсуждавшихся в этой теме, предложенные моими собеседниками до настоящего момента, конечно, очень интересные, комментарии к кодам этой темы до настоящего момента вообще мне многое помогли понять, но сейчас меня занесло несколько в другую сторону. А именно. Ранее, в другой теме, я писал, что
Сейчас сидит идея написания самого простейшего просмотрщика фото, чтоб вообще без кнопок в GUI
Так вот. Наконец-то у меня до этого дошли руки. Однако в процессе написания программы я понял, что, помимо всего прочего, хочу от своей программы и того, чтобы вот, когда в ней в каком-нибудь окне открыта какая-то фотка и, если это окно активно, то, чтобы при нажатии клавиши "и" имя внизу этого окна появлялся тултип с именем этого фото, если такого тултипа в настоящий момент нет. А, если он в настоящий момент есть, то, чтобы при нажатии клавиши "и" этот тултип исчезал. Для этого я включил в мою программу функцию imja_foto. Когда же это какое-нибудь окно неактивно, эта функция просто вводит букву "и" . Как работает эта функция вы поймете из приводимого мной ниже имеющегося у меня на сегодняшний день варианта программы. Кроме того, в процессе написания программы, при тестировании промежуточных вариантов кода, выяснилось, что при резком "соударении" окна моей программы с открытым в нем фото о стенки монитора это изображение перестает отображаться в этом окне, когда с первого раза сразу, когда с первого раза не сразу, а через несколько "соударении" -это неважно. А важно то, что с этим пришлось что-то делать. А именно - включить в мой просмотрщик функцию obnovlenie. Эта функция обновляет это фото, когда это окно активно и вводит букву "о" и навешана эта функция на клавишу "о", потому что obnovlenie , когда окне неактивно. Как работает эта функция будет видно также из приведенного мной ниже варианта программы. Вот тоже непонятный момент - почему исчезает фото при таком "соударении"? Это что, в некотором смысле, "слабость" Автоита - не может произвести в ненужном объяснять смысле "сильных" ехе-шников или что? Что это? Ведь в просмотрщиках фото, созданных, судя по всему, в других ЯП, такого не наблюдается, крепко сидят в них открытые в них фото по возможности объясните, пожалуйста, этот момент. Но это я отошел немного в сторону. Возвращаюсь. Еще я закладывал в мой просмотрщик то, что, если какое-то фото открыто в его окне и это фото в настоящий момент активно, то, чтобы при нажатии клавиши Esc это окно закрывалось. Короче, чтобы было все, как у людёв. Итак, имея ввиду изложенные выше пожелания и обстоятельства, на сегодняшний день пришел к следующему коду:
Код:
;MsgBox(4096, "Test", $name)
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <GUIConstants.au3>
#include <Misc.au3>

HotKeySet("{ESC}", "_MyFuncVyhod") ;выход
HotKeySet("и", "imja_foto")
HotKeySet("о", "obnovlenie")

$a = 0

Global $chasti_puti = StringSplit($CmdLIne[1], "\")
Global $name = $chasti_puti[$chasti_puti[0]], $prosto_per
_Foto()

While 1
    ToolTip("", 0, 0)
    If WinActive($id_okna) Then $koord = WinGetPos($id_okna)
    If $a = 1 Then ToolTip($name, $koord[0], $koord[1]+$koord[3]-3)
    ;ToolTip("Контрольный тултип " & $a & $name, 0, 0)
    Sleep(100)
     $msg = GUIGetMsg()
  Select
  Case $msg = $prosto_per
 
  Case $msg = $GUI_EVENT_CLOSE
      _GDIPlus_GraphicsDispose($hGraphic)
      _GDIPlus_ImageDispose($hImage)
      _GDIPlus_Shutdown()
      Exit
  EndSelect

WEnd

Func _Foto()
_GDIPlus_Startup()
Global $hImage = _GDIPlus_ImageLoadFromFile($CmdLIne[1])
$shirina = _GDIPlus_ImageGetWidth($hImage)
$vysota = _GDIPlus_ImageGetHeight($hImage)

; Create GUI

Global $hGUI = GUICreate("Мой просмотрщик", $shirina+10, $vysota+10, @DesktopWidth-25-$shirina, 15)
;$hGUI = GUICreate("Мой просмотрщик")
GUISetIcon(@ScriptDir & "\buffer-view.ico")
GUISetState()
; Load PNG image
Global $id_okna = WinGetHandle($hGUI)
; Draw PNG image
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 5, 5)

EndFunc

Func imja_foto()
If WinActive($id_okna) Then
$a = 1-$a
Else
HotKeySet("и")
Send("и")
HotKeySet("и", "imja_foto")
EndIf
EndFunc

Func obnovlenie()
If WinActive($id_okna) Then
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 5, 5)
Else
HotKeySet("о")
Send("о")
HotKeySet("о", "obnovlenie")
EndIf
EndFunc

Func _MyFuncVyhod()
If WinActive($id_okna) Then
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
Exit
EndIf
EndFunc

На комментарии в коде не обращайте пока внимания, это так, на время разработки, когда буду писать начисто, их удалю. Тестирование ехе-шника, полученного из этого кода, показало, что в моем просмотрщике работают все функции, которые я в него закладывал: когда активно окно с открытым в нем фото, то при нажатии клавиши "и" внизу этого фото начинает мерцать/мигать тултип с выведенным в него именем, если этого тултипа до сих пор там не было. Если же он там был, то этот тултип исчезает. Если же окно моего просмотрщика не активно, а активно окно какого-нибудь текстового редактора/текстового процессора, то в это активное окно редактора/процессора вводится буква "и". Точно так же, когда активно окно с открытым в нем фото, то при нажатии клавиши "о" происходит перерисовка переставшего отображаться или ставшего отображаться лишь частями, местами фото. Если же это окно не активно, а активно окно того же редактора/процессора, то ту да происходит ввод буквы "о". Наконец, если окно просмотрщика с отображающимся в нем фото активно, то при нажатии клавиши Esc происходит закрытие этого окна. Если же это окно неактивно, то нажатие клавиши Esc не вызывает его закрытия - все идеально. Но такую идеальную, не вызывающую вопросов, работу, мой просмотрщик показывает только тогда, когда открыт 1 его экземпляр. Как только я с его помощью откраваю второе фото, отображаемое моим просмотрщиком вместе с первым, начинаю твориться совершенно непонятные для меня вещи. А именно. Все прописанные мной в программе функции - имя, обновление, закрытие - срабатывают только тогда, когда активно окно с первым (по очереди) открытым в моем просмотрщике фото. Как только активно окно со вторым (по очереди) открытым в моем просмотрщике фото, нажатие клавиш, названных мной выше, вообще ничего не выполняет. Тогда, чтобы хоть как-посмотреть, а что же именно происходит при открытии фото моим просмотрщиком, я сделал немного другую версию моего просмотрщика - вставил месседжбоксы с выводом в него обрабатываемых в данном месте могущих быть интересными переменными. И в циклически бесконечный тултип тоже вывел переменную. Короче, контрольная версия моего просмотрщика выглядит так:
Код:
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <GUIConstants.au3>
#include <Misc.au3>

HotKeySet("{ESC}", "_MyFuncVyhod") ;выход
HotKeySet("и", "imja_foto")
HotKeySet("о", "obnovlenie")

$a = 1

For $i =0 To $CmdLIne[0]
MsgBox(4096, "Test", $CmdLIne[$i])
Next

$n = InputBox("", "", "")

Global $chasti_puti = StringSplit($CmdLIne[1], "\")
Global $name = $chasti_puti[$chasti_puti[0]], $prosto_per
_Foto()

While 1
    ToolTip("", 0, 0)
    If WinExists($id_okna) Then ToolTip($id_okna & ", " & $name & ", $a=" & $a & ", $n=" & $n, 0, 30*$n)
    If WinActive($id_okna) Then $koord = WinGetPos($id_okna)
    If $a = 1 Then ToolTip($name, $koord[0], $koord[1]+$koord[3]-3)
    ;ToolTip("Контрольный тултип " & $a & $name, 0, 0) 
    Sleep(100)
     $msg = GUIGetMsg()
  Select
  Case $msg = $prosto_per
  
  Case $msg = $GUI_EVENT_CLOSE
      _GDIPlus_GraphicsDispose($hGraphic)
      _GDIPlus_ImageDispose($hImage)
      _GDIPlus_Shutdown()
      Exit
  EndSelect

WEnd

Func _Foto()
MsgBox(4096, "Test", $CmdLIne[1])
_GDIPlus_Startup()
Global $hImage = _GDIPlus_ImageLoadFromFile($CmdLIne[1])
$shirina = _GDIPlus_ImageGetWidth($hImage)
$vysota = _GDIPlus_ImageGetHeight($hImage)

; Create GUI

Global $hGUI = GUICreate("Мой просмотрщик", $shirina+10, $vysota+10, @DesktopWidth-25-$shirina, 15)
;$hGUI = GUICreate("Мой просмотрщик")
GUISetIcon(@ScriptDir & "\buffer-view.ico")
GUISetState()
; Load PNG image
Global $id_okna = WinGetHandle($hGUI)
MsgBox(4096, "Test", $id_okna)
; Draw PNG image
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 5, 5)

EndFunc

Func imja_foto()
If WinActive($id_okna) Then
$a = 1-$a
Else
HotKeySet("и")
Send("и")
HotKeySet("и", "imja_foto")
EndIf
EndFunc

Func obnovlenie()
If WinActive($id_okna) Then
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 5, 5)
Else
HotKeySet("о")
Send("о")
HotKeySet("о", "obnovlenie")
EndIf
EndFunc

Func _MyFuncVyhod()
If WinActive($id_okna) Then
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
Exit
EndIf
EndFunc

Там InputBox $n нужен для разведения тултипов по вертикали, когда в просмотрщике фото открыто несколько, чтоб эти тултипы в этом случае не накладывались друг на друга. Ну, вы поймете. Хотя практика тестирования программы, ехе-шника, полученного из этого кода и показывает, что толку от этих тултипов, когда в этой контрольной программе открыто несколько фото, и не столько, сколько хотелось бы: эти тултипы начинают так быстро мерцать, появляться и исчезать, что разглядеть что-либо в них, становится невозможно, но все-таки, хоть что-то. Итак, что же показали эти тестирования? А показали они то, что в цикле вначале этого тестировщика значения переменных выводится правильно как для первого из открытых фото, так и для открытых впоследствии: Далее MsgBox'ы, создаваемые этим тестировщиком, когда он выполняет команды функции _Foto(), имеют правильное содержание, и Handle при открытии нескольких фото для каждого фото выводится свой, уникальный, отличный от Handle других, уже существующих, окон просмотрщика. И, наконец, значения переменных $id_okna и $name, которые выводятся в бесконечный тултип, для каждого окна различные и, что, самое главное, верные! Что очень обнадеживает! Значит, и в бесконечном цикле каждого окна правильно известно имя того фото, которое в нем отображается. А вот с определенными мной функциями и в этом случае ситуация точь-в-точь, как и в предыдущем: в первом из открытых окон эти функции работают идеально, зато ни в одном из окон, открытых впоследствии, ни одна из функций не работает. И что делать, как подправить код, чтобы полученная программа работала правильно? Подскажите, пожалуйста.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
598
Репутация
77
Слишком много текста. Научитесь более кратко излагать свои мысли.

чтобы при нажатии клавиши "и"
Зачем отправляете этот код клавиши функцией Send()?

при резком "соударении" окна моей программы с открытым в нем фото о стенки монитора это изображение перестает отображаться в этом окне
Как написали так и работает.

Это что, в некотором смысле, "слабость" Автоита - не может произвести в ненужном объяснять смысле "сильных" ехе-шников или что?
Так написан код. Не нужно винить инструмент только потому что его неправильно используете.

Все прописанные мной в программе функции - имя, обновление, закрытие - срабатывают только тогда, когда активно окно с первым (по очереди) открытым в моем просмотрщике фото. Как только активно окно со вторым (по очереди) открытым в моем просмотрщике фото, нажатие клавиш, названных мной выше, вообще ничего не выполняет.
Если два скрипта AutoIt устанавливают одни и те же горячие клавиши, вы должны избегать запуска этих скриптов одновременно (второй скрипт не сможет установить горячую клавишу, пока первый скрипт не завершит свою работу или не сбросит горячую клавишу).
 
Автор
M

mathem

Новичок
Сообщения
26
Репутация
0
Зачем отправляете этот код клавиши функцией Send()?
А что, можно как-то иначе ввести букву "и"? Я пробовал функцией ControlSend, но для того управляющего элемента, в который нужно вводить эту букву, не определяется controlID.
Как написали так и работает.
Так написан код. Не нужно винить инструмент только потому что его неправильно используете.
Так я ж и не настаиваю на своем варианте. Я просто его привел. Теперь жду ваших указаний, в какую сторону смотреть для исправления положения.
Prog:
Если два скрипта AutoIt устанавливают одни и те же горячие клавиши, вы должны избегать запуска этих скриптов одновременно (второй скрипт не сможет установить горячую клавишу, пока первый скрипт не завершит свою работу или не сбросит горячую клавишу).
Так, значит, средствами Автоита это не реализовать?
ез отладчика не так просто
Ну вот, началось...
Я так понимаю, здесь была не одна горячая дискуссия по этому поводу. Не могли бы вы дать ссылку на несколько из них? А то поиск по форуму что-то ничего подходящего/интересного не дает. Наверное, как-то не так написал запрос.
 
Последнее редактирование:
Автор
M

mathem

Новичок
Сообщения
26
Репутация
0
Я этот просмотрщик сделал для того, чтобы прикрутить к программе https://www.lyx.org/. Теперь у меня так. Вот я закончил писать формулу. А программа LyX устроена таким образом, что, когда закончил писать формулу и выходишь тз окошечка, математического режима в котором эту формулу писал, то в соответствующей одноразовой для данной сессии временной папке генерируется .tex-файл с latex-кодом этой формулы, на него Python натравливает свой скрипт, этот скрипт компилирует из этого tex-файла фотку .png с изображением этой формулы и эта формула начинает отображаться в окне программы LyX. Так вот, я захотел сделать так, чтобы, когда нужно, можно было делать так, чтобы это фото отображалась не только в окне программы LyX, но и в отдельном окне. Для этого я написал еще одну программу, которая по параметрам, с которыми запустился Python, вычисляет абсолютный путь к этому фото и с этим абсолютным путем, как с параметром, запускает этот мой просмотрщик фото. Собственно, непосредственно к LyX прикрутил ту программу, а уже к той программе я прикрутил свой просмотрщик фото. Так вот, теперь, если мне нужно, чтобы только что написанная мной формула отображалась еще и в отдельном окне, мне перед выходом из окошечка того математического режима, в котором я эту формулу набирал, можно просто нажать сочетание Alt+стрелка вправо Это запустит еще одну маленькую программку из трех команд. Эта программка в свою очередь и запустит программу, вычисляющую абсолютный путь фото, и так далее, по цепочке. Этот просмотрщик я создал в основном для просмотра типа фото, приведенных во вложении к этому посту. Ну и, соответственно, результаты нажатия клавиш, на которые я навесил хоткеи в моем просмотрщике, должны теперь зависеть от того, активно ли в момент нажатия окно моего просмотрщика или окно LyX. Так-то все работает, когда в моем просмотрщике висит 1 формула. Вот когда их несколько...
З. Ы. Старался как можно кратко. Просто такое в двух словах не объяснишь.
Сообщение автоматически объединено:

Не нужно винить инструмент только потому что его неправильно используете.
Основополагающая идея моей программы не моя, а взята мной файла ShowPNG.au3 из папки примеров, расположенной в папке Автоита. Если посмотреть не комментарии в моей программе, то какие-то комменты в ней - это просто неудаленные мной комменты из того файла. Сам бы я еще довольно-таки долго не взялся за написание такой достаточно сложной для меня на сегодняшний день программы. А тут все подано на блюдечке. Бери и делай под себя. Вот я подумал, что, если уж такой дефект присутствует в программе, полученной из кода, даваемого в примерах к этому языку самими создателями этого языка, то этот дефект присущ вообще языку в целом.

Если два скрипта AutoIt устанавливают одни и те же горячие клавиши, вы должны избегать запуска этих скриптов одновременно (второй скрипт не сможет установить горячую клавишу, пока первый скрипт не завершит свою работу или не сбросит горячую клавишу).
а не подскажите пример языка программирования, в котором это ограничение отсутствует?
А так эту проблему обошел при помощи контекстного меню. Вам спасибо за то, что объяснили причину происходящего.
 

Вложения

  • lyxpreviewbsbEhA1.png
    lyxpreviewbsbEhA1.png
    664 байт · Просмотры: 0
  • lyxpreviewEloUaT1.png
    lyxpreviewEloUaT1.png
    1.7 КБ · Просмотры: 0
Последнее редактирование:

Prog

Продвинутый
Сообщения
598
Репутация
77
а не подскажите пример языка программирования, в котором это ограничение отсутствует?
Это ограничение функций винды, а не AutoIt.
Проверяйте какие клавиши нажаты https://autoit-script.ru/threads/ka...andere-pri-pomoschi-xotkeja.29255/post-160480

Может для вашей цели подойдет функция GUISetAccelerators.
 
Автор
M

mathem

Новичок
Сообщения
26
Репутация
0
Это ограничение функций винды, а не AutoIt.
Да как же это ограничение винды, когда в скачанных из инета от профессиональных программистов программах или в том же Блокноте, сколько бы окон его ни было открыто, в каждом из них срабатывает каждое из определенных в Блокноте сочетание клавиш (Ctrl+O, там , Ctrl+P, и т. д.)?
 

Prog

Продвинутый
Сообщения
598
Репутация
77
Не нужно путать глобальные горячие клавиши и аналогичные только для активного окна.
в Блокноте сочетание клавиш (Ctrl+O, там , Ctrl+P, и т. д.)
Эти сочетания клавиш работают если неактивно окно блокнота? Нет, а установленные функцией HotKeySet работают.
Если нужно как в блокноте, используйте GUISetAccelerators вместо HotKeySet.
 
Автор
M

mathem

Новичок
Сообщения
26
Репутация
0
Если нужно как в блокноте, используйте GUISetAccelerators вместо HotKeySet.
Спасибо большое. Это полностью решило те проблемы. Правда, вот это:
Не пригодилось. Ну и ладно: я и так получил полностью то, что хотел.
Теперь вот еще какой нюанс. Я подозреваю, что ответ на него будет отрицательным, но вдруг да положительным.
В моем просмотрщике, кроме прочих, есть и такие строки:
Код:
................................................................
While 1
................................................................
    $koord = WinGetPos($id_okna)
    ToolTip($name, $koord[0], $koord[1]+$koord[3]-3)
................................................................
WEnd
................................................................

, где $id_okna - это внутренний идентификатор активного в настоящий момент экземпляра моего просмотрщика, в котором я в настоящий момент произвожу действия. Как видно из кода, я в бесконечном цикле определяю координаты окна экземпляра моего просмотрщика, подгоняю под него тултип и вывожу в этот тултип имя, $name, фото, отображаемого в этом экземпляре моего просмотрщика- это, если включено отображение этого тултипа, это не отображено в приведенном фрагменте кода, но так есть. Это все идеально работает, пока окно экземпляра моего просмотрщика неподвижно. Но... Стоит начать двигать это окно, как тултип с именем, если отображение этого тултипа включено, замирает, перестает моргать и остается неподвижным, пока левая кнопка мыши зажата на заголовке окна денного экземпляра моего просмотрщика для перемещения этого окна - что, я думаю, и должно иметь место. Как только левая кнопка мышки отпускается, этот тултип перепрыгивает в место, соответствующее новому положению окна экземпляра моего просмотрщика. Так вот я и хочу спросить, нельзя ли в рамках одной программы сделать так, чтобы движение тултипа за соответствующим экземпляром-окном моего просмотрщика было плавным?
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
598
Репутация
77
В моем просмотрщике, кроме прочих, есть и такие строки:
Которые грузят ядро процессора на 100% зря его нагревая!

Стоит начать двигать это окно, как тултип с именем, если отображение этого тултипа включено, замирает, перестает моргать и остается неподвижным, пока левая кнопка мыши зажата на заголовке окна
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate("", 300, 200)
GUIRegisterMsg($WM_MOVE, "MOVE")
GUISetState()

While 1
    if GUIGetMsg() = $GUI_EVENT_CLOSE Then
        ExitLoop
    Endif
WEnd

func MOVE($hWnd, $Msg, $wParam, $lParam)
    Local $x = BitAND($lParam, 0xFFFF)
    Local $y = BitShift($lParam, 16)
    ToolTip("1234", $x+100, $y+100)
EndFunc
 
Автор
M

mathem

Новичок
Сообщения
26
Репутация
0
Которые грузят ядро процессора на 100% зря его нагревая!
Спасибо большое за предостережение! Итак, на сегодняшний день код моего просмотрщика выглядит следующим образом:
Код:
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <GUIConstants.au3>
#include <Misc.au3>

$a = 0

Global $chasti_puti = StringSplit($CmdLIne[1], "\")
Global $name = $chasti_puti[$chasti_puti[0]], $prosto_per
_Foto()

While 1
    ToolTip("", 0, 0)
If $a = 1 Then
    $koord = WinGetPos($id_okna)
    ToolTip($name, $koord[0], $koord[1]+$koord[3]-3)
EndIf
    Sleep(50)
     $msg = GUIGetMsg()
  Select
  Case $msg = $prosto_per
  Case $msg = $GUI_EVENT_CLOSE
      _GDIPlus_GraphicsDispose($hGraphic)
      _GDIPlus_ImageDispose($hImage)
      _GDIPlus_Shutdown()
      Exit
  EndSelect

    Switch $msg
        Case $punkt_1
            $a = 1-$a
        Case $punkt_2
            _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 5, 5)
        Case $pustyshks
            _MyFuncVyhod()
    EndSwitch
WEnd

Func _Foto()
_GDIPlus_Startup()
Global $hImage = _GDIPlus_ImageLoadFromFile($CmdLIne[1])
$shirina = _GDIPlus_ImageGetWidth($hImage)
Global $vysota = _GDIPlus_ImageGetHeight($hImage)
Global $hGUI = GUICreate("Мой просмотрщик", $shirina+10, $vysota+10, @DesktopWidth-25-$shirina, 15)
GUIRegisterMsg($WM_MOVE, "MOVE")
GUISetIcon(@ScriptDir & "\buffer-view.ico")
GUISetState(@SW_SHOW)
Global $contextmenu = GUICtrlCreateContextMenu()
Global $punkt_1 = GUICtrlCreateMenuItem("Отобразить/скрыть имя", $contextmenu)
Global $punkt_2 = GUICtrlCreateMenuItem("Обновить изображение", $contextmenu)
Global $pustyshks = GUICtrlCreateDummy()
; Load PNG image
Global $id_okna = WinGetHandle($hGUI)
; Draw PNG image
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 5, 5)
Local $aAccelKeys[3][2] = [["и", $punkt_1],["о", $punkt_2],["{Esc}", $pustyshks]]
GUISetAccelerators($aAccelKeys)
EndFunc

func MOVE($hWnd, $Msg, $wParam, $lParam)
If $a = 1 Then
    Local $x = BitAND($lParam, 0xFFFF)
    Local $y = BitShift($lParam, 16)
    ToolTip($name, $x-3, $y+$vysota+10)
EndIf    
EndFunc

Func imja_foto()
$a = 1-$a
EndFunc

Func obnovlenie()
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 5, 5)
EndFunc

Func _MyFuncVyhod()
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
Exit
EndFunc

и в нем есть вообще все функции, которые я хотел, чтобы в нем были. Проблема только в том, что строки
Код:
If $a = 1 Then
    $koord = WinGetPos($id_okna)
    ToolTip($name, $koord[0], $koord[1]+$koord[3]-3)
EndIf

для этого у меня расположены опять в бесконечном цикле, что, по вашему очень ценному замечанию, есть не очень хорошо. Когда же я эти строки помещаю вот сюда;
Код:
Func imja_foto()
$a = 1-$a
If $a = 1 Then
    $koord = WinGetPos($id_okna)
    ToolTip($name, $koord[0], $koord[1]+$koord[3]-3)
EndIf
EndFunc

, тултип с именем фото при нажатии клавиши "и" перестает вообще появляться. Не могли бы вы немного подправить мой код или подсказать, в какую сторону смотреть, чтобы сделать как нужно, без этих строк в бесконечном цикле?
 
Верх