Что нового

Установить количество чекбоксов равным вводу пользователя

fortages

Новичок
Сообщения
81
Репутация
3
Доброго времени суток!
Помогите, пожалуйста...
Программа показывает список txt-файлов в текущем каталоге. После "ручного" выбора нужных файлов и нажатия кнопки ОК - формирует из этих выбранных файлов один.
Не знаю как сделать так, чтобы пользователь ввел в поле значение (любое число) и такому же количеству чекбоксов установилось значение "выбрано" (аналог $GUI_CHECKED в RadioBox, не знаю, как правильно называется) для рандомных файлов (или хоть по порядку, хоть как-нибудь).
668b04efde22.jpg

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$GUI=GUICreate('Список',400, 505, 477, 87)
 $LIST=GUICtrlCreateTreeView(16, 16, 369, 369,0x0100)
 $START= GUICtrlCreateButton('ОК', 8, 456, 161, 33)
$ButtonExit = GUICtrlCreateButton('Выход', 224, 456, 161, 33)
;############################################
$NumberLabel = GUICtrlCreateLabel("Количество", 8, 408, 60, 17)
$NumberOK = GUICtrlCreateButton("Применить", 280, 408, 105, 25)
$NumberInput = GUICtrlCreateInput("", 72, 408, 193, 21)

;############################################
 Dim $A[1]=[0]
 
 $SEARCH=FileFindFirstFile('*.TXT')

 $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
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, "Количество", GUICtrlRead($NumberInput))
;############################################		 
		 
EndSwitch
WEnd
Просто, чтоб не кликать вручную, если их должно быть выбрано много...
Значение переменной получить могу, кнопка "Применить" работает (строка 54-60), а вот условие составить не могу. :'(
Помогите, если можно...
 

ahjkcfout7

Знающий
Сообщения
26
Репутация
6
можно написать строки... не знаю..то что вам надо или нет..
Код:
global $msg = GUIGetMsg()
select 
case $msg = -3
exit
case $msg=$NumberOK
for $i=1 to Количество
GUICtrlSetState(чекбокс$i, $GUI_CHECKED)
endselect
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
Код:
чекбокс$i

Так сами же чекбоксы не обозначены никак или чего-то не понимаю...
 

ahjkcfout7

Знающий
Сообщения
26
Репутация
6
начали вы немного не верно...не зная содержимого файла INFO.TXT не могу переписать код


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

и список.txt'
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
Файл Список.txt это "сборная солянка" из выбранных файлов.
То есть был в папке Отчет-за-январь.txt, Отчет-за-февраль.txt, Отчет-за-март.txt, пользователь выбрал 1 и 3, вот содержимое этих двух файлов записывается в Список.txt.

info.txt по сути, то же самое.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
попробуй так
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $GUI = GUICreate('Список', 400, 505, 477, 87), $flag = 0
Global $LIST = GUICtrlCreateTreeView(16, 16, 369, 369, 0x0100)
$START = GUICtrlCreateButton('ОК', 8, 456, 161, 33)
$ButtonExit = GUICtrlCreateButton('Выход', 224, 456, 161, 33)
;############################################
$NumberLabel = GUICtrlCreateLabel("Количество", 8, 408, 60, 17)
$NumberOK = GUICtrlCreateButton("Применить", 280, 408, 105, 25)
Global $NumberInput = GUICtrlCreateInput("", 72, 408, 193, 21, $ES_NUMBER)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
;############################################
Dim $A[1] = [0]
$SEARCH = FileFindFirstFile('*.TXT')

$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
		Local $numbercheck = GUICtrlRead($NumberInput)
		If $numbercheck <> '' Then
			For $i = 1 To UBound($A) - 1
				GUICtrlSetState($A[$i], $GUI_UNCHECKED)
			Next
			For $i = 1 To $numbercheck
				GUICtrlSetState($A[$i], $GUI_CHECKED)
			Next
		EndIf
	EndIf
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $START
			$REPORT = FileOpen('список.txt', 2)
			For $COUNTER = 1 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
			Local $checkall = '', $id = ''
			For $i = 1 To UBound($A) - 1
				If GUICtrlRead($A[$i]) = 257 Or GUICtrlRead($A[$i]) = 1 Then
					$id &= $A[$i] & @LF
					$checkall += 1
				EndIf
			Next
			MsgBox(0, "Количество - " & $checkall, $id)
			;############################################

	EndSwitch
WEnd
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
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
joiner я обожаю этот форум.
101802.gif

Огромное спасибо, все заработало :smile:
А можно уточнить на будущее- как? :-[
Код:
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) ;элементу [$i] из массива [$A] присвоить значение $GUI_CHECKED
            Next
        EndIf


А функцию WM_COMMAND не поняла...
Код:
BitShift
Это побитовый сдвиг? Перебираются "пошагово" все галочки?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
$A[$COUNTER] = GUICtrlCreateTreeViewItem($FAM, $LIST)

возвращает идентификатор элемента. соответственно у тебя в массиве находятся все идентификаторы (имена) элементов TreeView
значит используя их мы можем управлять элементами.
я немного изменил пример. смотри выше
для объявления массива используй
Код:
Local $A[1]

можно не присваивать первому элементу значение. оно и так будет равно пустой строке или 0
в последних версиях языка есть возможность объявлять массив без элементов
Код:
Local $A[0]

а потом при создании элементов TreeView массив заполняется
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
joiner спасибо, кажется, до меня начинает доходить. ;D

Благодарю за помощь. :beer:
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
немного измени условие установки отметок пунктов
Код:
If $flag = 1 Then
		$flag = 0
		Local $numbercheck = GUICtrlRead($NumberInput)
		If $numbercheck <> '' And UBound($A) > 1 Then; элемент ввода не пустой , массив не пустой(первый элемент не учитывается)
			For $i = 1 To UBound($A) - 1
				GUICtrlSetState($A[$i], $GUI_UNCHECKED)
			Next
			If $numbercheck > UBound($A) - 2 Then $numbercheck = UBound($A) - 1; учитывает ошибку , когда введенное число больше количества элементов
			For $i = 1 To $numbercheck
				GUICtrlSetState($A[$i], $GUI_CHECKED)
			Next
		EndIf
	EndIf
 
Автор
fortages

fortages

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