Что нового

Не знаю где разместить Case, чтобы выполнялось нужное условие

fortages

Новичок
Сообщения
81
Репутация
3
Доброго времени суток! Всех с наступившим Новым Годом! :smile:
Помогите, пожалуйста разобраться, в чем ошибка.

Есть папки
C:\Отчеты\Склад1\
C:\Отчеты\Склад2\
C:\Отчеты\Склад3\
C:\Отчеты\Склад4\
C:\Отчеты\Склад5\

В этих папках набор txt-вайлов.
Есть пять кнопок с названиями этих складов соответственно.
Есть функция _Search(), которая выводит перечень файлов в папке. (строка 38)
Как сделать так, чтобы по нажатию на кнопку "Склад №" функция поиска "смотрела" в другую папку?
Вот этот кусок кода не знаю, где разместить

Код:
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			 Exit
		Case $Sklad1
			   $checked_theme = 'C:\Отчеты\Склад1\*.TXT'
		Case $Sklad2
			   $checked_theme = 'C:\Отчеты\Склад2\*.TXT'
		Case $Sklad3
			   $checked_theme = 'C:\Отчеты\Склад3\*.TXT'
		Case $Sklad4
			   $checked_theme = 'C:\Отчеты\Склад4\*.TXT'
		Case $Sklad5
			   $checked_theme = 'C:\Отчеты\Склад5\*.TXT'
		
	EndSwitch
	ExitLoop
WEnd


То есть, получается как...
Нужно чтобы посмотрели в Склад1, выбрали там файлы, сформировали из них отчет кнопкой "В буфер", перешли в Склад2, выбрали там что-то, дозаписали...
А у меня - как задала в 31й строчке значение, так только оно и открывается, а кнопки другие не реагируют. :-\
Вот остальная часть кода.
Помогите пожалуйста правильно разместить условие с Case...
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $GUI = GUICreate('Список', 445, 616, 450, 32), $flag = 0
$Sklad1 = GUICtrlCreateButton("Склад 1", 8, 16, 75, 25, $WS_GROUP)
$Sklad2 = GUICtrlCreateButton("Склад 2", 96, 16, 75, 25, $WS_GROUP)
$Sklad3 = GUICtrlCreateButton("Склад 3", 184, 16, 75, 25, $WS_GROUP)
$Sklad4 = GUICtrlCreateButton("Склад 4", 272, 16, 75, 25, $WS_GROUP)
$Sklad5 = GUICtrlCreateButton("Склад 5", 360, 16, 75, 25, $WS_GROUP)

Global $LIST = GUICtrlCreateTreeView(8, 48, 425, 465,0x0100)

$NumberLabel = GUICtrlCreateLabel("Количество", 16, 528, 92, 17)
Global $NumberInput = GUICtrlCreateInput("", 128, 528, 201, 21)
$NumberOK = GUICtrlCreateButton("В буфер", 344, 528, 89, 25, $WS_GROUP)

$START = GUICtrlCreateButton("ОК", 16, 568, 161, 33, $WS_GROUP)
$ButtonExit = GUICtrlCreateButton("Выход", 272, 568, 161, 33, $WS_GROUP)


GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
;############################################


;----------------------------------------------------------


Global $checked_theme = 'C:\Отчеты\Склад1\*.TXT'
;Global $SEARCH = FileFindFirstFile($checked_theme)


;----------------------------------------------------------


_Search()

Func _Search()


Dim $A[1] = [0]
Global $SEARCH = FileFindFirstFile($checked_theme)
$COUNTER = 1

While True
    $FILE = FileFindNextFile($SEARCH)
    If @error Then ExitLoop
    If $FILE = 'INFO.TXT' Then ContinueLoop ; пропускаем файл отчёта
    $FAM = StringRegExpReplace($FILE, '^(.*)\.(.*)$', '\1')
    ReDim $A[$COUNTER + 1]
    $A[$COUNTER] = GUICtrlCreateTreeViewItem($FAM, $LIST)
    $COUNTER += 1
WEnd

FileClose($SEARCH)
GUISetState()

While True
    If $flag = 1 Then
        $flag = 0
        For $i = 0 To UBound($A) - 1
            GUICtrlSetState($A[$i], $GUI_UNCHECKED)
        Next
        Local $numbercheck = GUICtrlRead($NumberInput)
        If $numbercheck <> '' Then
            For $i = 0 To $numbercheck
                GUICtrlSetState($A[$i], $GUI_CHECKED)
            Next
        EndIf
    EndIf
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $START
            $REPORT = FileOpen('список.txt', 2)
            For $COUNTER = 0 To UBound($A) - 1
                $STATE = GUICtrlRead($A[$COUNTER])
                $FAM = GUICtrlRead($A[$COUNTER], 1)
                If ($STATE = 1) Or ($STATE = 257) Then
                    $CURRENT = FileOpen($FAM & '.TXT', 0)
                    $TEXT = FileRead($CURRENT)
                    FileClose($CURRENT)
                    FileWrite($REPORT, $TEXT & @CRLF)
                EndIf
            Next
            FileClose($REPORT)
            Exit
            ;############################################
        Case $ButtonExit
            Exit
        Case $NumberOK
             MsgBox(0, "Запись в файл", "Запись в файл")
		
            ;############################################
		

    EndSwitch
WEnd
EndFunc ;<=Search


Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
    Local $nNotifyCode, $nID
    $nNotifyCode = BitShift($iwParam, 16)
    $nID = BitAND($iwParam, 0xFFFF)
    Switch $hWnd
        Case $GUI
            Switch $nNotifyCode
                Case $EN_CHANGE
                    Switch $nID
                        Case $NumberInput
                            $flag = 1
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
GUISetState(@SW_SHOW)
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Я конечно чайник в AutoIT, но не понимаю, зачем в первом коде стоит While, если вы выходите из цикла после первого прохода.
А во втором примере, не увидел выхода из функции _Search. Или у вас вся программа в этой функции крутится?
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
edyapd сказал(а):
Я конечно чайник в AutoIT, но не понимаю, зачем в первом коде стоит While, если вы выходите из цикла после первого прохода.
Не знаю даже, делала по примеру...

А во втором примере, не увидел выхода из функции _Search. Или у вас вся программа в этой функции крутится?
По сути - да. Вывод списка файлов в папке, выбор нужного, формирование списка в файле. На этом все.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
fortages,
А не проще сначала найти все папки по маске 'Склад*' в каталоге 'C:\Отчеты' и создать на основании этих данных TreeView, а потом, при нажатии на соответствующий TreeViewItem, добавлять к нему имена файлов из соответствующей папки?
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
madmasles может быть, так проще и правильнее, но я такое не смогу написать, по всей видимости. Знания слишком начальные (мягко говоря) поэтому вопрос и возник((
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
fortages [?]
но я такое не смогу написать, по всей видимости
Пример под Вашу, вроде, задачу.
Код:
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <EditConstants.au3>
#include <File.au3>

Global $sDir = @ProgramFilesDir, $sMaskDir = '*', $sMaskFile = '*', $sExcludeFile = ''

Global $hGui, $iTrv, $aiTrvItemDir[1][2], $aiTrvItemFile[1][2], $iMsg, $iInput, $iBtn, $aCheck[1]

$hGui = GUICreate($sDir, 300, 500)
$iInput = GUICtrlCreateInput('', 10, 10, 280, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_READONLY))
$iBtn = GUICtrlCreateButton('Get Checked TreeView', 10, 450, 280, 40)
$iTrv = GUICtrlCreateTreeView(10, 40, 280, 400, BitOR($GUI_SS_DEFAULT_TREEVIEW, $TVS_CHECKBOXES))
If Not __CreateTreeViewDir($aiTrvItemDir, $iTrv, $sDir, $sMaskDir) Then
	ConsoleWrite('Error' & @LF)
	Exit 1
EndIf
GUISetState()

While 1
	$iMsg = GUIGetMsg()
	Switch $iMsg
		Case 0
			ContinueLoop
		Case $GUI_EVENT_CLOSE
			Exit
		Case $aiTrvItemDir[1][0] To $aiTrvItemDir[$aiTrvItemDir[0][0]][0]
			$aiTrvItemDir[0][1] = _GetIndex2D($aiTrvItemDir, $iMsg)
			GUICtrlSetData($iInput, 'Dir: ' & $sDir & '\' & GUICtrlRead($iMsg, 1))
			If ($aiTrvItemDir[0][1] = -1) Or ($aiTrvItemDir[$aiTrvItemDir[0][1]][1]) Then ContinueLoop
			$aiTrvItemDir[$aiTrvItemDir[0][1]][1] = __CreateTreeViewFile($aiTrvItemFile, $iMsg, $sDir & '\' & GUICtrlRead($iMsg, 1), $sMaskFile, $sExcludeFile)
			ConsoleWrite('Create Items: ' & $aiTrvItemDir[$aiTrvItemDir[0][1]][1] & @LF)
			ConsoleWrite('---' & @LF)
			If $aiTrvItemDir[$aiTrvItemDir[0][1]][1] Then GUICtrlSetState($iMsg, $GUI_EXPAND)
		Case $iBtn
			ConsoleWrite('Dir Checked:' & @LF)
			For $i = 1 To $aiTrvItemDir[0][0]
				If BitAND(GUICtrlRead($aiTrvItemDir[$i][0]), $GUI_UNCHECKED) Then ContinueLoop
				ConsoleWrite($sDir & '\' & GUICtrlRead($aiTrvItemDir[$i][0], 1) & @LF)
			Next
			ConsoleWrite('===' & @LF)
			ConsoleWrite('Files Checked:' & @LF)
			For $i = 1 To $aiTrvItemFile[0][0]
				If BitAND(GUICtrlRead($aiTrvItemFile[$i][0]), $GUI_UNCHECKED) Then ContinueLoop
				$aiTrvItemFile[0][1] = $sDir & '\' & GUICtrlRead($aiTrvItemFile[$i][1], 1) & '\' & GUICtrlRead($aiTrvItemFile[$i][0], 1)
				ConsoleWrite($aiTrvItemFile[0][1] & @TAB & 'Size: ' & FileGetSize($aiTrvItemFile[0][1]) & ' Byte' & @LF)
			Next
			ConsoleWrite('===' & @LF)
		Case Else
			$aiTrvItemFile[0][1] = _GetIndex2D($aiTrvItemFile, $iMsg)
			If $aiTrvItemFile[0][1] = -1 Then ContinueLoop
			GUICtrlSetData($iInput, 'File: ' & $sDir & '\' & GUICtrlRead($aiTrvItemFile[$aiTrvItemFile[0][1]][1], 1) & '\' & GUICtrlRead($iMsg, 1))
	EndSwitch
WEnd

Func _GetIndex2D($ai_TrvItem, $i_Value, $i_Start = 1, $i_SubItem = 0)
	If $i_SubItem >= UBound($ai_TrvItem, 2) Then Return -1
	For $i = $i_Start To UBound($ai_TrvItem) - 1
		If $ai_TrvItem[$i][$i_SubItem] = $i_Value Then Return $i
	Next
	Return -1
EndFunc   ;==>_GetIndex2D

Func __CreateTreeViewFile(ByRef $ai_TrvItem, $i_Trv, $s_Path, $s_Mask, $s_Exclude = '')
	Local $a_Files = _FileListToArray($s_Path, $s_Mask, 1)
	If @error Then Return 0
	ReDim $ai_TrvItem[$ai_TrvItem[0][0] + $a_Files[0] + 1][2]
	For $i = 1 To $a_Files[0]
		If $a_Files[$i] = $s_Exclude Then ContinueLoop
		$ai_TrvItem[0][0] += 1
		$ai_TrvItem[$ai_TrvItem[0][0]][0] = GUICtrlCreateTreeViewItem($a_Files[$i], $i_Trv)
		$ai_TrvItem[$ai_TrvItem[0][0]][1] = $i_Trv
	Next
	If $s_Exclude Then ReDim $ai_TrvItem[$ai_TrvItem[0][0] + 1][2]
	Return $a_Files[0]
EndFunc   ;==>__CreateTreeViewFile

Func __CreateTreeViewDir(ByRef $ai_TrvItem, $i_Trv, $s_Path, $s_Mask)
	Local $a_Dirs = _FileListToArray($s_Path, $s_Mask, 2)
	If @error Then Return 0
	ReDim $ai_TrvItem[$ai_TrvItem[0][0] + $a_Dirs[0] + 1][2]
	For $i = 1 To $a_Dirs[0]
		$ai_TrvItem[0][0] += 1
		$ai_TrvItem[$ai_TrvItem[0][0]][0] = GUICtrlCreateTreeViewItem($a_Dirs[$i], $i_Trv)
	Next
	Return 1
EndFunc   ;==>__CreateTreeViewDir
Если что-то не понятно, спрашивайте.
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
Огромное спасибо за пример. :smile:
Код:
Global $sDir = @ProgramFilesDir, ;папка, в которой перечень каталогов выводим
$sMaskDir = '*', $sMaskFile = '*', ;маски
$sExcludeFile = 'ReadMe.txt' ;а это зачем?

;объявление переменных - окно, список... какие-то два массива? один для каталогов, другой - для файлов?
Global $hGui, $iTrv, $aiTrvItemDir[1][2], $aiTrvItemFile[1][2], $iMsg, $iInput, $iBtn, $aCheck[1] ;переменные просто...

$hGui = GUICreate($sDir, 300, 500) ;окно
;input? а где что-то вводится?
$iInput = GUICtrlCreateInput('', 10, 10, 280, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_READONLY))
;это понятно, это кнопка)
$iBtn = GUICtrlCreateButton('Get Checked TreeView', 10, 450, 280, 40)
;список (с кучей незнакомых параметров) и проверка
$iTrv = GUICtrlCreateTreeView(10, 40, 280, 400, BitOR($GUI_SS_DEFAULT_TREEVIEW, $TVS_CHECKBOXES))
If Not __CreateTreeViewDir($aiTrvItemDir, $iTrv, $sDir, $sMaskDir) Then
    ConsoleWrite('Error' & @LF)
    Exit 1
EndIf
GUISetState()  ;показывать окно

While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
Тут еще интуитивно более-менее понимаю, а на втором Case - выпадаю в осадок и медитирую. :-[
Код:
Case $aiTrvItemDir[1][0] To $aiTrvItemDir[$aiTrvItemDir[0][0]][0]
            $aiTrvItemDir[0][1] = _GetIndex2D($aiTrvItemDir, $iMsg)
            GUICtrlSetData($iInput, 'Dir: ' & $sDir & '\' & GUICtrlRead($iMsg, 1))
            If ($aiTrvItemDir[0][1] = -1) Or ($aiTrvItemDir[$aiTrvItemDir[0][1]][1]) Then ContinueLoop
            $aiTrvItemDir[$aiTrvItemDir[0][1]][1] = __CreateTreeViewFile($aiTrvItemFile, $iMsg, $sDir & '\' & GUICtrlRead($iMsg, 1), $sMaskFile, $sExcludeFile)
            ConsoleWrite('Create Items: ' & $aiTrvItemDir[$aiTrvItemDir[0][1]][1] & @LF)
            If $aiTrvItemDir[$aiTrvItemDir[0][1]][1] Then GUICtrlSetState($iMsg, $GUI_EXPAND)


Код:
$aiTrvItemDir[1][0] To $aiTrvItemDir[$aiTrvItemDir[0][0]][0]

Если выбран какой-то элемент массива (директория)... вот тут не поняла и много чего еще.

Сильно написано. :laugh:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
fortages,
В Вашем варианте будет $sExcludeFile = 'INFO.TXT' - не добавлять этот файл в TreeView.

Что делаем: получаем массив папок в $sDir и создаем по нему TreeViewItem`ы (Func __CreateTreeViewDir). В массиве $aiTrvItemDir: [0][0] - кол-папок (TreeViewItem`ов), [0][1] - временная переменная, [1-n][0] - ID TreeViewItem`ов папок, [1-n][1] - 0 или 1 (0 - папка не обрабатывалась или не содержит файлов, 1 - папка обработана, больше ее не трогать). При клике на Item`e папок, если папка не обработана, функцией __CreateTreeViewFile создаем TreeViewItem`ы файлов. Массив $aiTrvItemFile почти такой же, как и $aiTrvItemDir, разница только в том, что в [1-n][1] содержатся ID родительских TreeViewItem`ов папок для того, чтобы можно было получить полный путь к файлу.

В 99,999% ID элементов при создании идут подряд, поэтому напугавший Вас Case - это проверка типа Case 3 To 20.
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Если у вас функция _Search работает так как вам надо, то после её выполнения верните управление в основной код. А там как раз и должен стоять ваш цикл While 1. Только вместо ExitLoop вставьте Sleep(200)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
edyapd [?]
Только вместо ExitLoop вставьте Sleep(200)
Нельзя ставить паузу в цикл опроса элементов окна.


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

fortages,
Сделать, чтобы при установке (снятии) галки на папке устанавливались (снимались) галки на файлах?
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
madmasles сказал(а):
edyapd [?]
Только вместо ExitLoop вставьте Sleep(200)
Нельзя ставить паузу в цикл опроса элементов окна.
Я с окнами не работаю. По этому таких тонкостей не знаю. Может вообще как по другому надо организовывать опрос.
Просто я к тому, что функция, если это не аварийное завершение, должна возвращать управление основному коду. И завершаться программа должна именно из него.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
автор, а можно услышать детально , что нужно от кода? по пунктам.
честно сказать я не совсем понял логику кода в первом сообщении. можно все переиначить. где то сделать проще и понятнее. (к примеру, не использовать ReDim , а набирать в строку а потом ее разделить и тд) ну..как мне это видится :smile:
еще очень убивают пробелы между строками, в плане чтения :smile:
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
Спасибо всем за ответы... Наверное, тему можно перенести в стол заказов (или я там отдельно подробно опишу, что нужно сделать).
Вижу, что не справляюсь. Половина написана, а вторую часть не осилю... :'(
Лучше потом начну с нуля изучать AutoIT (и без спешки), чем пытаться со знанием 1+1=2 браться за задачи "высшей математики" (если говорить образно).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
joiner сказал(а):
автор, а можно услышать детально , что нужно от кода? по пунктам.
Да, вот описала, старалась подробно и.. кажется перестаралась. :D
http://autoit-script.ru/index.php?topic=18682.0
Теперь жду ответов очень сильно) Посчитала, что логичнее за это заплатить.
 
Верх