Автор Тема: Как вернутся к редактированию GUI если запись в ini показывает ошибку в GUI ?  (Прочитано 1990 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн dr.room [?]

  • Новичок
  • *
  • Сообщений: 268
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Всем привет!
У меня есть GUI содержавшее 2 взаимосвязанные элемента:
  • Список: выполняет роль вопроса
  • Поле ввода: для ответа

По условию - если выбран вопрос, то ответ обязателен. Если нет - то нет, соответственно.
Контроль - построен на анализе записей в ini

Я тут не знаю как в случае обнаружения ошибки
  • Прервать проверку
  • Вывести Msgbox  - о точной причине ошибки
  • Автоматически вернутся к редактированию GUI чтобы исправить ошибку, для ввода нужных данных в поле ввода
  • Если ошибок нет: вывести сообщение и  скрыть GUI для возможности продолжения выполнения кода

 

Примечания:
В данном GUI только 2 элемента типа Вопрос/Ответ. Чтобы я мог понять сам прицип
Спасибо за помощь

Gui
(нажмите для показа/скрытия)
Zapic v ini .au3
(нажмите для показа/скрытия)
Proverka.au3
(нажмите для показа/скрытия)
« Последнее редактирование: Май 17, 2018, 20:48:34 от dr.room »
Если бы один пример - было бы волшебно...для новичка

Русское сообщество AutoIt


Оффлайн gunter123 [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 40
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Другие файлы стоит вынести в функции, или наоборот, надо создать функции внутри этих файлов и подключить их один раз в начале скрипта. Теперь если проверка "пройдена", цикл опроса GUI завершается, можно дальше писать что-то свое
Код: AutoIt [Выделить]
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>

#Region ### START Koda GUI section ### Form=D:\В Облака\IDrive - снхронизация\Общин настройки ПК\Общая оптимизация\AutoIt\Нужные мне скрипты\Биржы и почтовики\socpublic\Тесты\GUI для почтовика\Чтение настроек INI\Чтение зависимых  настроек\С GUI\Form1.kxf
$Form1 = GUICreate("Form1", 515, 292, -1, -1)
GUISetFont(10, 400, 0, "MS Sans Serif")
$iCombo1 = GUICtrlCreateCombo("", 168, 80, 207, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "Январь|Февраль")
$Label1 = GUICtrlCreateLabel("Выберите месяц ", 168, 40, 134, 24)
$Label2 = GUICtrlCreateLabel("Укажите день ", 168, 120, 115, 24)
$Button1 = GUICtrlCreateButton("Старт", 400, 232, 75, 25)
$Input =  GUICtrlCreateInput("", 168, 160, 207, 28)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While True
   Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
         Exit

      Case $Button1
         $ini=@ScriptDir & '\setting.ini'
         $ini_1=FileOpen($ini, 8+2)
         FileClose($ini_1)

         Sleep(500)
         If Not  FileExists($ini) Then Exit MsgBox (262192,"Сообщение ","файл setting.ini - не найден",5)

         _ZapicVIni()
         If _Proverka() = True Then ExitLoop
    EndSwitch
WEnd
MsgBox (262208,"","Проверки завершены",3)
GUIDelete()

Func _ZapicVIni()
   $sRead1 = GUICtrlRead($iCombo1,1); чтение значения -  выбранного элемента
   if $sRead1 Then
   IniWrite($ini, "Шаг 1", "Вопрос", $sRead1) ; запись полученных значений элемента - в ini файл
   Endif


   $sRead2 = GUICtrlRead($Input,1); чтение значения -  выбранного элемента
   If $sRead2 Then
      IniWrite($ini, "Шаг 2", "Ответ", $sRead2) ; запись полученных значений элемента - в ini файл
   Endif
EndFunc

Func _Proverka() ; Возвращает True, если ошибок нет
   $IniRead3 = IniRead($ini, "Шаг 1", "Вопрос", "") ;Проверка списка
   If $IniRead3 Then
      $IniRead4 = IniRead($ini, "Шаг 2", "Ответ", "") ; Проверка поля ввода
      If Not $IniRead4 Then
         MsgBox(262192, "Обнаружена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")
         Return False
      EndIf
   EndIf
   Return True
EndFunc

Is it future or is it past?

Оффлайн dr.room [?]

  • Новичок
  • *
  • Сообщений: 268

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Спасибо огромное. gunter123
Можно еще вопросы?
Если я понял правильно, с помощью Retutn выполняется сразу 2 задачи (раньше просто не применял)
  • Опрос функции, как обычной, я не знаю, например, переменной
  • Выход из функции
Правильно ли будет в случае если в GUI множество пар  вопрос/ответ просто добавить в функцию  к if: ElseIf (для опроса новой пары - как новое условвие)  +  Return False т.е. по схеме что и прежде
ElseIf $IniRead3, $IniRead5, $IniRead7.... и т,д.

Код: AutoIt [Выделить]
Func _Proverka() ; Возвращает True, если ошибок нет

    If $IniRead3 Then
        $IniRead4 = IniRead($ini, "Шаг 2", "Ответ", "") ; Проверка поля ввода
        If Not $IniRead4 Then
            MsgBox(262192, "Обнаружена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")
            Return False
        EndIf
    ElseIf $IniRead_N1 Then ; новая пара вопрос/ответ
        $IniRead_N2 = IniRead($ini, "Шаг 2", "Ответ", "") ; Проверка поля ввода
        If Not $IniRead_N2 Then
            MsgBox(262192, "Обнаружена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")
            Return False
        EndIf
        Return True
    EndIf
EndFunc   ;==>_Proverka
 


Оффлайн gunter123 [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 40
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Да, так можно делать, главное не забывать, что по умолчанию функция будет возвращать 0
Код: AutoIt [Выделить]
Func _Proverka() ; Возвращает True, если ошибок нет

    If $IniRead3 Then
        $IniRead4 = IniRead($ini, "Шаг 2", "Ответ", "") ; Проверка поля ввода
        If Not $IniRead4 Then
            MsgBox(262192, "Обнаружена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")
            Return False
        EndIf
    ElseIf $IniRead_N1 Then ; новая пара вопрос/ответ
        $IniRead_N2 = IniRead($ini, "Шаг 2", "Ответ", "") ; Проверка поля ввода
        If Not $IniRead_N2 Then
            MsgBox(262192, "Обнаружена ошибка", "Если был задан вопрос, то требуется ответ" & @CRLF & "Поле ввода - не заполнено" & @CRLF & "  ")
            Return False
        EndIf
        Return True
    EndIf
    ; Если дойдет до этой строки, возвращаемое значение будет равно 0 (false)
EndFunc   ;==>_Proverka


Русское сообщество AutoIt


Оффлайн dr.room [?]

  • Новичок
  • *
  • Сообщений: 268

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
Да, так можно делать, главное не забывать, что по умолчанию функция будет возвращать 0
Т.е. нужно просто переопределить значение Return с False на Return True, после завершение проверки т.е. после EndIf, чтобы избежать логической ошибки ?

Оффлайн gunter123 [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 40
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Я о том, что при таких проверках может случиться так что не будет выбран ни один из вариантов в блоках If-Else, и по умолчанию когда функция закончит этот "опрос" и дойдет до своей последней строчки, она вернет false, если вручную не записать возвращаемое значение, и стоит учитывать это при построении скрипта.

Оффлайн dr.room [?]

  • Новичок
  • *
  • Сообщений: 268

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0

Оффлайн dr.room [?]

  • Новичок
  • *
  • Сообщений: 268

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Здравствуйте, gunter123

Я попробовал  - и у меня что-то не очень получаться при проверке 2х пар вопрос/ответ
в одном GUI

Не хочет переходить к проверке пары вопрос/ответ 2
Не смоделирована ситуация, если найденная ошибка в паре 1  вопрос/ответ - будет исправлена.
Помогите, пожалуйста
(нажмите для показа/скрытия)
« Последнее редактирование: Май 17, 2018, 17:14:09 от dr.room »

Русское сообщество AutoIt


Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2712
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
(нажмите для показа/скрытия)



Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн dr.room [?]

  • Новичок
  • *
  • Сообщений: 268

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
joiner
Спасибо, я не все понял (для меня сложный случай) - попробую разобраться
По минимуму немного не понял почему значение переменной $check меняется т.е. что означают эти цифры: 6,5,-2 и также в отношении Return - что означают разные цифры 1,2,3,4,: это произвольные значения (интересно - не знал что так можно), указывающие на отсутствие записи в ini ?
И похоже  - если указать день для зимнего месяца то не проверяет день в летнем месяце, и наоборот :(

« Последнее редактирование: Май 17, 2018, 10:48:09 от dr.room »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2712
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
из всей темы я понял, что  нужна проверка пар(блоков). Зима- месяц, день это один блок(пара) и лето-месяц день тоже пара
пары проверяются на наличие записи. если нет одной записи, то пара не пишется, но при этом другая пара может записаться, если она заполнена. проверяются ошибки на запись в файл, они пронумерованы от 1 до 4.
$check - переменная локальная в функции и в основном цикле это разные переменные(читай справку)
$check(5или6) - просто чтобы указать, что было записано. если будет -2, значит в обеих парах не было заполнено хотя бы одно поле
если нужно условие, чтобы все четыре поля были заполнены, то можно в одну строку свести проверку чтения, если хотя бы один элемент при чтении возвращает ноль, то функция выходит с ошибкой - не все поля заполнены
короче, я сделал пример как понял задачу. если что-то не понял, то :)

OffTopicкак совет - учись не "абракадабрить" коды. в первую очередь - всегда объявляй переменные(локальные или глобальные) и так далее

Оффлайн dr.room [?]

  • Новичок
  • *
  • Сообщений: 268

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
Зима- месяц, день это один блок(пара) и лето-месяц день тоже пара
А - я понял. Блоком, по условию, есть месяц/день -  не месяц/месяц/день/день
Месяц - вопрос, день - ответ
Цитировать
если нужно условие, чтобы все четыре поля были заполнены
  • Нужно чтобы были все поля заполнены что соответствуют статусу: ответ т.е. "дни"
  • Но только в случае, если - задан вопрос т.е. заполнено поле "месяц"
  • В сообщении об ошибке, должна быть возможность: точно указать какое поле требуется заполнить но сейчас не заполнено
Это все условия  :)


 
« Последнее редактирование: Май 17, 2018, 16:09:18 от dr.room »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2712
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
(нажмите для показа/скрытия)

Оффлайн dr.room [?]

  • Новичок
  • *
  • Сообщений: 268

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Спасибо, joiner
По меньшей мере 1 условие учтено. Но этого, к сожалению, не достаточно.
Я не предполагал даже что задача может оказаться настолько не простой
Эх, надо было тему в разделе Стол заказов создавать  :(
Спасибо Вам за Ваше терпение.


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2712
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
я бы так спросил - если заполнен Месяц, то должен быть заполнен день
статусы, ответы-вопросы - эти термины лишние в обсуждение.
(нажмите для показа/скрытия)
« Последнее редактирование: Май 20, 2018, 05:11:40 от joiner »

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
9 Ответов
4036 Просмотров
Последний ответ Март 02, 2012, 13:07:05
от vanekzver
16 Ответов
3326 Просмотров
Последний ответ Март 08, 2013, 17:40:02
от ivsatel
10 Ответов
3959 Просмотров
Последний ответ Ноябрь 24, 2013, 18:58:08
от madmasles
2 Ответов
1793 Просмотров
Последний ответ Декабрь 28, 2013, 02:41:13
от Firestarter
10 Ответов
3368 Просмотров
Последний ответ Апрель 04, 2014, 15:23:14
от InnI
3 Ответов
845 Просмотров
Последний ответ Апрель 30, 2015, 15:16:51
от madmasles
1 Ответов
975 Просмотров
Последний ответ Июнь 03, 2015, 18:05:30
от urrya
5 Ответов
1099 Просмотров
Последний ответ Сентябрь 22, 2015, 12:21:57
от Yashied
3 Ответов
602 Просмотров
Последний ответ Декабрь 17, 2017, 18:15:25
от InnI
4 Ответов
205 Просмотров
Последний ответ Август 03, 2018, 08:56:22
от hedji