Что нового

Неясности в работе некоторых функций.

gora

Знающий
Сообщения
315
Репутация
19
Имеется тестовый скрипт:
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#Include <EditConstants.au3>

_editIni()
Exit

Func _editIni()
	$setini = @ScriptDir & "\Settings.ini"
;	чтение настроек из ini файла
	$path7Zip = IniRead($setini, 'set', 'path7Zip', '')
	$nameModule = IniRead($setini, 'set', 'nameModule', '')
	$dict = IniRead($setini, 'set', 'dict', '')
	$useRAM = IniRead($setini, 'set', 'useRAM', '')

	$hGui = GUICreate('test', 490, 585, -1, -1, $WS_SYSMENU)
;	задание шрифта для окна
	GUISetFont(8.5, 400, 0, "Tahoma")
;	закладки
	GuiCtrlCreateTab(0, 0, 490, 505)
;	показ настроек из ini файла
	GuiCtrlCreateTabItem('test1')
	$sft = 25
	$toppoz = 25
	$num = 0
	$col = 270
	$col1 = 530 - $col - 57
	$hgtlin = 20
	
	GuiCtrlCreateLabel('Путь:', 10, $num * $toppoz + $sft + 3, $col-5, $hgtlin)
	$Ipath7Zip = GUiCtrlCreateInput($path7Zip, $col, $num * $toppoz + $sft, $col1-25, $hgtlin, _
	BitOR($ES_AUTOHSCROLL, $ES_LEFT, $ES_MULTILINE))
	GUICtrlSetState(-1, $GUI_DISABLE)
;	-----------------------------
	$Button = GUICtrlCreateButton('...', $col + $col1-20, $num * $toppoz + $sft, 20, 20)
;	-----------------------------
	$num += 1
	GuiCtrlCreateLabel('Модуль:', 10, $num * $toppoz + $sft + 3, $col-5, $hgtlin)
	$InameModule = GUICtrlCreateCombo('', $col, $num * $toppoz + $sft, $col1, -1, $CBS_DROPDOWNLIST)
;	поиск всех модулей для списка
	$file = _search(@ScriptDir & '\*.sfx')
	GUICtrlSetData(-1, $file, $nameModule)
;	-----------------------------
	$num += 1
	GuiCtrlCreateLabel('Словарь:', 10, $num * $toppoz + $sft + 3, $col-5, $hgtlin)
	$Idict = GuiCtrlCreateInput($dict, $col, $num * $toppoz + $sft, $col1)
;	-----------------------------
	$num += 1
	$blok = $GUI_DISABLE
	If $dict = '' Then $blok = $GUI_ENABLE
	$IuseRAM0 = GuiCtrlCreateLabel('Память [%]:', 10, $num * $toppoz + $sft + 3, $col-5, $hgtlin)
	GUICtrlSetState(-1, $blok)
	$IuseRAM = GuiCtrlCreateInput($useRAM, $col, $num * $toppoz + $sft, $col-67, $hgtlin)
	GUICtrlSetState(-1, $blok)
	GuiCtrlCreateUpDown(-1)
	GUICtrlSetLimit(-1,100,-100)
	GuiCtrlCreateTabItem('')
;	-----------------------------
	$num = 20
;	кнопки для выхода
	$ok1 = GUICtrlCreateButton("OK", 10 + 303, $num * $toppoz + $sft - 7, 70)
	$cancel1 = GUICtrlCreateButton("Отмена", 10 + 303 + 85, $num * $toppoz + $sft - 7, 70)
	
	GUISetState(@SW_SHOW)
	
	While 1
		Switch GUIGetMsg()
			Case 0
				ContinueLoop
			Case $GUI_EVENT_CLOSE, $cancel1
				Exit
			Case $Button
				$Path = FileOpenDialog('Путь', @ProgramFilesDir & '\7-Zip', 'Исполняемые файлы (*.exe)', 3, '7zFM.exe', $hGui)
				If $Path Then GUICtrlSetData($Ipath7Zip, StringRegExpReplace($Path, '\\[^\\]*$', '') & '\')
			Case $Idict
				$blok = $GUI_DISABLE
				If GUICtrlRead($Idict) = '' Then $blok = $GUI_ENABLE
				GUICtrlSetState($IuseRAM0, $blok)
				GUICtrlSetState($IuseRAM, $blok)
			Case $ok1
;	запись секции настроек
				$txtIni = 'path7Zip=' & GUICtrlRead($Ipath7Zip) & @LF & _
				'nameModule=' & GUICtrlRead($InameModule) & @LF & _
				'dict=' & GUICtrlRead($Idict) & @LF & _
				'useRAM=' & GUICtrlRead($IuseRAM) & @LF
;				IniWriteSection($setini, 'set', $txtIni)
				GUIDelete()
				Exit
		EndSwitch
	WEnd
EndFunc	;==> _editIni()
; ----------------------------------------------------------------------------------------------------------
Func _search($ts)
	$search = FileFindFirstFile($ts)  
	If $search = -1 Then
		$preskey = MsgBox(1+256, "Error", 'No File!')
		Exit
	EndIf
	$file = ''
	While 1
		$file &= FileFindNextFile($search) & '|'
		If @error Then ExitLoop
	WEnd
	FileClose($search)
	Return StringReplace($file, '||', '')
EndFunc	;==> _search()
Для его проверки требуется файл Settings.ini:
Код:
;-------------- File of options -------------
текст
[set]
path7Zip=C:\Program Files\7-Zip\
nameModule=7zsd_LZMA2.sfx
dict=
useRAM=-90
[cop]
текст
и несколько файлов с расширением .sfx, произвольного содержания, расположенные рядом с тестовым скриптом.

Вопросы:
1. Почему путь, указанный в строке
Код:
$Path = FileOpenDialog('Путь', @ProgramFilesDir & '\7-Zip', 'Исполняемые файлы (*.exe)', 3, '7zFM.exe', $hGui)

не всегда срабатывает? На некоторых системах при нажатии кнопки [...] открывается папка архиватора, а на некоторых открывается окно с другой папкой, видимо запомненой системой от предыдущего сеанса поиска папки.
2. Какова логика нахождения имен файлов командой FileFindNextFile ?
По алфавиту, по размеру, по дате или вообще без всякого порядка?
В выпадающем списке поля 2 я не увидел этой логики.
3. Поле 4 (Память) зависимо от содержания поля 3 (Словарь). Так задумано. И все вроде работает, но есть ошибка. Если в пустое поле 3 вписать любое число, а затем мышкой нажать на кнопочку больше\меньше в поле 4, то поле 4 становится неактивным, но кнопка продолжает действовать. При этом все остальное окно перестает реагировать и закрыть его не получается (закрываю из панели задач).
Как это можно исправить?
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
gora
1. Я думаю причина в отсутствии указанной папки. Если её нет, то диалог не может её открыть и выбирает последний путь (у меня её нет, потому что 7-zip вообще не в папке "Program Files").
2. Логика я думаю по имени, тут критейрий не важен поэтому используется наиболее незатратный способ (по другим критериям требуется вычисления, например размера).
3. А почему на Input у тебя стоит опрос GUI? Это что-ли кнопка? Input Должен обрабатываться при нажатии OK, если пустое то ничего не делать предупредив об ошибке; если заполнен, сделать нужные элементы неактивными и продолжить выполнение.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
AZJIO
1 Папка архиватора есть во всех случаях. А результаты разные.
AZJIO [?]
Не получается у меня так, можете проверить, создав несколько файлов с разными именами и расширением .sfx
3 Я Вас не понял... :(
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
AZJIO [?]
Конечно же проверил.
2. Не подтверждаю сортировку по имени.
modules.png

AZJIO [?]
Убрать "Case $Idict" и сопутствующие под-команды
3. Мне нужно, чтобы $IuseRAM0 и $IuseRAM становились неактивными/активными "на лету" без перезапуска окна.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
gora
1. Посмотри что возвращает @ProgramFilesDir там где у тебя выдаёт не то, что ты хочешь.
2. У меня XP и те же самые файлы сортируются правильно.
3.
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#Include <EditConstants.au3>
Global $Idict, $IuseRAM, $IuseRAM0

_editIni()
Exit

Func _editIni()
    $setini = @ScriptDir & "\Settings.ini"
;   чтение настроек из ini файла
    $path7Zip = IniRead($setini, 'set', 'path7Zip', '')
    $nameModule = IniRead($setini, 'set', 'nameModule', '')
    $dict = IniRead($setini, 'set', 'dict', '')
    $useRAM = IniRead($setini, 'set', 'useRAM', '')

    $hGui = GUICreate('test', 490, 585, -1, -1, $WS_SYSMENU)
;   задание шрифта для окна
    GUISetFont(8.5, 400, 0, "Tahoma")
;   закладки
    GuiCtrlCreateTab(0, 0, 490, 505)
;   показ настроек из ini файла
    GuiCtrlCreateTabItem('test1')
    $sft = 25
    $toppoz = 25
    $num = 0
    $col = 270
    $col1 = 530 - $col - 57
    $hgtlin = 20
   
    GuiCtrlCreateLabel('Путь:', 10, $num * $toppoz + $sft + 3, $col-5, $hgtlin)
    $Ipath7Zip = GUiCtrlCreateInput($path7Zip, $col, $num * $toppoz + $sft, $col1-25, $hgtlin, _
    BitOR($ES_AUTOHSCROLL, $ES_LEFT, $ES_MULTILINE))
    GUICtrlSetState(-1, $GUI_DISABLE)
;   -----------------------------
    $Button = GUICtrlCreateButton('...', $col + $col1-20, $num * $toppoz + $sft, 20, 20)
;   -----------------------------
    $num += 1
    GuiCtrlCreateLabel('Модуль:', 10, $num * $toppoz + $sft + 3, $col-5, $hgtlin)
    $InameModule = GUICtrlCreateCombo('', $col, $num * $toppoz + $sft, $col1, -1, $CBS_DROPDOWNLIST)
;   поиск всех модулей для списка
    $file = _search(@ScriptDir & '\*.sfx')
    GUICtrlSetData(-1, $file, $nameModule)
;   -----------------------------
    $num += 1
    GuiCtrlCreateLabel('Словарь:', 10, $num * $toppoz + $sft + 3, $col-5, $hgtlin)
    $Idict = GuiCtrlCreateInput($dict, $col, $num * $toppoz + $sft, $col1)
;   -----------------------------
    $num += 1
    $blok = $GUI_DISABLE
    If $dict = '' Then $blok = $GUI_ENABLE
    $IuseRAM0 = GuiCtrlCreateLabel('Память [%]:', 10, $num * $toppoz + $sft + 3, $col-5, $hgtlin)
    GUICtrlSetState(-1, $blok)
    $IuseRAM = GuiCtrlCreateInput($useRAM, $col, $num * $toppoz + $sft, $col-67, $hgtlin)
    GUICtrlSetState(-1, $blok)
    GuiCtrlCreateUpDown(-1)
    GUICtrlSetLimit(-1,100,-100)
    GuiCtrlCreateTabItem('')
;   -----------------------------
    $num = 20
;   кнопки для выхода
    $ok1 = GUICtrlCreateButton("OK", 10 + 303, $num * $toppoz + $sft - 7, 70)
    $cancel1 = GUICtrlCreateButton("Отмена", 10 + 303 + 85, $num * $toppoz + $sft - 7, 70)
   
    GUISetState(@SW_SHOW)
	GUIRegisterMsg(0x0111, "WM_COMMAND")
   
    While 1
        Switch GUIGetMsg()
            Case 0
                ContinueLoop
            Case $GUI_EVENT_CLOSE, $cancel1
                Exit
            Case $Button
                $Path = FileOpenDialog('Путь', @ProgramFilesDir & '\7-Zip', 'Исполняемые файлы (*.exe)', 3, '7zFM.exe', $hGui)
                If $Path Then GUICtrlSetData($Ipath7Zip, StringRegExpReplace($Path, '\\[^\\]*$', '') & '\')
            Case $ok1
;   запись секции настроек
                $txtIni = 'path7Zip=' & GUICtrlRead($Ipath7Zip) & @LF & _
                'nameModule=' & GUICtrlRead($InameModule) & @LF & _
                'dict=' & GUICtrlRead($Idict) & @LF & _
                'useRAM=' & GUICtrlRead($IuseRAM) & @LF
;               IniWriteSection($setini, 'set', $txtIni)
                GUIDelete()
                Exit
        EndSwitch
    WEnd
EndFunc ;==> _editIni()
; ----------------------------------------------------------------------------------------------------------
Func _search($ts)
    $search = FileFindFirstFile($ts)  
    If $search = -1 Then
        $preskey = MsgBox(1+256, "Error", 'No File!')
        Exit
    EndIf
    $file = ''
    While 1
        $file &= FileFindNextFile($search) & '|'
        If @error Then ExitLoop
    WEnd
    FileClose($search)
    Return StringReplace($file, '||', '')
EndFunc ;==> _search()

Func WM_COMMAND($hWnd, $MsgID, $WParam, $LParam)
    $nID = BitAND($wParam, 0x0000FFFF)
	If $nID = $Idict Then
		Local $blok = $GUI_ENABLE
		If GUICtrlRead($Idict) Then $blok = $GUI_DISABLE
		GUICtrlSetState($IuseRAM0, $blok)
		GUICtrlSetState($IuseRAM, $blok)
	EndIf
    Return $GUI_RUNDEFMSG
EndFunc
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
AZJIO [?]
Посмотри что возвращает @ProgramFilesDir там где у тебя выдаёт не то, что ты хочешь.
А вот за это спасибо. Действительно не ту папку выдает (правда в обоих случаях) - c:\Program Files (x86) :(
А у меня на Win7 x64. Может показывать по алфавиту, а может и как захочет.
3. Спасибо, посмотрю повнимательнее, хотя визуальные эффекты такого решения мне не понравились. :( Другого нет?
 
Верх