Что нового

Как выполнить параметр из Ini при выборе в ComboBox

Nefakt

Новичок
Сообщения
74
Репутация
3
Всем привет!
Такой вопрос как можно сделать что бы при выборе в ComboBox Значение выполнялся параметр из INI?
Вот так я заполняю ComboBox
Код:
$sIni = IniReadSection(@ScriptDir & "\settings.ini", "Game")
If @error Then
    MsgBox(4096, "", "Произошла ошибка, возможно отсутствует INI-файл.")
Else
    For $i = 1 To $sIni[0][0]
GUICtrlSetData($Combo1, $sIni[$i][1], $sIni[1][0] ) ; Заполняю значениями ComboBox

GUICtrlSetData($Combo2, $sIni[$i][0]) ; Заполняю параметрами ComboBox2
	 Next


Вот как сделать что бы параметрами заполнялась переменная или массив.
Например ComboBox заполняется значениями из INI
и при выборе значения он выполнял параметр и выводил его.
Заранее спасибо.
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Так понимаю параметры хранятся в соседнем ComboBox ?
 
Автор
Nefakt

Nefakt

Новичок
Сообщения
74
Репутация
3
Нет все хранится в INI файле.
В коде это я временно туда их загружаю.
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Код:
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 245, 135, 192, 114)
$Combo1 = GUICtrlCreateCombo("", 56, 40, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "Item1|Item2|Item3", "Item1")
GUISetState(@SW_SHOW)

While True
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Combo1
			$sIni = IniReadSection(@ScriptDir & "\settings.ini", GUICtrlRead($Combo1))
			MsgBox(Null,Null,$sIni[1][1]) ; $sIni[1][1] - значение параметра
	EndSwitch
WEnd


Ini-файл:

Код:
[item1]
param = This is param1
[item2]
param = This is param2 
[item3]
param = This is param3
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
oesoes,
В Вашем варианте, ИМХО, лучше заполнять ComboBox с помощью функции IniReadSectionNames(), а при выборе использовать функцию IniRead(). А еще лучше, чтобы Nefakt дал пример ини-файла и более понятно объяснил, что он хочет в итоге получить.
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Ну я его заполняю при создании, так как так же просто попытался стелепатить и тоже до конца пока ещё не пойму, что нужно :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
лучше заполнять ComboBox с помощью функции IniReadSectionNames(), а при выборе использовать функцию IniRead()
Не совсем. Если файл после заполнения будет изменён, то в лучшем случае будут неправильно читаться данные, а в худшем будет ошибка.

Код:
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>

Global $sIni_File = @ScriptDir & '\Settings.ini'
Global $aIni_Read = IniReadSection($sIni_File, 'Game')

$hForm = GUICreate('Test', 250, 120)
$iCombo1 = GUICtrlCreateCombo('', 50, 40, 150, 50, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))

If IsArray($aIni_Read) Then
	$sData = ''
	
	For $i = 1 To UBound($aIni_Read) - 1
		$sData &= $aIni_Read[$i][0] & '|'
	Next
	
	GUICtrlSetData($iCombo1, StringTrimRight($sData, 1), $aIni_Read[1][0])
EndIf

GUISetState(@SW_SHOW)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iCombo1
			$iIndex = _ArraySearch($aIni_Read, GUICtrlRead($iCombo1), 1, 0, 1, 2, 1, 0)
			
			If $iIndex <> -1 Then
				MsgBox(64, 'Result', $aIni_Read[$iIndex][0] & ' = ' & $aIni_Read[$iIndex][1], 0, $hForm)
			EndIf
	EndSwitch
WEnd
 
Автор
Nefakt

Nefakt

Новичок
Сообщения
74
Репутация
3
Вот INI файл
Код:
[Game]
C:\Users\Администратор\Рабочий стол\Игры\[rutor.org]R.G._Mechanics_Metro_Redux_Dilogy.torrent=Метро2033
C:\Users\Администратор\Рабочий стол\Игры\[rutor.org]The_SIMS_4-_Deluxe_Edition_Update_1_2014_PC_-_R.torrent=Симс4
В ComboBox загружаются названия игр "Метро 2033" и т.д.
И если в ComboBox выбрать "Метро 2033" он должен запустить файл "C:\Users\Администратор\Рабочий стол\Игры\[rutor.org]R.G._Mechanics_Metro_Redux_Dilogy.torrent"
Вот весь код
Код:
Func _LoadSettings()
$sIni = IniReadSection(@ScriptDir & "\settings.ini", "Game")
If @error Then
    MsgBox(4096, "", "Произошла ошибка, возможно отсутствует INI-файл.")
Else
    For $i = 1 To $sIni[0][0]
GUICtrlSetData($Combo1, $sIni[$i][1], $sIni[1][0] )
;~ MsgBox(4096, "", "Значение: " & $sIni[$i][1])
GUICtrlSetData($Combo2, $sIni[$i][0])
;~ MsgBox(4096, "", "Параметр: " & $sIni[$i][0])
	 Next
  EndIf
EndFunc

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		 Case $Button3 ; Открыть при нажатии на эту кнопку. Он должен взять путь выбранной игры из списка и запустить .
Пример. я из списка выбрал Метро 2033 и он должен запустить файл "C:\Users\Администратор\Рабочий стол\Игры\[rutor.org]R.G._Mechanics_Metro_Redux_Dilogy.torrent" 
		 	ShellExecute($varq)
	EndSwitch
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR,
Индекс еще так можно получить.
Код:
;~ ...
$iIndex = GUICtrlSendMsg($iCombo1, $CB_GETCURSEL, 0, 0) + 1
;~ ...



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

Nefakt,
Если пользователь 10 раз выберет, например, Метро2033, то его надо 10 раз запускать?


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

CreatoR [?]
Если файл после заполнения будет изменён
ИМХО, можно сделать кнопку обновить или периодически сравнивать содержимое.
 
Автор
Nefakt

Nefakt

Новичок
Сообщения
74
Репутация
3
Если пользователь выберет 10 раз то да. Программа просто будет запускать торрент файлы от игры. Просто будет не большой библиотекой игр. Где пользователь сам будет добавлять торрент файл и название игры. А потом название игры будут загружаться в ComboBox и при выборе игры"Значение из INI" он должен открыть файл "Параметр который прописан в INI" и то есть при выборе игры он запускает файл а там дальше уже открывается клиент uTorrent.
Что то типа того хочу сделать. Добавлять в INI файл и считывать из него название игры в ComboBox у меня все получается. Вот я и спрашиваю как сделать что бы при выборе игры он брал параметр из INI "то есть путь до файла" и запускать его.
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Код:
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiComboBox.au3>

$Form1 = GUICreate("Form1", 245, 135, 192, 114)
$Combo1 = GUICtrlCreateCombo("", 56, 40, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUISetState(@SW_SHOW)

Local Const $pathIni = @ScriptDir & "\settings.ini";
;Local Const $uTorrentExe = EnvGet('ProgramFiles(x86)') & "\uTorrent\utorrent.exe"
Local Const $uTorrentExe = "C:\Program Files (x86)\uTorrent\utorrent.exe"

; читаем файл и заполняем комбобокс
$sIni = IniReadSection($pathIni, 'games')
for $i = 1 to UBound($sIni)-1
	_GUICtrlComboBox_AddString($Combo1,$sIni[$i][0])
Next

While True
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Combo1
			ShellExecute($uTorrentExe,IniRead($pathIni,'games',GUICtrlRead($Combo1),''))
    EndSwitch
WEnd


Формат ини-файла лучше сделать вот такой, это как бы де факто (а то вы в своем подставили под сомнение всю мою концепцию реальности):

Код:
[games]
Метро2033=C:\Users\Администратор\Рабочий стол\Игры\[rutor.org]R.G._Mechanics_Metro_Redux_Dilogy.torrent
Симсы=C:\Users\Администратор\Рабочий стол\Игры\[rutor.org]The_SIMS_4-_Deluxe_Edition_Update_1_2014_PC_-_R.torrent

Ну как-то так. Конечно необходимо допилить, в том числе и функцию добавления новых игр в ини-файл - это сделать очень просто функцией IniWrite(). Надеюсь помог. Путь к uTorrent замени на свой.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
Индекс еще так можно получить
Я в курсе, но поиском надёжнее ;).


ИМХО, можно сделать кнопку обновить или периодически сравнивать содержимое.
Можно, но зачем? можно же и без этого :smile:.

Nefakt [?]
если в ComboBox выбрать "Метро 2033" он должен запустить файл "C:\Users\Администратор\Рабочий стол\Игры\[rutor.org]R.G._Mechanics_Metro_Redux_Dilogy.torrent"
Я так понял по нажатию кнопки?

Ещё вариант:
Код:
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>

Global $sIni_File = @ScriptDir & '\Settings.ini'
Global $aIni_Read = IniReadSection($sIni_File, 'Game')

$hForm = GUICreate('Test', 500, 140)
$iCombo = GUICtrlCreateCombo('', 20, 40, 460, 50, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))

If IsArray($aIni_Read) Then
	$sData = ''
	
	For $i = 1 To UBound($aIni_Read) - 1
		$sData &= $aIni_Read[$i][1] & '|'
	Next
	
	GUICtrlSetData($iCombo, StringTrimRight($sData, 1), $aIni_Read[1][1])
EndIf

$iLabel = GUICtrlCreateLabel(StringRegExpReplace($aIni_Read[1][0], '^.*\\', ''), 20, 70, 460, 30)
$iButton = GUICtrlCreateButton('Запустить', 20, 110, 70, 20)

GUISetState(@SW_SHOW)

While 1
	$iMsg = GUIGetMsg()
	
	Switch $iMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iCombo, $iButton
			$iIndex = _ArraySearch($aIni_Read, GUICtrlRead($iCombo), 1, 0, 1, 2, 1, 1)
			
			If $iIndex <> -1 Then
				If $iMsg = $iCombo Then
					GUICtrlSetData($iLabel, StringRegExpReplace($aIni_Read[$iIndex][0], '^.*\\', ''))
				Else
					ShellExecute($aIni_Read[$iIndex][0])
				EndIf
			EndIf
	EndSwitch
WEnd
 
Автор
Nefakt

Nefakt

Новичок
Сообщения
74
Репутация
3
oesoes сказал(а):
Формат ини-файла лучше сделать вот такой, это как бы де факто (а то вы в своем подставили под сомнение всю мою концепцию реальности):

Код:
[games]
Метро2033=C:\Users\Администратор\Рабочий стол\Игры\[rutor.org]R.G._Mechanics_Metro_Redux_Dilogy.torrent
Симсы=C:\Users\Администратор\Рабочий стол\Игры\[rutor.org]The_SIMS_4-_Deluxe_Edition_Update_1_2014_PC_-_R.torrent

Ну как-то так. Конечно необходимо допилить, в том числе и функцию добавления новых игр в ини-файл - это сделать очень просто функцией IniWrite(). Надеюсь помог. Путь к uTorrent замени на свой.
INI я ночью еще переделал, так как ты написал. Просто когда пытался все запустить как хотел, менял все местами. Спасибо за помощь.
Ну добовления новых игр я тоже вчера еще сделал так
Код:
IniWrite(@ScriptDir & '\settings.ini', 'Game', GUICtrlRead($Input2), GUICtrlRead($Input1))

В Input 1 туда путь выводится после как выберу файл, а в Input2 название игры пишется.
CreatoR Тебе тоже спасибо твой код больше подошел. Все прекрасно работает.


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

CreatoR
Есть вопросик на счет твоего скрипта.
Вот в ComboBox он добавляет пути до файла которые нужно открыть, все работает.
Но мне нужно что бы добавлялись названия. Если тут
Код:
$sData &= $aIni_Read[$i][1] & '|'

изменить на
Код:
$sData &= $aIni_Read[$i][0] & '|'

То в ComboBox добавляются названия игр. Но когда нажимаешь запустить ничего не происходит.
Как можно изменить его немного что бы так же запускал но в ComboBox`е были названия вместо путей до файла.
INI в таком виде сейчас
Код:
[Game]
Метро2033=R.G._Mechanics_Metro_Redux_Dilogy.torrent
Симс4=The_SIMS_4-_Deluxe_Edition_Update_1_2014_PC_-_R.torrent
AC3=05. Assassin's Creed III.torrent
AC3 DE=Assassin's Creed 3. Deluxe Edition [Fenixx].torrent
 
Верх