Что нового

[Элементы GUI] Выделение элементов ListView

Lubitel Softa

Новичок
Сообщения
2
Репутация
1
Всем доброго дня. Пишу маленький скриптик для установки обновлений Windows 7 и застрял на таком моменте: как в ListView выделить строку с нужным мне значением? В моём конкретном случае, в списке должна выделяться строка с именем обновления, которое устанавливается в текущий момент. Помогите, пожалуйста, разобраться.



Код:
#NoTrayIcon
#RequireAdmin


If WinExists (@ScriptName) Then Exit
AutoItWinSetTitle (@ScriptName)


#include <File.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiListView.au3>


AutoItSetOption ("MustDeclareVars", 1)

Global $tValue = DllStructCreate ("dword")
Global $search_upd, $sFPath, $aFiles, $iFiles, $msg, $iPrecent, $counter, $updates, $Form1, $Reboot, $Install, $Cancell, $Exit, _
$Silent_Checkbox, $ListView, $ProgressBar, $Label_Copyright, $nMsg, $FileSize, $FileSizeText, $ImenaObnov, $iPrecent
Global $msu = "msu"
Global $cab = "cab"


;Если установщик запущен не под 7, то выдаётся уведомление и работа завершается
If @OSVersion <> "WIN_7" Then
	MsgBox (48, "Установщик © StaforceBonus - Windows 7", "Программа рассчитана на работу только в среде Windows 7")
	Exit
EndIf


;В зависимости от разрядности ОС выбирается папка с обновлениями и все обновы считываются в массив
Select
	Case @OSArch = "X86"
		FileChangeDir (@ScriptDir & "\x86")
		$sFPath = (@ScriptDir & "\x86")
		$search_upd = FileFindFirstFile ("*.*")

	Case @OSArch = "X64"
		DllCall ("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "ptr", DllStructGetPtr ($tValue))
		Sleep (2000)
		FileChangeDir (@ScriptDir & "\x64")
		$sFPath = (@ScriptDir & "\x64")
		$search_upd = FileFindFirstFile ("*.*")
EndSelect

$aFiles = _FileListToArray ($sFPath, "*.*", 1)

If FileExists ($sFPath) = 0 Then
	MsgBox (16, "Установщик © StaforceBonus - Windows 7", "В текущем расположении отсутствуют папки x86/x64")
	Exit
EndIf

If IsArray ($aFiles) = 0 And FileExists ($sFPath) = 1 Then
	MsgBox (16, "Установщик © StaforceBonus - Windows 7", "В папке " & $sFPath & " не обнаружены обновления для Windows 7 " & @OSArch)
	Exit
EndIf

$iFiles = $aFiles[0]


;Графический интерфейс
$Form1 = GUICreate ("Установщик © StaforceBonus - Windows 7", 410, 412, 333, 344)
GUISetIcon ("C:\Windows\Icons\Applications\App 03.ico", -1)

$Reboot = GUICtrlCreateCheckbox ("Перезагрузка в конце", 8, 352, 137, 25)
GUICtrlSetState (-1, $GUI_CHECKED)

$Install = GUICtrlCreateButton ("Установить всё", 5, 313, 121, 33)
$Cancell = GUICtrlCreateButton ("Прервать установку", 145, 313, 121, 33)
$Exit = GUICtrlCreateButton ("Выход", 283, 313, 121, 33)

$Silent_Checkbox = GUICtrlCreateCheckbox ("Установка фоном", 160, 352, 113, 25)
GUICtrlSetState (-1, $GUI_CHECKED)

$ListView = GUICtrlCreateListView ("Пакеты обновления|Размер", 0, 0, 409, 281, $LVS_SHOWSELALWAYS, $LVS_EX_FULLROWSELECT)
_GUICtrlListView_SetColumnWidth ($ListView, 0, 300)
_GUICtrlListView_SetColumnWidth ($ListView, 1, 92)

$ProgressBar = GUICtrlCreateProgress (0, 285, 409, 17, $PBS_SMOOTH)

$Label_Copyright = GUICtrlCreateLabel ("© StaforceTEAM - Lubitel Softa", 127, 392, 155, 17)
GUICtrlSetFont (-1, 8, 400, 0, "Tahoma")

GUISetState (@SW_SHOW)


;Заполнение имён обновлений и их размеров в ListBox
For $i = 1 To $aFiles[0]
	If FileGetSize ($aFiles[$i]) >= 1048576 Then
		$FileSize = Round (FileGetSize ($aFiles[$i]) / 1048576, 2)
		$FileSizeText = $FileSize & " МБ"
	Else
		$FileSize = Round (FileGetSize ($aFiles[$i]) / 1024, 2)
		$FileSizeText = $FileSize & " КБ"
	EndIf

	GUICtrlCreateListViewItem ($aFiles[$i] & "|" & $FileSizeText, $ListView)
Next


;Здесь к кнопкам привязаны действия
Do
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Exit
			Exit
		Case $Install
			_Install()
	EndSwitch
Until $nMsg = $GUI_EVENT_CLOSE


;Установка обновлений
Func _Install()
$iPrecent = 0

While $search_upd = 1
	$updates = FileFindNextFile ($search_upd)
	If @error Then ExitLoop

	$iPrecent += (100 / $iFiles)
	GUICtrlSetData ($ProgressBar, $iPrecent)

	Switch StringRight ($updates, 3)
		Case $msu
			ShellExecuteWait ("wusa.exe", $updates & " /quiet /norestart", $sFPath, "open")
		Case $cab
			ShellExecuteWait ("PkgMgr.exe", "/ip /m:" & $updates & " /quiet /norestart", $sFPath, "open")
	EndSwitch

	If $iPrecent >= 100 Then
		$nMsg = $GUI_EVENT_CLOSE
	EndIf
WEnd
EndFunc

;Включение обратно перенаправления системных папок в Windows х64
If @OSArch = "X64" Then
	DllCall ("kernel32.dll", "int", "Wow64RevertWow64FsRedirection", "ptr", DllStructGetPtr ($tValue))
EndIf
 

sss

Продвинутый
Сообщения
332
Репутация
96
Роль выделения строчки в ListView играет функция _GUICtrlListView_SetItemSelected в GuiListView UDF.
Код:
#Include <GuiListView.au3>
_GUICtrlListView_SetItemSelected($hWnd, $iIndex[, $fSelected = True[, $fFocused  = False]])
Sets whether the item is selected

Parameters:
$hWnd - Handle to the control
$iIndex - Zero based index of the item, -1 to set selected state of all items
$fSelected - [optional] If True the item(s) are selected, otherwise not.
$fFocused - [optional] If True the item has focus, otherwise not.

Return Value:
Success: True
Failure: False
 
Автор
L

Lubitel Softa

Новичок
Сообщения
2
Репутация
1
Код который написан полное Г. Переписал заново и использовал функцию _GUICtrlListView_SetItemSelected - всё работает. Спасибо.
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Sky-WaLkeR [?]
Роль выделения строчки в ListView играет функция _GUICtrlListView_SetItemSelected в GuiListView UDF

Вообще - то существуют и встроенные, в Autoit решения, без подключения дополнительных библиотек.
Я говорю про функцию ControlListView() с высылаемой командной "Select"
Например:

Код:
$Gui = GUICreate("")
$list = GUICtrlCreateListView("Ст1      |Ст2 |Ст3  ",10,10,330,350)
$item1 = GUICtrlCreateListViewItem("строка1 | 1| 1   ", $list) 
$item2 = GUICtrlCreateListViewItem("строка2 | 2| 2   ", $list) 

GUIRegisterMsg($WM_SYSCOMMAND,"WM_SYSCOMMAND")
GUISetState()

While 1
    Sleep (1000)
    ControlListView($Gui, "", $list, "Select", 0) ; выделяем первую строку
    Sleep(1000)
    ControlListView($Gui, "", $list, "Select", 1) ; выделяем вторую строку
WEnd

Func WM_SYSCOMMAND($hwnd,$msg,$wParam,$lParam)
    $SC_CLOSE = 0xF060
    Switch $wParam
    Case $SC_CLOSE
        Exit
        Return 0
    EndSwitch
EndFunc
 

SharkyEXE

Новичок
Сообщения
120
Репутация
0
VladUs

Здравствуйте.

Здесь Вы привели образец, в котором жестко привязаны номер строк

выделяем первую строку
выделяем вторую строку


У меня есть окно, в котором нужно нажать на строку, где написано Динамики ( строка Динамики может быть под любым номером - первая, вторая, пятая )

Пожалуйста, помогите мне

Информация об окне ( Autoit Windows Info )

Код:
>>>> Window <<<<
Title:	Звук
Class:	#32770
Position:	198, 198
Size:	404, 448
Style:	0x94C800CC
ExStyle:	0x00050101
Handle:	0x00000000000504CE

>>>> Control <<<<
Class:	SysListView32
Instance:	1
ClassnameNN:	SysListView321
Name:	
Advanced (Class):	[CLASS:SysListView32; INSTANCE:1]
ID:	1000
Text:	
Position:	21, 63
Size:	357, 278
ControlClick Coords:	171, 53
Style:	0x5003010C
ExStyle:	0x00000204
Handle:	0x00000000000504E4

>>>> Mouse <<<<
Position:	393, 336
Cursor ID:	0
Color:	0xFFFFFF

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
Воспроизведение
Выберите устройство воспроизведения, параметры которого нужно изменить:
&Настроить
По умол&чанию
Сво&йства
ОК
Отмена
При&менить


>>>> Hidden Text <<<<
Справка

Спаисбо.
 

Вложения

  • Снимок1.jpg
    Снимок1.jpg
    93.9 КБ · Просмотры: 10

InnI

AutoIT Гуру
Сообщения
4,724
Репутация
1,355
Код:
ShellExecute("mmsys.cpl")
WinWaitActive("Звук")

$iItem = ControlListView("Звук", "", "SysListView321", "FindItem", "Динамики")
ControlListView("Звук", "", "SysListView321", "Select", $iItem)
ControlSend("Звук", "", "SysListView321", "{space}")
 

SharkyEXE

Новичок
Сообщения
120
Репутация
0
InnI

Здравствуйте.

Отлично, я Вам очень благодарен

Можно, Вас, немного, микро расширить Ваш код

После запуска Вашего кода появляется окно с заголовком Свойства: Динамики

1) Найти вкладку Дополнительные возможности ( вкладка может быть под любым номером )

2) Нажать на вкладку Дополнительные возможности

3-1) Если установлена птичка/галочка на строке Отключить все эффекты : в окне с заголовком Свойства: Динамики нажать кнопку Отмена

3-2) Если не установлена птичка/галочка на строке Отключить все эффекты :
- поставить птичку\галочку в строке Отключить все эффекты
- в окне с заголовком Свойства: Динамики нажать кнопку Применить
- в окне с заголовком Свойства: Динамики нажать кнопку ОК

3-3) В окне с заголовком Звук нажать кнопку ОК

Пожалуйста, я Вас очень прошу

Спасибо.
 

Вложения

  • Снимок1__.jpg
    Снимок1__.jpg
    174.1 КБ · Просмотры: 13

InnI

AutoIT Гуру
Сообщения
4,724
Репутация
1,355
SharkyEXE
Мало того, что это старая тема, так ещё ваше "расширение" никакого к ней отношения не имеет.
Я думаю вам лучше обратиться в Стол заказов.
 
Верх