Что нового

Подстановка значений из ini-файла в ComboBox

Tuxzer92

Новичок
Сообщения
65
Репутация
0
Здравствуйте, пытаюсь сделать так чтобы при выборе RadioButton в ComboBox подставлялось значение из того или иного ini-файла. И при нажатии на кнопку выполнялось 2 действия: 1 - то, что выбрано в RadioButton, 2 - то, что выбрано в ComboBox.

Например в RadioButton вывод сообщения (сообщение 1), а при выборе определенного параметра из ini вывод сообщения(выполнил 1 пункт из ini файла)

Вот, что есть:

Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiComboBox.au3>

$Form1_1 = GUICreate("Form1", 354, 572, 821, 257)
$Button1 = GUICtrlCreateButton("Button1", 24, 520, 129, 25)
$Combo1 = GUICtrlCreateCombo("", 16, 208, 153, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL, $CBS_DROPDOWNLIST))
GUISetState(@SW_SHOW)
Global $Radio1 = GUICtrlCreateRadio("Выбор1", 8, 24, 135, 16)
Global $Radio2 = GUICtrlCreateRadio("Выбор2", 8, 55, 135, 16)

$INI1 = IniRead(@ScriptDir & '\1.ini', 'commands', 'key', '')
$INI2 = IniRead(@ScriptDir & '\2.ini', 'drivers', 'key2', '')

Func SetButtonState()
    if GUICtrlRead($Radio1) = $GUI_CHECKED _
    Then
	  _GUICtrlComboBox_ResetContent($Combo1)
   GuiCtrlSetData($Combo1, $INI1, StringLeft($INI1, StringInStr($INI1&'|', '|')-1))
   Else
   if   GUICtrlRead($Radio2) = $GUI_CHECKED _
   Then
	  _GUICtrlComboBox_ResetContent($Combo1)
   GuiCtrlSetData($Combo1, $INI2, StringLeft($INI2, StringInStr($INI2&'|', '|')-1))
   EndIf
EndIf
EndFunc

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		 Case $Button1
		 Case $Radio1
			SetButtonState()
		 Case $Radio2
			SetButtonState()
	EndSwitch
WEnd

Спасибо за помощь!
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
#include <GUIConstants.au3>

$Form1_1 = GUICreate("Form1", 354, 572, 821, 257)
$Button1 = GUICtrlCreateButton("Button1", 24, 520, 129, 25)
$Combo1 = GUICtrlCreateCombo("", 16, 208, 153, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL, $CBS_DROPDOWNLIST))
GUISetState(@SW_SHOW)
Global $Radio1 = GUICtrlCreateRadio("Выбор1", 8, 24, 135, 16)
Global $Radio2 = GUICtrlCreateRadio("Выбор2", 8, 55, 135, 16)

$INI1 = IniRead(@ScriptDir & '\1.ini', 'commands', 'key', '')
$INI2 = IniRead(@ScriptDir & '\2.ini', 'drivers', 'key2', '')

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
      Select
        Case BitAND(GUICtrlRead($Radio1), $GUI_CHECKED) = $GUI_CHECKED
          MsgBox(0, "", "Отмечен Radio1", 0, $Form1_1)
        Case BitAND(GUICtrlRead($Radio2), $GUI_CHECKED) = $GUI_CHECKED
          MsgBox(0, "", "Отмечен Radio2", 0, $Form1_1)
        Case Else
          MsgBox(0, "", "Не отмечены", 0, $Form1_1)
      EndSelect
      MsgBox(0, "", "В Combo выбрана строка: " & GUICtrlRead($Combo1), 0, $Form1_1)
		Case $Radio1
      GUICtrlSetData($Combo1, "|" & $INI1, $INI1)
		Case $Radio2
      GUICtrlSetData($Combo1, "|" & $INI2, $INI2)
	EndSwitch
WEnd
 
Автор
T

Tuxzer92

Новичок
Сообщения
65
Репутация
0
А как можно сделать, что бы выполнялись разные действия в зависимости от выбора пункта в ComboBox?
Я просто планирую хранить в ini файлах логины и пароли для авторизации в TrueConf. А RadioButton привяжу настройки серверов.

Конечная идея такова: Выбрал сервер RadioButton'oм и выбрал из списка фамилию, а затем при нажатии на кнопку в TrueConf настроился на выбранный сервер и залогинился под выбранным пользователем.
На каждом сервере разные учетки, которые лежат в ini-файлах.

Автоввод логина и пароля, а так же импорт настроек серверов в TrueConf я уже освоил. Осталось реализовать скрипт.

Код:
$result=GUICtrlRead($Combo1)
if $result = "Иванов" Then
   MsgBox(0,"","Логинимся под Ивановым")
  ;функция ввода логина и пароля для Иванова
EndIf

Так будет проблематично писать для каждой учетки, если учесть, что их много для каждого сервера.

Код:
#include <GUIConstants.au3>

$Form1_1 = GUICreate("Form1", 354, 572, 821, 257)
$Button1 = GUICtrlCreateButton("Button1", 24, 520, 129, 25)
$Combo1 = GUICtrlCreateCombo("", 16, 208, 153, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL, $CBS_DROPDOWNLIST))
GUISetState(@SW_SHOW)
Global $Radio1 = GUICtrlCreateRadio("Выбор1", 8, 24, 135, 16)
Global $Radio2 = GUICtrlCreateRadio("Выбор2", 8, 55, 135, 16)

$INI1 = IniRead(@ScriptDir & '\1.ini', 'Users1', 'Izh1', '')
$INI2 = IniRead(@ScriptDir & '\2.ini', 'Users2', 'Moscow', '')

Func Login($user, $pass)
    Opt("WinTitleMatchMode", 2)
    $login = WinWait("авторизация", "")
    WinActivate($login)
    Sleep(500) ; Дождаться, когда контролы станут активны
    ControlSetText($login, "", "[CLASS:TEdit; INSTANCE:2]", $user) ; Поле с именем
    ControlSetText($login, "", "[CLASS:TEdit; INSTANCE:1]", $pass) ; Поле с паролем
    ControlClick($login, "", "[CLASS:TButton; INSTANCE:1]") ; Кнопка
EndFunc

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
      Select
        Case BitAND(GUICtrlRead($Radio1), $GUI_CHECKED) = $GUI_CHECKED
          MsgBox(0, "", "Отмечен Radio1", 0, $Form1_1)
		  RunWait(@ComSpec & ' /C regedit /s "' & @ScriptDir & '\etc\srv1.reg"', '', @SW_HIDE)
        Case BitAND(GUICtrlRead($Radio2), $GUI_CHECKED) = $GUI_CHECKED
          MsgBox(0, "", "Отмечен Radio2", 0, $Form1_1)
        Case Else
          MsgBox(0, "", "Не отмечены", 0, $Form1_1)
      EndSelect
      MsgBox(0, "", "В Combo выбрана строка: " & GUICtrlRead($Combo1), 0, $Form1_1)
	  $result=GUICtrlRead($Combo1)
	  If ProcessExists("TrueConf.exe") Then
                    MsgBox(64, $title, "TrueConf уже запущен")
            Else
                    Run(@ProgramFilesDir & "\TrueConf Client\TrueConf.exe")
				 EndIf
				 ; Активация клиента
                $client = WinWait("TrueConf Client")
                WinActivate($client)
                Send("{ALT}{ENTER}")
                Sleep(500)
	  if $result = "Сырбов" Then
		 MsgBox(0,"","Логинимся под Ивановым")
	  Login("login", "passwd")
	  EndIf
	  MsgBox(0,"",$result)
        Case $Radio1
      GUICtrlSetData($Combo1, "|" & $INI1, $INI1)
        Case $Radio2
      GUICtrlSetData($Combo1, "|" & $INI2, $INI2)
    EndSwitch
 WEnd

Вот как пример.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Tuxzer92
Передавайте в функцию не логин-пароль, а значение, выбранное в Combo. А функция путь сама по этому значению определяет нужную пару логин-пароль.
 
Автор
T

Tuxzer92

Новичок
Сообщения
65
Репутация
0
Извините, а как это будет выглядеть в коде?
В каком виде хранить пару логин и пароль в ini?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Tuxzer92
Код:
...
      Case $Button1
        Login(GUICtrlRead($Combo1))
...
Func Login($str)
    $data = StringSplit(IniRead(@ScriptDir & '\1.ini', 'Users', $str, ''), "|")
    $user = $data[1]
    $pass = $data[2]
    Opt("WinTitleMatchMode", 2)
    $login = WinWait("авторизация", "")
    WinActivate($login)
    Sleep(500) ; Дождаться, когда контролы станут активны
    ControlSetText($login, "", "[CLASS:TEdit; INSTANCE:2]", $user) ; Поле с именем
    ControlSetText($login, "", "[CLASS:TEdit; INSTANCE:1]", $pass) ; Поле с паролем
    ControlClick($login, "", "[CLASS:TButton; INSTANCE:1]") ; Кнопка
EndFunc
Содержимое 1.ini
Код:
[Users]
Сырбов=login|password
В combo выбрано "Сырбов".
 
Автор
T

Tuxzer92

Новичок
Сообщения
65
Репутация
0
А как сделать с несколькими ini-файлами?
 
Автор
T

Tuxzer92

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

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Tuxzer92
Сделайте названия секций в ini-файле по IP (или по имени) сервера и передавайте в функцию значение, выбранное в combo, и значение отмеченного radio. Или можете в самой функции проверять, какой radio отмечен, и обращаться в соответствующую секцию ini-файла.
 
Автор
T

Tuxzer92

Новичок
Сообщения
65
Репутация
0
InnI сказал(а):
Tuxzer92
Сделайте названия секций в ini-файле по IP (или по имени) сервера и передавайте в функцию значение, выбранное в combo, и значение отмеченного radio. Или можете в самой функции проверять, какой radio отмечен, и обращаться в соответствующую секцию ini-файла.
:'( Что-то не доходит. Не подскажете код?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
#include <GUIConstants.au3>

Global $name1 = "Сервер1", $name2 = "Сервер2", $list1, $list2, $server

$Form1_1 = GUICreate("Form1", 354, 572, 821, 257)
$Button1 = GUICtrlCreateButton("Button1", 24, 520, 129, 25)
$Combo1 = GUICtrlCreateCombo("", 16, 208, 153, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL, $CBS_DROPDOWNLIST))
GUISetState(@SW_SHOW)
$Radio1 = GUICtrlCreateRadio($name1, 8, 24, 135, 16)
$Radio2 = GUICtrlCreateRadio($name2, 8, 55, 135, 16)

$arr = IniReadSection("data.ini", $name1)
For $i = 1 To $arr[0][0]
  $list1 &= "|" & $arr[$i][0]
Next
$arr = IniReadSection("data.ini", $name2)
For $i = 1 To $arr[0][0]
  $list2 &= "|" & $arr[$i][0]
Next

While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
    Case $Button1
      Login(GUICtrlRead($Combo1))
    Case $Radio1
      GUICtrlSetData( $Combo1, $list1)
      $server = $name1
    Case $Radio2
      GUICtrlSetData($Combo1, $list2)
      $server = $name2
  EndSwitch
WEnd

Func Login($nick)
  Local $data = StringSplit(IniRead("data.ini", $server, $nick, ''), "|")
  If @error Then Return
  Local $user = $data[1], $pass = $data[2]
  MsgBox(0, "", "login:" & $user & @CRLF & "pass:" & $pass)
EndFunc
data.ini
Код:
[Сервер1]
nick1=p1|w1
nick2=p2|w2
nick3=p3|w3

[Сервер2]
nick2=p2|w2
nick3=p3|w3
nick4=p4|w4
 
Автор
T

Tuxzer92

Новичок
Сообщения
65
Репутация
0
Спасибо!
А как вы прокомментируете этот вариант?
Код:
#include <Array.au3>
#include <GUIConstants.au3>
#include <GuiComboBox.au3>

Global $users, $userRecords
Global $ini = "boxes.ini"


Func GetApplicableUsers($server)
	Local $result[0][3]
	For $username In $users
		$records = IniReadSection($ini, $username)
		$nName = _ArraySearch($records, "name_" & $server, 0, 0, 0, 2, 1, 0)
		$nPass = _ArraySearch($records, "pass_" & $server, 0, 0, 0, 2, 1, 0)
		If $nName <> -1 And $nPass <> -1 Then
			_ArrayAdd($result, $username & "|" & $records[$nName][1] & "|" & $records[$nPass][1])
		EndIf
	Next
	Return $result
EndFunc

Func _ArrayExtractColumn(Const ByRef $aArray, $iCol = 0)
	Local $result[0]
	For $i = 0 To UBound($aArray) - 1
		_ArrayAdd($result, $aArray[$i][$iCol])
	Next
	Return $result
EndFunc

; Серверы
; Формат [название, адрес]
$servers = IniReadSection($ini, "Servers")
;_ArrayDisplay($servers)

; Пользователи
; Формат [тэг, значение]
$users = IniReadSectionNames($ini)
Global $userRecords
_ArrayDelete($users, 0)
$l = UBound($users)-1
For $i = $l To 0 Step -1
	If $users[$i] == "Servers" Then
		_ArrayDelete($users, $i)
	EndIf
Next

; Формат $userRecords
; [полное имя, юзернейм, пасс]

; Интерфейс
$form = GUICreate("Boxes", 300, 200)
$serverBox = GUICtrlCreateCombo("", 20, 20, 260, -1, $CBS_DROPDOWNLIST)
; GUICtrlSetStyle($serverBox, $CBS_DISABLENOSCROLL)
GUICtrlSetData(-1, _ArrayToString($servers, "|", 1, $servers[0][0], "|", 0, 0))
_GUICtrlComboBox_SetCurSel(-1, 0)

$userBox = GUICtrlCreateCombo("", 20, 60, 260, -1, $CBS_DROPDOWNLIST)
UpdateUserBox()

$startButton = GUICtrlCreateButton("Сделай это!", 20, 100, 260)

Func UpdateUserBox()
	$serverName = GUICtrlRead($serverBox)
	$userRecords = GetApplicableUsers($serverName)
	$userNames = _ArrayExtractColumn($userRecords)
	_GUICtrlComboBox_ResetContent($userBox)
	GUICtrlSetData($userBox, _ArrayToString($userNames))
	_GUICtrlComboBox_SetCurSel($userBox, 0)
EndFunc

Func DoTheThing()
	$serverName = GUICtrlRead($serverBox)
	$userFullName = GUICtrlRead($userBox)
	$i = _ArraySearch($servers, $serverName, 0, 0, 1, 2, 1, 0)
	$serverAddress = $servers[$i][1]
	$i = _ArraySearch($userRecords, $userFullName, 0, 0, 1, 2, 1, 0)
	$userName = $userRecords[$i][1]
	$userPass = $userRecords[$i][2]
	MsgBox(0, "Ура!", "Логинимся на сервер " & @CRLF & @CRLF & _
		$serverAddress & @CRLF & @CRLF & _
		"с этими данными:" & @CRLF & @CRLF & _
		"Пользователь: " & $userName & @CRLF & _
		"Пароль: " & $userPass)
EndFunc

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

		Case $serverBox
			UpdateUserBox()

		Case $startButton
			DoTheThing()
	EndSwitch
WEnd


[Servers]
Москва=8.8.8.8
Питер=77.88.8.8

[Адыгей Адыгеевич]
name_Москва=adyga34
pass_Москва=43526

[Беринг Берингович]
name_Питер=bering
pass_Питер=54385
name_Москва=bering_mos
pass_Москва=1723618

[Кузебай Кузебаевич]
name_Питер=kzeba000
pass_Питер=password
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Tuxzer92
как вы прокомментируете этот вариант?
А что тут комментировать? Это просто вариант решения проблемы. Один из многих.
Те же яйца, только сбоку. :smile:
 
Верх