Что нового

Как установить фильтр поиска файлов используя Checkbox

A

at

Гость
День добрый, Всем! Прошу подсказку. Как правильно применить Checkbox в этом скрипте, для разделения поиска файлов по маске.

Не нашел на форуме ничего похожего. Подскажите, где можно прочесть о чекбоксах или найти примеры.

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>

$Form = GUICreate('', 180, 257, 300, 165)
$PageControl1 = GUICtrlCreateTab(0, 8, 180, 248)
$TabSheet_General = GUICtrlCreateTabItem('   Выбор   ')
$Button_Server_1 = GUICtrlCreateButton('Сервер 1', 8, 43, 75, 25)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$Button_Server_2 = GUICtrlCreateButton('Сервер 2', 8, 75, 75, 25)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$Label1 = GUICtrlCreateLabel('10.10.1.10', 96, 50, 61, 18)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$Label2 = GUICtrlCreateLabel('10.10.1.20', 96, 82, 55, 18)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$Checkbox1 = GUICtrlCreateCheckbox('искать server.txt', 16, 200, 153, 17)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$Checkbox2 = GUICtrlCreateCheckbox('искать user.config', 16, 224, 145, 17)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
GUICtrlCreateTabItem('')
GUISetState(@SW_SHOW)

Global $Text_Server_1 = '10.10.1.10'
Global $Text_Server_2 = '10.10.1.20'
Global $Replace_1 = '10.10.1.20'
Global $Replace_2 = '10.10.1.10'

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
			
	    Case $Button_Server_1
			
$sFirstSearchFile = 'server.txt'
$sSecondSearchFile = 'user.config'
$sWhereSearch = @HomeDrive
$aSearch = _FileSearch($sWhereSearch, $sFirstSearchFile & ';' & $sSecondSearchFile, 1)
		
		If @error Then
			MsgBox(16, 'Error', '_FileSearch')
			Exit
		EndIf
		If Not $aSearch[0] Then
			MsgBox(16, 'Error', 'Not files')
			Exit
		EndIf

		For $i = 1 To $aSearch[0]
			$Read = FileRead($aSearch[$i]) ;Считываем
			$Open = FileOpen($aSearch[$i], 2) ;Открываем
			$Replace = StringRegExpReplace($Read, $Replace_1, $Text_Server_1) ;Изменяем
			FileWrite($Open, $Replace) ;Переписываем
			FileClose($Open) ;Закрываем
		Next
		
    EndSwitch
WEnd

Func _FileSearch($s_Path_Search, $s_File_Mask = '*', $i_Flag = 0, $i_SubDir = 1)

	Local $s_Out, $a_Out, $s_Read, $h_Dir, $s_Attrib, $s_Subdir, $a_Masks

    If StringRight($s_Path_Search, 1) == '\' Then
        $s_Path_Search = StringTrimRight($s_Path_Search, 1)
    EndIf
    If $i_SubDir Then
        $s_Subdir = ' /S /B'
    Else
        $s_Subdir = ' /B'
    EndIf
    Switch $i_Flag
        Case 1
            $s_Attrib = ' /A-D'
        Case 2
            $s_Attrib = ' /AD'
        Case Else
            $s_Attrib = ' /A'
    EndSwitch
    $s_Out = StringToBinary('0' & @CRLF, 2)
    $a_Masks = StringSplit($s_File_Mask, ';')
    For $i = 1 To $a_Masks[0]
        $h_Dir = Run(@ComSpec & ' /U /C DIR "' & $s_Path_Search & '\' & $a_Masks[$i] & '"' & $s_Subdir & $s_Attrib, @SystemDir, @SW_HIDE, 6)
        If Not $h_Dir Then Return SetError(1)
        While 1
            $s_Read = StdoutRead($h_Dir, False, True)
            If @error Then
                ExitLoop
            EndIf
            If $s_Read Then
                $s_Out &= $s_Read
            EndIf
            Sleep(10)
        WEnd
    Next
    $a_Out = StringRegExp(BinaryToString($s_Out, 2), '[^\r\n]+', 3)
    If @error Then Return SetError(1)
    $a_Out[0] = UBound($a_Out) - 1
    Return $a_Out
EndFunc   ;==>_FileSearch
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
at,
Я бы примерно так сделал.
Код:
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

$sFile = 'server.txt;user.config'
Dim $aComdo[3] = ['Files', 'Find', 'Replace']

$hGui = GUICreate('Test', 280, 120)
For $i = 0 To UBound($aComdo) - 1
	GUICtrlCreateLabel($aComdo[$i], 10 + $i * 90, 10, 80, 15, $SS_CENTER)
	$aComdo[$i] = GUICtrlCreateCombo('', 10 + $i * 90, 30, 80, 20, $CBS_DROPDOWNLIST)
Next
GUICtrlSetData($aComdo[0], StringReplace($sFile, ';', '|') & '|All', 'server.txt')
$nButton = GUICtrlCreateButton('Go', 100, 70, 80, 30)
_MyCombo()
GUICtrlSetState($nButton, $GUI_FOCUS)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $aComdo[0], $aComdo[2]
			GUICtrlSetState($nButton, $GUI_FOCUS)
		Case $aComdo[1]
			_MyCombo()
			GUICtrlSetState($nButton, $GUI_FOCUS)
		Case $nButton
			$sFiles = GUICtrlRead($aComdo[0])
			If $sFiles == 'All' Then $sFiles = $sFile
			$sFind = GUICtrlRead($aComdo[1])
			$sReplace = GUICtrlRead($aComdo[2])
			MsgBox(64, 'Info', 'Files: ' & $sFiles & @LF & 'Find: ' & $sFind & @LF & _
					'Replace: ' & $sReplace, 0, $hGui)
			;дальше делайте то, что надо
	EndSwitch
WEnd

Func _MyCombo()
	Local $s_NowFind, $s_NowRep, $s_Server = '10.10.1.10|10.10.1.20|10.10.1.30|10.10.1.40|10.10.1.50'
	$s_NowFind = GUICtrlRead($aComdo[1])
	If Not $s_NowFind Then
		$s_NowFind = '10.10.1.10'
		GUICtrlSetData($aComdo[1], $s_Server, $s_NowFind)
	EndIf
	$s_Server = StringReplace($s_Server & '|', $s_NowFind & '|', '')
	$s_NowRep = GUICtrlRead($aComdo[2])
	If Not $s_NowRep Or Not StringInStr($s_Server, $s_NowRep) Then
		$s_NowRep = StringRegExpReplace($s_Server, '\|.*$', '')
	EndIf
	GUICtrlSetData($aComdo[2], '')
	GUICtrlSetData($aComdo[2], $s_Server, $s_NowRep)
EndFunc   ;==>_MyCombo
 
Автор
A

at

Гость
Хорошее решение, madmasles. Спасибо за поддержку. Я первоначально как то так себе и представлял эту утилиту, только пошел более понятным для себя путем. Теперь уже очень хочется доделать начатое. Заклинился на чекбоксе. Не могу понять принцип и информации подходящей не найду.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
at [?]
Заклинился на чекбоксе
Попробуйте так.
Код:
#include <GUIConstantsEx.au3>
#include <Array.au3> ;можно убрать потом

Dim $aCheckBox[6][2] = [[5],['5.txt'],['4.txt'],['3.txt'],['2.txt'],['1.txt']]
#cs
	создали 2-х мерный массив.
	[0][0] - кол-во используемых строк или Checkbox`ов (чтобы потом лишний раз не вызывать UBound())
	[1-n][0](0-ая колонка) - имена файлов.
	[1-n][1](1-ая колонка) - пока пустые, для ID соответствующих файлам Checkbox`ов.
	Посмотрим массив:
#ce
_ArrayDisplay($aCheckBox);можно убрать потом
$hGui = GUICreate('Test', 200, 50 + $aCheckBox[0][0] * 30)
;в цикле создаем Checkbox`ы с соответствующими именами файлов из массива
For $i = 1 To $aCheckBox[0][0]
	$aCheckBox[$i][1] = GUICtrlCreateCheckbox('Выбрать ' & $aCheckBox[$i][0], 50, 10 + ($i - 1) * 30, 100, 20)
Next
$nButton = GUICtrlCreateButton('Go', 50, 10 + $aCheckBox[0][0] * 30, 100, 30)
;посмотрим полностью заполненный массив:
_ArrayDisplay($aCheckBox);можно убрать потом
GUISetState()
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			$sFiles = '' ;обнулили переменную
			;в цикле проверяем состояние Checkbox`ов.
			For $i = 1 To $aCheckBox[0][0]
				If BitAND(GUICtrlRead($aCheckBox[$i][1]), $GUI_CHECKED) Then
					;про BitAND() посмотрите в справке и еще к функции WinGetState()
					;если отмечен, добавляем к переменной соответствующий файл из 0-ой колонки и символ "|"
					$sFiles &= $aCheckBox[$i][0] & '|';можно поменять на нужный Вам разделитель
				EndIf
			Next
			If $sFiles Then ;если хотя бы один Checkbox отмечен, то удаляем лишний символ "|" в конце.
				$sFiles = StringTrimRight($sFiles, 1)
				;смотрим полученный результат:
				MsgBox(64, 'Info', $sFiles, 0, $hGui)
			Else ;переменная пустая, т.е не отмечены все Checkbox`ы
				MsgBox(16, 'Error', 'No files', 0, $hGui)
			EndIf
	EndSwitch
WEnd
 
Автор
A

at

Гость
madmasles, а можно дополнить пример коментариями. Или покажите, где в справке есть описание чекбокса, хотябы общее.
 

madmasles

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

at

Гость
Прямо в коде кликайте
так и делаю, плюс справка на локальной машине, плюс перебор форума. К сожалению не нашел самой темы для новичков. Может быть это и не хитрый элемент, но тормознул я на нем серьезно.

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

Вот в этой части можно в двух словах объяснить что к чему? :
Код:
Case $nButton
            $sFiles = ''
            For $i = 1 To $aCheckBox[0][0]
                If BitAND(GUICtrlRead($aCheckBox[$i][1]), $GUI_CHECKED) Then
                    $sFiles &= $aCheckBox[$i][0] & ';'
                EndIf
            Next
            If $sFiles Then
                $sFiles = StringTrimRight($sFiles, 1)
                MsgBox(64, 'Info', $sFiles, 0, $hGui)
            Else
                MsgBox(16, 'Error', 'No files', 0, $hGui)
            EndIf
    EndSwitch
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
at,
Я добавил комментарии в код выше. С Вашими двумя файлами:
Код:
#include <GUIConstantsEx.au3>

Dim $aCheckBox[3][2] = [[2],['server.txt'],['user.config']]

$hGui = GUICreate('Test', 200, 50 + $aCheckBox[0][0] * 30)
For $i = 1 To $aCheckBox[0][0]
	$aCheckBox[$i][1] = GUICtrlCreateCheckbox('Выбрать ' & $aCheckBox[$i][0], 30, 10 + ($i - 1) * 30, 140, 20)
Next
$nButton = GUICtrlCreateButton('Go', 50, 10 + $aCheckBox[0][0] * 30, 100, 30)
GUISetState()
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			$sFiles = ''
			For $i = 1 To $aCheckBox[0][0]
				If BitAND(GUICtrlRead($aCheckBox[$i][1]), $GUI_CHECKED) Then
					$sFiles &= $aCheckBox[$i][0] & '|'
				EndIf
			Next
			If $sFiles Then
				$sFiles = StringTrimRight($sFiles, 1)
				MsgBox(64, 'Info', $sFiles, 0, $hGui)
			Else
				MsgBox(16, 'Error', 'No files', 0, $hGui)
			EndIf
	EndSwitch
WEnd
 
Автор
A

at

Гость
madmasles, Спасибо за примеры, медленно вникаю. Пожалуйста, покажите ошибки в моем скрипте.

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>

Dim $aCheckBox[3][2] = [[2],['server.txt'],['user.config']]

$hGui = GUICreate('', 180, 257, 300, 165)
$PageControl1 = GUICtrlCreateTab(0, 8, 180, 248)
$TabSheet_General = GUICtrlCreateTabItem('   Выбор   ')
$Button_Server_1 = GUICtrlCreateButton('Сервер 1', 8, 43, 75, 25 + $aCheckBox[0][0])
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$Button_Server_2 = GUICtrlCreateButton('Сервер 2', 8, 75, 75, 25)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
 $Label1 = GUICtrlCreateLabel('10.10.1.10', 96, 50, 61, 18)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$Label2 = GUICtrlCreateLabel('10.10.1.20', 96, 82, 55, 18)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
GUICtrlCreateTabItem('')
For $i = 1 To $aCheckBox[0][0]
    $aCheckBox[$i][1] = GUICtrlCreateCheckbox('Выбрать ' & $aCheckBox[$i][0], 30, 150 + ($i - 1) * 30, 140, 20)
Next
;$nButton = GUICtrlCreateButton('Go', 50, 10 + $aCheckBox[0][0] * 30, 100, 30)
GUISetState(@SW_SHOW)

Global $Text_Server_1 = '10.10.1.10'
Global $Text_Server_2 = '10.10.1.20'
Global $Replace_1 = '10.10.1.20'
Global $Replace_2 = '10.10.1.10'

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
            
        Case $Button_Server_1
			
			            $sFiles = ''
            For $i = 1 To $aCheckBox[0][0]
                If BitAND(GUICtrlRead($aCheckBox[$i][1]), $GUI_CHECKED) Then
                    $sFiles &= $aCheckBox[$i][0] & '|'
                EndIf
            Next
     
$aSearch = _FileSearch('C:', $sFiles, 1)

        If @error Then
            MsgBox(16, 'Error', '_FileSearch')
            Exit
        EndIf
        If Not $aSearch[0] Then
            MsgBox(16, 'Error', 'Not files')
            Exit
        EndIf

        For $i = 1 To $aSearch[0]
            $Read = FileRead($aSearch[$i]) ;Считываем
            $Open = FileOpen($aSearch[$i], 2) ;Открываем
            $Replace = StringRegExpReplace($Read, $Replace_1, $Text_Server_1) ;Изменяем
            FileWrite($Open, $Replace) ;Переписываем
            FileClose($Open) ;Закрываем
        Next
        
    EndSwitch
WEnd

Func _FileSearch($s_Path_Search, $s_File_Mask = '*', $i_Flag = 0, $i_SubDir = 1)

    Local $s_Out, $a_Out, $s_Read, $h_Dir, $s_Attrib, $s_Subdir, $a_Masks

    If StringRight($s_Path_Search, 1) == '\' Then
        $s_Path_Search = StringTrimRight($s_Path_Search, 1)
    EndIf
    If $i_SubDir Then
        $s_Subdir = ' /S /B'
    Else
        $s_Subdir = ' /B'
    EndIf
    Switch $i_Flag
        Case 1
            $s_Attrib = ' /A-D'
        Case 2
            $s_Attrib = ' /AD'
        Case Else
            $s_Attrib = ' /A'
    EndSwitch
    $s_Out = StringToBinary('0' & @CRLF, 2)
    $a_Masks = StringSplit($s_File_Mask, ';')
    For $i = 1 To $a_Masks[0]
        $h_Dir = Run(@ComSpec & ' /U /C DIR "' & $s_Path_Search & '\' & $a_Masks[$i] & '"' & $s_Subdir & $s_Attrib, @SystemDir, @SW_HIDE, 6)
        If Not $h_Dir Then Return SetError(1)
        While 1
            $s_Read = StdoutRead($h_Dir, False, True)
            If @error Then
                ExitLoop
            EndIf
            If $s_Read Then
                $s_Out &= $s_Read
            EndIf
            Sleep(10)
        WEnd
    Next
    $a_Out = StringRegExp(BinaryToString($s_Out, 2), '[^\r\n]+', 3)
    If @error Then Return SetError(1)
    $a_Out[0] = UBound($a_Out) - 1
    Return $a_Out
EndFunc   ;==>_FileSearch
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
at,
Только поиск проверял.
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>

Global $Text_Server_1 = '10.10.1.10'
Global $Text_Server_2 = '10.10.1.20'
Global $Replace_1 = '10.10.1.20'
Global $Replace_2 = '10.10.1.10'
Dim $aCheckBox[3][2] = [[2],['server.txt'],['user.config']]

$hGui = GUICreate('', 180, 257, 300, 165)
$PageControl1 = GUICtrlCreateTab(0, 8, 180, 248)
$TabSheet_General = GUICtrlCreateTabItem('   Выбор   ')
$Button_Server_1 = GUICtrlCreateButton('Сервер 1', 8, 43, 75, 25 + $aCheckBox[0][0])
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$Button_Server_2 = GUICtrlCreateButton('Сервер 2', 8, 75, 75, 25)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$Label1 = GUICtrlCreateLabel('10.10.1.10', 96, 50, 61, 18)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$Label2 = GUICtrlCreateLabel('10.10.1.20', 96, 82, 55, 18)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
GUICtrlCreateTabItem('')
For $i = 1 To $aCheckBox[0][0]
	$aCheckBox[$i][1] = GUICtrlCreateCheckbox('Выбрать ' & $aCheckBox[$i][0], 30, 150 + ($i - 1) * 30, 140, 20)
Next
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button_Server_1
			$sFiles = ''
			For $i = 1 To $aCheckBox[0][0]
				If BitAND(GUICtrlRead($aCheckBox[$i][1]), $GUI_CHECKED) Then
					$sFiles &= $aCheckBox[$i][0] & '|'
				EndIf
			Next
			If Not $sFiles Then
				MsgBox(16, 'Error', 'No files', 0, $hGui)
				ContinueLoop
			EndIf
			$sFiles = StringTrimRight($sFiles, 1)
			$aSearch = _FileSearch('C:', $sFiles, 1)
			If @error Then
				MsgBox(16, 'Error', '_FileSearch')
				Exit
			EndIf
			If Not $aSearch[0] Then
				MsgBox(16, 'Error', 'Not files')
				Exit
			EndIf
			For $i = 1 To $aSearch[0]
				$Read = FileRead($aSearch[$i]) ;Считываем
				$Open = FileOpen($aSearch[$i], 2) ;Открываем
				$Replace = StringRegExpReplace($Read, $Replace_1, $Text_Server_1) ;Изменяем
				FileWrite($Open, $Replace) ;Переписываем
				FileClose($Open) ;Закрываем
			Next
	EndSwitch
WEnd

Func _FileSearch($s_Path_Search, $s_File_Mask = '*', $i_Flag = 0, $i_SubDir = 1)
	;!!! фильтры для поиска нужно указывать через "|" !!!
	;$i_Flag = 0 - Файлы и папки (по умолчанию)
	;$i_Flag = 1 - Только файлы
	;$i_Flag = 2 - Только папки (если ищем конкретную папку, то надо добавлять к имени * в начало  или в конец)
	;$i_SubDir = 1 - Искать во всех подкаталогах (по умолчанию). Возвращает полные пути.
	;$i_SubDir = 0 - Искать только в самой папке. Возвращает только имена файлов(папок).
	Local $s_Out, $a_Out, $s_Read, $h_Dir, $s_Attrib, $s_Subdir, $s_Parameter, $a_Masks

	If StringRight($s_Path_Search, 1) == '\' Then
		$s_Path_Search = StringTrimRight($s_Path_Search, 1)
	EndIf
	$a_Masks = StringSplit($s_File_Mask, '|')
	For $i = 1 To $a_Masks[0]
		$s_Parameter &= '"' & $s_Path_Search & '\' & $a_Masks[$i] & '";'
	Next
	$s_Parameter = StringTrimRight($s_Parameter, 1)
	If $i_SubDir Then
		$s_Subdir = ' /S /B'
	Else
		$s_Subdir = ' /B'
	EndIf
	Switch $i_Flag
		Case 1
			$s_Attrib = ' /A-D'
		Case 2
			$s_Attrib = ' /AD'
		Case Else
			$s_Attrib = ' /A'
	EndSwitch
	$s_Parameter &= $s_Subdir & $s_Attrib
	$s_Out = StringToBinary('0' & @CRLF, 2)
	$h_Dir = Run(@ComSpec & ' /U /C DIR ' & $s_Parameter, @SystemDir, @SW_HIDE, 6)
	If Not $h_Dir Then Return SetError(1)
	While 1
		$s_Read = StdoutRead($h_Dir, False, True)
		If @error Then
			ExitLoop
		EndIf
		If $s_Read Then
			$s_Out &= $s_Read
		EndIf
		Sleep(10)
	WEnd
	$a_Out = StringRegExp(BinaryToString($s_Out, 2), '[^\r\n]+', 3)
	If @error Then Return SetError(1)
	$a_Out[0] = UBound($a_Out) - 1
	Return $a_Out
EndFunc   ;==>_FileSearch
 
Автор
A

at

Гость
1. Прошу объяснить по этой строке, в этой части + $aCheckBox[0][0] * 30
Код:
$nButton = GUICtrlCreateButton('Go', 50, 10 + $aCheckBox[0][0] * 30, 100, 30)


2. Как теперь изменить имена чекбоксов, так чтоб, не затронуть поиск по маске ?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
at,
1. Это простая арифметика. В зависимости от количества Checkbox`ов вычисляем размер окна и положение кнопки.
2. Не совсем понял, что Вы хотите изменить. Если имена файлов, то какие вставите в массив, те скрипт и будет искать (в массиве должны быть только имена файлов). ИМХО, в подписях Checkbox`ов имена файлов должны быть, а добавить к ним можно любые фразы, Например:
Код:
;...
$aCheckBox[$i][1] = GUICtrlCreateCheckbox('Файл ' & $aCheckBox[$i][0] & ' для поиска' , 30, 150 + ($i - 1) * 30, 140, 20)
;...
 
Автор
A

at

Гость
Можно ли скрыть имена файлов в интерфейсе ? Нужно чтобы отображались названия приложений, которые относятся к этим файлам.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
at [?]
Нужно чтобы отображались названия приложений, которые относятся к этим файлам.
Файла у Вас два, а приложений тоже два или больше?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
at,
Замените эти строки
Код:
;...
Dim $aCheckBox[3][2] = [[2],['server.txt'],['user.config']]
;...
$aCheckBox[$i][1] = GUICtrlCreateCheckbox('Выбрать ' & $aCheckBox[$i][0], 30, 150 + ($i - 1) * 30, 140, 20)
;...
GUISetState()
;...

на эти
Код:
;...
Dim $aCheckBox[3][3] = [[2],['server.txt', '', 'Прог 1'],['user.config', '', 'Прог 2']];на свои приложения замените.
;...
$aCheckBox[$i][1] = GUICtrlCreateCheckbox('Выбрать ' & $aCheckBox[$i][2], 30, 150 + ($i - 1) * 30, 140, 20)
;...можно не менять:
ReDim $aCheckBox[3][2]
GUISetState()
;...
 
Автор
A

at

Гость
madmasles

Спасибо агромное за помощь! Все работает в лучшем виде. Тема в принципе решена.
Осталось разобраться с интерфейсом. К сожалению в данной теме все равно осталось для меня не ясно, можно ли было решить мою задачу более простым путем.
Как то так, что ли:
Код:
Case $Button1
            $check=GUICtrlRead($Checkbox1)
            If $check=1 then
                GUICtrlSetData($Label1,'Отмечен')
            Else
                GUICtrlSetData($Label1,'Не отмечен')
            EndIf


Еще вопрос остался в этой теме:
В зависимости от количества Checkbox`ов вычисляем размер окна и положение кнопки.
Я заметил, что без этой строки + $aCheckBox[0][0] * 30 все работает вроде бы правильно. На сколько критично ее отсутствие ?

Вот собственно и результат.
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>

Global $vText_Server_1 = '10.10.1.10'
Global $vText_Server_2 = '10.10.1.20'
Global $vText_Server_3 = '10.10.1.30'
Global $vText_Server_4 = '10.10.1.40'
Global $vText_Server_5 = '10.10.1.50'
Global $vReplace_1 = '10.10.1.20|10.10.1.30|10.10.1.40|10.10.1.50'
Global $vReplace_2 = '10.10.1.10|10.10.1.30|10.10.1.40|10.10.1.50'
Global $vReplace_3 = '10.10.1.20|10.10.1.10|10.10.1.40|10.10.1.50'
Global $vReplace_4 = '10.10.1.20|10.10.1.30|10.10.1.10|10.10.1.50'
Global $vReplace_5 = '10.10.1.20|10.10.1.30|10.10.1.40|10.10.1.10'
Dim $aCheckBox[3][3] = [[2],['server.txt', '', 'Программу  А'],['user.config', '', 'Программу  Б']]

$hForm = GUICreate('Server_Change', 180, 267, 300, 165)
$vPageControl1 = GUICtrlCreateTab(0, 8, 180, 259)
$vTabSheet_General = GUICtrlCreateTabItem('      Выбор      ')
$vButton_Server_1 = GUICtrlCreateButton('Сервер 1', 8, 42, 75, 25)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$vButton_Server_2 = GUICtrlCreateButton('Сервер 2', 8, 74, 75, 25)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$vButton_Server_3 = GUICtrlCreateButton('Сервер 3', 8, 106, 75, 25)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$vButton_Server_4 = GUICtrlCreateButton('Сервер 4', 8, 138, 75, 25)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$vButton_Server_5 = GUICtrlCreateButton('Сервер 5', 8, 169, 75, 25)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$vLabel1 = GUICtrlCreateLabel('10.10.1.10', 96, 49, 61, 18)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$vLabel2 = GUICtrlCreateLabel('10.10.1.20', 96, 81, 55, 18)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$vLabel3 = GUICtrlCreateLabel('10.10.1.30', 96, 113, 73, 18)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$vLabel4 = GUICtrlCreateLabel('10.10.1.40', 96, 145, 79, 18)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$vLabel5 = GUICtrlCreateLabel('10.10.1.50', 96, 177, 73, 18)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
For $i = 1 To $aCheckBox[0][0]
    $aCheckBox[$i][1] = GUICtrlCreateCheckbox('Выбрать ' & $aCheckBox[$i][2], 20, 205 + ($i - 1) * 30, 140, 20)
Next
$vTabSheet_Option = GUICtrlCreateTabItem('      Инфо      ')
$vGroup1 = GUICtrlCreateGroup('', 8, 40, 162, 97)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$vLabel6 = GUICtrlCreateLabel('Локальный          Интернет', 16, 56, 144, 18)
$vLabel7 = GUICtrlCreateLabel('10.10.1.10', 16, 72, 61, 18)
$vLabel8 = GUICtrlCreateLabel('10.10.1.20', 16, 88, 55, 18)
$vLabel9 = GUICtrlCreateLabel('    10.10.1.30', 88, 72, 73, 18)
$vLabel10 = GUICtrlCreateLabel('    10.10.1.40', 88, 88, 79, 18)
$vLabel11 = GUICtrlCreateLabel('    10.10.1.50', 88, 104, 73, 18)
GUICtrlCreateGroup('', -99, -99, 1, 1)
$vGroup2 = GUICtrlCreateGroup('', 8, 144, 162, 50)
GUICtrlSetFont(-1, 8, 400, 0, 'Arial')
$vLabel12 = GUICtrlCreateLabel('www.autoit-script.ru', 40, 165, 98, 18)
GUICtrlCreateGroup('', -99, -99, 1, 1)
GUICtrlCreateTabItem('')
ReDim $aCheckBox[3][2]
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    Case $vButton_Server_1
            $sFiles = ''
            For $i = 1 To $aCheckBox[0][0]
                If BitAND(GUICtrlRead($aCheckBox[$i][1]), $GUI_CHECKED) Then
                    $sFiles &= $aCheckBox[$i][0] & '|'
                EndIf
            Next
            If Not $sFiles Then
                MsgBox(0, ' Info', 'Выберите программу', 0, $hForm)
                ContinueLoop
            EndIf
            $sFiles = StringTrimRight($sFiles, 1)
            $aSearch = _FileSearch('C:', $sFiles, 1)
            If @error Then
                MsgBox(16, ' Info', 'Ошибка')
                Exit
            EndIf
            If Not $aSearch[0] Then
                MsgBox(0, ' Info', 'Не найдены файлы конфигурации')
                Exit
            EndIf
            For $i = 1 To $aSearch[0]
                $vRead = FileRead($aSearch[$i]) ;Считываем
                $vOpen = FileOpen($aSearch[$i], 2) ;Открываем
                $vReplace = StringRegExpReplace($vRead, $vReplace_1, $vText_Server_1) ;Изменяем
                FileWrite($vOpen, $vReplace) ;Переписываем
                FileClose($vOpen) ;Закрываем
            Next
            
    Case $vButton_Server_2
            $sFiles = ''
            For $i = 1 To $aCheckBox[0][0]
                If BitAND(GUICtrlRead($aCheckBox[$i][1]), $GUI_CHECKED) Then
                    $sFiles &= $aCheckBox[$i][0] & '|'
                EndIf
            Next
            If Not $sFiles Then
                MsgBox(0, ' Info', 'Выберите программу', 0, $hForm)
                ContinueLoop
            EndIf
            $sFiles = StringTrimRight($sFiles, 1)
            $aSearch = _FileSearch('C:', $sFiles, 1)
            If @error Then
                MsgBox(16, ' Info', 'Ошибка')
                Exit
            EndIf
            If Not $aSearch[0] Then
                MsgBox(0, ' Info', 'Не найдены файлы конфигурации')
                Exit
            EndIf
            For $i = 1 To $aSearch[0]
                $vRead = FileRead($aSearch[$i]) ;Считываем
                $vOpen = FileOpen($aSearch[$i], 2) ;Открываем
                $vReplace = StringRegExpReplace($vRead, $vReplace_2, $vText_Server_2) ;Изменяем
                FileWrite($vOpen, $vReplace) ;Переписываем
                FileClose($vOpen) ;Закрываем
            Next
            
    Case $vButton_Server_3
            $sFiles = ''
            For $i = 1 To $aCheckBox[0][0]
                If BitAND(GUICtrlRead($aCheckBox[$i][1]), $GUI_CHECKED) Then
                    $sFiles &= $aCheckBox[$i][0] & '|'
                EndIf
            Next
            If Not $sFiles Then
                MsgBox(0, ' Info', 'Выберите программу', 0, $hForm)
                ContinueLoop
            EndIf
            $sFiles = StringTrimRight($sFiles, 1)
            $aSearch = _FileSearch('C:', $sFiles, 1)
            If @error Then
                MsgBox(16, ' Info', 'Ошибка')
                Exit
            EndIf
            If Not $aSearch[0] Then
                MsgBox(0, ' Info', 'Не найдены файлы конфигурации')
                Exit
            EndIf
            For $i = 1 To $aSearch[0]
                $vRead = FileRead($aSearch[$i]) ;Считываем
                $vOpen = FileOpen($aSearch[$i], 2) ;Открываем
                $vReplace = StringRegExpReplace($vRead, $vReplace_3, $vText_Server_3) ;Изменяем
                FileWrite($vOpen, $vReplace) ;Переписываем
                FileClose($vOpen) ;Закрываем
            Next            
    Case $vButton_Server_4
            $sFiles = ''
            For $i = 1 To $aCheckBox[0][0]
                If BitAND(GUICtrlRead($aCheckBox[$i][1]), $GUI_CHECKED) Then
                    $sFiles &= $aCheckBox[$i][0] & '|'
                EndIf
            Next
            If Not $sFiles Then
                MsgBox(0, ' Info', 'Выберите программу', 0, $hForm)
                ContinueLoop
            EndIf
            $sFiles = StringTrimRight($sFiles, 1)
            $aSearch = _FileSearch('C:', $sFiles, 1)
            If @error Then
                MsgBox(16, ' Info', 'Ошибка')
                Exit
            EndIf
            If Not $aSearch[0] Then
                MsgBox(0, ' Info', 'Не найдены файлы конфигурации')
                Exit
            EndIf
            For $i = 1 To $aSearch[0]
                $vRead = FileRead($aSearch[$i]) ;Считываем
                $vOpen = FileOpen($aSearch[$i], 2) ;Открываем
                $vReplace = StringRegExpReplace($vRead, $vReplace_4, $vText_Server_4) ;Изменяем
                FileWrite($vOpen, $vReplace) ;Переписываем
                FileClose($vOpen) ;Закрываем
            Next

    Case $vButton_Server_5
            $sFiles = ''
            For $i = 1 To $aCheckBox[0][0]
                If BitAND(GUICtrlRead($aCheckBox[$i][1]), $GUI_CHECKED) Then
                    $sFiles &= $aCheckBox[$i][0] & '|'
                EndIf
            Next
            If Not $sFiles Then
                MsgBox(0, ' Info', 'Выберите программу', 0, $hForm)
                ContinueLoop
            EndIf
            $sFiles = StringTrimRight($sFiles, 1)
            $aSearch = _FileSearch('C:', $sFiles, 1)
            If @error Then
                MsgBox(16, ' Info', 'Ошибка')
                Exit
            EndIf
            If Not $aSearch[0] Then
                MsgBox(0, ' Info', 'Не найдены файлы конфигурации')
                Exit
            EndIf
            For $i = 1 To $aSearch[0]
                $vRead = FileRead($aSearch[$i]) ;Считываем
                $vOpen = FileOpen($aSearch[$i], 2) ;Открываем
                $vReplace = StringRegExpReplace($vRead, $vReplace_5, $vText_Server_5) ;Изменяем
                FileWrite($vOpen, $vReplace) ;Переписываем
                FileClose($vOpen) ;Закрываем
            Next
    EndSwitch
WEnd

Func _FileSearch($s_Path_Search, $s_File_Mask = '*', $i_Flag = 0, $i_SubDir = 1)

    Local $s_Out, $a_Out, $s_Read, $h_Dir, $s_Attrib, $s_Subdir, $s_Parameter, $a_Masks

    If StringRight($s_Path_Search, 1) == '\' Then
        $s_Path_Search = StringTrimRight($s_Path_Search, 1)
    EndIf
    $a_Masks = StringSplit($s_File_Mask, '|')
    For $i = 1 To $a_Masks[0]
        $s_Parameter &= '"' & $s_Path_Search & '\' & $a_Masks[$i] & '";'
    Next
    $s_Parameter = StringTrimRight($s_Parameter, 1)
    If $i_SubDir Then
        $s_Subdir = ' /S /B'
    Else
        $s_Subdir = ' /B'
    EndIf
    Switch $i_Flag
        Case 1
            $s_Attrib = ' /A-D'
        Case 2
            $s_Attrib = ' /AD'
        Case Else
            $s_Attrib = ' /A'
    EndSwitch
    $s_Parameter &= $s_Subdir & $s_Attrib
    $s_Out = StringToBinary('0' & @CRLF, 2)
    $h_Dir = Run(@ComSpec & ' /U /C DIR ' & $s_Parameter, @SystemDir, @SW_HIDE, 6)
    If Not $h_Dir Then Return SetError(1)
    While 1
        $s_Read = StdoutRead($h_Dir, False, True)
        If @error Then
            ExitLoop
        EndIf
        If $s_Read Then
            $s_Out &= $s_Read
        EndIf
        Sleep(10)
    WEnd
    $a_Out = StringRegExp(BinaryToString($s_Out, 2), '[^\r\n]+', 3)
    If @error Then Return SetError(1)
    $a_Out[0] = UBound($a_Out) - 1
    Return $a_Out
EndFunc   ;==>_FileSearch
Правда теперь чекбокс отображается на двух вкладках, что не совсем правильно, помоему, хоть и на работу скрипта это не влияет. Это видимо уже другая тема.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
at [?]
Правда теперь чекбокс отображается на двух вкладках, что не совсем правильно,
Создавайте их перед второй вкладкой.
Код:
;...
For $i = 1 To $aCheckBox[0][0]
	$aCheckBox[$i][1] = GUICtrlCreateCheckbox('Выбрать ' & $aCheckBox[$i][2], 20, 205 + ($i - 1) * 30, 140, 20)
Next
$TabSheet_Option = GUICtrlCreateTabItem('     Инфо     ')
;...

Я заметил, что без этой строки + $aCheckBox[0][0] * 30 все работает вроде бы правильно. На сколько критично ее отсутствие ?
Она Вам и не нужна, у Вас фиксированные размеры окна.
 
Автор
A

at

Гость
Все поправил в предыдущем посте. Теперь почти все как по учебнику.
 
Верх