Что нового

Проверка условия

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Пробую реализовать такую проверку. Кнопка "Откуда" открывает окно выбора папки и делает выбор. Кнопка "Старт" заносит выбор в файл ini. В этом файле формируется 4 переменных запоминающих выбранный путь: $GPath1, $GPath2, $GPath3, $GPath4. Первое нажатие "Старт" проверяет есть переменная $GPath1 и чему она равна. Если её нет или она пустая, то записывается в файл путь. Потом делается второй выбор и по нажатию кнопки "Старт" вторая переменная $GPath2 проверяется существует или нет, пустая она или нет и не равна ли первой переменной $GPath1. Если $GPath2 пустая, то записывается в файл выбранный путь. Если равна $GPath1, то выдает сообщение, что уже такой путь существует. Потом аналогично проверяется $GPath3 на существование и равенство $GPath1 и $GPath2. Если $GPath3 пустая и не равна $GPath1 и $GPath2, то записывается в файл путь. Если нет, то выдается сообщение, что такой путь уже есть. То же самое и проверка $GPath4.
Но у меня не получается проверка на равенство предыдущих переменных. И в результате если переменной не было, но путь был равен значению какой-то предыдущей, то все равно записывается выбранный путь.
Вот мой код:
Код:
#RequireAdmin
#include <GUIConstantsEx.au3>
#include <Date.au3>
#include <WindowsConstants.au3>
#include <Timers.au3>
#include <StaticConstants.au3>
#include <WinAPIProc.au3>
#Include <ScreenCapture.au3>
#include <WinAPI.au3>
#include <Clipboard.au3>
#include <GDIPlus.au3>

Global  $sPS
Global $iPid, $iTM
Global $GP = IniRead("Setting.ini","GPat","Pat","")

$hGui = GUICreate('Секундомер', 700, 680, -1, -1, -1, $WS_EX_TOPMOST)
Local $btStart = GUICtrlCreateButton('Старт', 392, 8, 75, 25)
Local $sPathSS = GUICtrlCreateInput('', 8, 96, 325, 21)
Local $sPathS = GUICtrlCreateButton('Откуда', 392, 96, 75, 25)
GUISetState()
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ProcessClose($iPid)
            Exit
        Case $sPathS
            GUICtrlSetData($sPathSS, '')
            $sPS = FileSelectFolder('Выбор копируемой папки', '', 0, '', $hGui)
            If Not @error Then GUICtrlSetData($sPathSS, $sPS)
        Case $btStart
            _GetPath()
EndSwitch
WEnd

Func _GetPath()
    Local $GPath1 = ''
    Local $GPath2 = ''
    Local $GPath3 = ''
    Local $GPath4 = ''
    If $GPath1 = IniRead("Setting.ini","Путь1", "Путь","") Then
        $GPath1 = $sPS
        IniWrite("Setting.ini", "Путь1", "Путь", $sPS)
   ElseIf $GPath2 = IniRead("Setting.ini","Путь2", "Путь","") Or $GPath1<>$sPS Then
        $GPath2 = $sPS
        IniWrite("Setting.ini", "Путь2", "Путь", $sPS)
   ElseIf $GPath3 = IniRead("Setting.ini","Путь3", "Путь","") Then
        $GPath3 = $sPS
        IniWrite("Setting.ini", "Путь3", "Путь", $sPS)
    ElseIf $GPath4 = IniRead("Setting.ini","Путь4", "Путь","") Then
        $GPath4 = $sPS
        IniWrite("Setting.ini", "Путь4", "Путь", $sPS)
    EndIf
EndFunc

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

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Так Вы один раз запишите пути в ini файл и больше они не изменятся, так и надо ?
То есть при повторном запуске скрипта , в случае, если ранее было занесено, например два пути , то при первом нажатии "Старт" уже будет занесен третий , если не равен первому и второму и так-же для четвёртого, и уже , если были занесены все четыре , то они изменяться не будут при повторных запусках скрипта, так ?
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
больше они не изменятся, так и надо ?
Нет. Это кусочек окна. Потом по нажатии ещё одной кнопки все результаты будут чиститься.
то при первом нажатии "Старт" уже будет занесен третий
Такого не будет, поскольку перед закрытием все данные будут чиститься.
Будут сохраняться все 4 переменные. Какое-то время ими попользуются и сотрут. Потом заново. Возможно ещё две добавиться, тоесть будет не 4, а 6. но это уже дело техники
Хотя наверно в Ваших словах есть смысл. Мало ли. Вдруг случайно окно закроется, а ещё не все данные будут получены. Тогда да. Нужна проверка на уже имеющиеся. Как вы и написали, они меняться не будут, но проверять их существование нужно
 
Последнее редактирование:

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Может так ?
Код:
Global $sPS
Global $iPid, $iTM
Global $GP = IniRead("Setting.ini", "GPat", "Pat", "")
Global $N = 4 ;Количество переменыых

$hGui = GUICreate('Секундомер', 700, 680, -1, -1, -1, $WS_EX_TOPMOST)
Local $btStart = GUICtrlCreateButton('Старт', 392, 8, 75, 25)
Local $sPathSS = GUICtrlCreateInput('', 8, 96, 325, 21)
Local $sPathS = GUICtrlCreateButton('Откуда', 392, 96, 75, 25)
GUISetState()
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ProcessClose($iPid)
            Exit
        Case $sPathS
            GUICtrlSetData($sPathSS, '')
            $sPS = FileSelectFolder('Выбор копируемой папки', '', 0, '', $hGui)
            If Not @error Then GUICtrlSetData($sPathSS, $sPS)
        Case $btStart
            _GetPath()
    EndSwitch
WEnd

Func _GetPath()
    $Path = GUICtrlRead($sPathSS)
    For $i = 1 To $N
        If IniRead("Setting.ini", "Путь" & $i, "Путь", "") = '' Then ;Переменная не занесена
            For $j = 1 To $i - 1 ; Проверка на уникальность пути
                If IniRead("Setting.ini", "Путь" & $j, "Путь", "") = $Path Then ; Такой путь уже есть
                    MsgBox(16, 'Внимание !', 'Путь к папке:' & @CR & $Path &@CR& 'уже существует !', 0, $hGui)
                    Return
                EndIf
            Next
            IniWrite("Setting.ini", "Путь" & $i, "Путь", $Path)
            If $i < $N Then Return
        EndIf
    Next
    MsgBox(64, 'Внимание !', 'Все переменные занесены !', 0, $hGui)
EndFunc   ;==>_GetPath

Я не знаю всей логики работы Вашего скрипта, но переменные проверяются и заносятся после нажатия отдельной кнопки "Старт", не лучше было бы выполнять проверку и заносить пути одновременно с выбором по кнопке "Откуда" ?
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Работает. Только странно. Почему-то думал, что можно обойтись без числа переменных.
Я не знаю всей логики работы Вашего скрипта, но переменные проверяются и заносятся после нажатия отдельной кнопки "Старт", не лучше было бы выполнять проверку и заносить пути одновременно с выбором пути ?
А если путь выбрали, но дальнейшие операции не будут произведены? Ну и "полный" скрипт тут на форуме я пробую доточить в разных темах, в первую очередь в столе заказов. Вообще язык оказался достаточно интересный. Хоть и не привычный. Доделаю этот скрипт для себя, потом через время возьмусь за составление отчетов и отсылку их по адресам ))) Это уже для работы )))
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Почему-то думал, что можно обойтись без числа переменных.
Можно и без , например читать секции в ини файле - вариантов масса, но я перестраховался , так наверняка )))
Но и нужно же знать , что переменные уже все занесены а сколько это "все" ?
Проще было бы без числа переменных , если в ини файле все пути писались бы в одной секции , а не в разных...
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
например читать секции в ини файле - вариантов масса
На досуге подумаю, как этот кусок можно было бы на php организовать ))) Но сейчас нужно собрать все воедино. Сроки поджимают
Сообщение автоматически объединено:

Проще было бы без числа переменных , если в ини файле все пути писались бы в одной секции , а не в разных...
Вот тут не знаю. Делал, как понял autoit. У меня ограничений в этом плане нет. Если есть возможность, то покажите вариант с одной секцией.
Но у меня возникла другая проблема ))) Теперь не очень удобно вытягивать данные переменной и записывать их в нужное место окна
 
Последнее редактирование:

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Если есть возможность, то покажите вариант с одной секцией.
Например так :
Код:
#RequireAdmin
#include <GUIConstantsEx.au3>
#include <Date.au3>
#include <WindowsConstants.au3>
#include <Timers.au3>
#include <StaticConstants.au3>
#include <WinAPIProc.au3>
#include <ScreenCapture.au3>
#include <WinAPI.au3>
#include <Clipboard.au3>
#include <GDIPlus.au3>

Global $sPS
Global $iPid, $iTM
Global $GP = IniRead("Setting.ini", "GPat", "Pat", "")


$hGui = GUICreate('Секундомер', 700, 680, -1, -1, -1, $WS_EX_TOPMOST)
Local $btStart = GUICtrlCreateButton('Старт', 392, 8, 75, 25)
Local $sPathSS = GUICtrlCreateInput('', 8, 96, 325, 21)
Local $sPathS = GUICtrlCreateButton('Откуда', 392, 96, 75, 25)
GUISetState()
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ProcessClose($iPid)
            Exit
        Case $sPathS
            GUICtrlSetData($sPathSS, '')
            $sPS = FileSelectFolder('Выбор копируемой папки', '', 0, '', $hGui)
            If Not @error Then GUICtrlSetData($sPathSS, $sPS)
        Case $btStart
            _GetPath()
    EndSwitch
WEnd

Func _GetPath()
    $Path = GUICtrlRead($sPathSS)
    $AllPath = IniReadSection("Setting.ini", "Путь")
    For $i = 1 To $AllPath[0][0]
        If $AllPath[$i][1] = '' Then ;Переменная не занесена
            For $j = 1 To $i - 1 ; Проверка на уникальность пути
                If $AllPath[$j][1]  = $Path Then ; Такой путь уже есть
                    MsgBox(16, 'Внимание !', 'Путь к папке:' & @CR & $Path & 'уже существует !', 0, $hGui)
                    Return
                EndIf
            Next
            IniWrite("Setting.ini", "Путь", $AllPath[$i][0], $Path)
            If $i < $AllPath[0][0] Then Return
        EndIf
    Next
    MsgBox(64, 'Внимание !', 'Все переменные занесены !', 0, $hGui)
EndFunc   ;==>_GetPath

Но здесь есть ондно НО , необходимо заранее подготовить секцию ини файла с количеством необходимых переменных в таком виде :
Код:
[Путь]
Путь1=
Путь2=
Путь3=
Путь4=
Количество переменных - любое, сколько нужно, можно их добавлять в других участках кода , либо при старте скрипта, опять же всё зависит от Вашего алгоритма.
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
опять же всё зависит от Вашего алгоритма
Не совсем понимаю, в каком объеме в этой теме можно описывать скрипт и задачи. Надеюсь, модераторы не забанят, если укажу другую тему на форуме, где больше описаны задачи. Вообще, нужно под скринами процесса копирования вставлять пути к папкам копирования.
Сообщение автоматически объединено:

Таки вернулся к теме. Не проверяет значение последнего ключа. Тоесть, если оно было пустое, то запишет. А вот если было записано, то не скажет, что уже записано, а просто выдаст сообщение, что все значения уже есть и не проверит, было ли оно равно новому или нет. При этом такое же сообщение выдаст не зависимо от того, была значение последнего ключа пустым или нет
Сообщение автоматически объединено:

Разобрался, добавил проверку в конце <=
 
Последнее редактирование:
Верх