Замена значений в Combobox Topic is solved

Помощь в написании скриптов
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Замена значений в Combobox

Post by marusa122 » 07 Aug 2023, 12:15

Здравствуйте!
В скрипте Autohotley (GUI) есть Combobox со значениями opera.exe, firefox.exe, chrome.exe, msedge.exe, iexplore.exe
Как заменить эти значения на Opera, Mozilla Firefox, Google Chrome, Microsoft Edge, Internet Exprorer соответственно? Но так, чтобы скрипт продолжил их читать как opera.exe, firefox.exe, chrome.exe, msedge.exe, iexplore.exe.
Основной скрипт:

Code: Select all

Run, chrome.exe "https://www.google.com/" --new-window
Sleep, 5000
MsgBox, 64, Program1, Program1 запущена!`nЗдесь вы сможете начать работу!
WinSet, AlwaysOnTop, , A
Return
Т.е. пользователь в Combobox выбирает Google Chrome, но скрипт должен распознавать это значение как chrome.exe.
Сам код формы для настройки скрипта:

Code: Select all

#SingleInstance Force
#NoEnv
SetWorkingDir %A_ScriptDir%

ProgramName := "Program1"
ProgramName5 := "Рабочий сайт"

; Читаем настройки
GoSub ReadSettingsFromIni

MsgBox, 4, %ProgramName%, Вы хотите изменить настройки запуска? `n%ProgramName% пропустит этот шаг через несколько секунд..., 5
IfMsgBox Yes
{
	GoSub ShowSettingsWindow
	Return
}
else
; Тут или прошло пять секунд, или пользователь нажал Нет.
{
GoTo OnButtonRun
Return
}

; ===========================
; Конец секции автовыполнения



; Чтение настроек из .ini-файла в переменные
; ==========================================
ReadSettingsFromIni:
{
IniRead, Ed_App5, %A_ScriptDir%\..\AppLauncher.ini, Settings, AppToRun5, %A_Space%
IniRead, Ed_Browser, %A_ScriptDir%\..\AppLauncher.ini, Settings, Browser

	Return
}


; Создание окна настроек
; ======================
ShowSettingsWindow:
{
Gui, New
Gui, Add, Text  , XM+20   Y80  W90  R1, %ProgramName5%:
Gui, Add, Edit  , X+10 YP   W120 R1 vEd_App5,   %Ed_App5%
Gui, Add, Button, X+0  YP   W20  R1 vBt_App5 gOnButtonApp5, ...
Gui, Add, Text, XM+20   Y115  W90  R1, Рабочий браузер:
Gui, Add, Combobox, x+10 yp w120 r5 vEd_Browser, opera.exe|firefox.exe|chrome.exe|msedge.exe|iexplore.exe

Gui, Add, Button, XM   Y200 W270 R3 vBt_Run  gOnButtonRun , Начать работу
Gui, Add, Button, XM   Y+M W130 R1 vBt_Save gOnButtonSave, Сохранить
Gui, Add, Button, X+10 YP  W130 R1 vBt_Exit gOnButtonExit, Выйти

Gui, Show,, %ProgramName%
Return
}

; При нажатии Save значения из текстовых полей сохраняются в файл настроек AppLauncher.ini
OnButtonSave:
{
	Gui, Submit, NoHide
	IniWrite, %Ed_App5% , %A_ScriptDir%\..\AppLauncher.ini, Settings, AppToRun5
	IniWrite, %Ed_Browser%, %A_ScriptDir%\..\AppLauncher.ini, Settings, Browser
	Sleep 100
	Msgbox,, %ProgramName%, Настройки успешно сохранены!, 3
	Return
}

OnButtonApp5:
{
	MsgBox, 48, %ProgramName%, В это поле нужно вставить ссылку!, 5
	Return
}

; Обработчик изменения значения Combobox для выбора браузера
Ed_Browser:
GuiControlGet, chosenBrowser
global Ed_Browser
Ed_Browser := chosenBrowser
Return

; При нажатии кнопки Start запускаем приложение с указанными в текстовых полях данными
OnButtonRun:
{
Gui, Submit
Gui, New
Gui, Font, s10
Gui, Add, Text, x10 y10  w128 h50 center, Выберите способ работы с документами:
Gui, Add, Picture, x10 y60 w128 h128 gA1, %A_ScriptDir%\..\Design\Ярлык для %ProgramName5%.png
Gui, Show,  xCenter yCenter w148 h200, %ProgramName%
Return
}

	A1:
if (Ed_Browser = "") {
    MsgBox, 48, Ошибка, Не указан рабочий браузер!
    Gui, Destroy
    return
}
if (Ed_App5 = "")
{
    	Run, %Ed_Browser% "https://www.google.com/" --new-window
	Sleep, 5000
	MsgBox, 64, %ProgramName%, %ProgramName% запущена!`nЗдесь вы сможете начать работу!
	WinSet, AlwaysOnTop, , A
	Return
}
else
{
    	Run, %Ed_Browser% %Ed_App5% --new-window
	Sleep, 5000
	MsgBox, 64, %ProgramName%, %ProgramName% запущена!`nЗдесь вы сможете начать работу!
	WinSet, AlwaysOnTop, , A
	Return
}

; При нажатии Esc, закрытии окна или нажатии кнопки Exit скрипт завершается.
GuiClose:
GuiEscape:
OnButtonExit:
	ExitApp

mcl
Posts: 361
Joined: 04 May 2018, 16:35

Re: Замена значений в Combobox

Post by mcl » 07 Aug 2023, 17:52

marusa122 wrote: Здравствуйте!
Привет :3

Code: Select all

; ...
Gui, Add, Combobox, x+10 yp w120 r5 vEd_Browser, Opera|Firefox|Chrome|Edge
; ...

Ed_Browser:
GuiControlGet, chosenBrowser
Global Ed_Browser


; 0. UPD: совсем забыл про Switch/Case:
Switch chosenBrowser
{
	Case "Opera":    Ed_Browser := "opera.exe"
	Case "Firefox":  Ed_Browser := "firefox.exe"
	Case "Chrome":   Ed_Browser := "chrome.exe"
	Case "Edge":     Ed_Browser := "msedge.exe"
}

; -----

; 1. Другое простое решение - написать простыню из If-ов:

If (chosenBrowser = "Opera")
	Ed_Browser := "opera.exe"
If (chosenBrowser = "Firefox")
	Ed_Browser := "firefox.exe"

; -----

; 2. Можно чуть короче и изящнее с помощью простыни из тернарных операторов:
;   <условие> ? <если_истина> : <если_ложь>
; Тут используется особенность, что строка, начинающаяся с оператора, «склеивается» с предыдущей
; (см. https://www.autohotkey.com/docs/v1/Scripts.htm#continuation )

Ed_Browser := (chosenBrowser = "Opera")   ? "opera.exe"
            : (chosenBrowser = "Firefox") ? "firefox.exe"
            : (chosenBrowser = "Chrome")  ? "chrome.exe"
            : (chosenBrowser = "Edge")    ? "msedge.exe"
            : "Сюда мы не должны были попасть. Что же мы тогда выбрали?"

; -----

; 3. Наконец, можно использовать объект (он же ассоциативный массив, в AHK.v2 и некоторых других языках
; называется Map или Dictionary). Он состоит из пар ключ-значение, по ключу (в данном случае, по названию браузера)
; можно получать искомое значение (имя файла.exe). В каком-то смысле, это упакованные в одну сущность переменные.

; Можно задать объект фигурными скобками, внутри которых через запятую идут пары  ключ:значение
browserNameToExe := { "Opera":"opera.exe", "Firefox":"firefox.exe", "Chrome":"chrome.exe", "Edge":"msedge.exe" }
; Или через функцию-конструктор, просто через запятую: ключ1, значение1, ключ2, значение2, ...
browserNameToExe := Object( "Opera", "opera.exe", "Firefox", "firefox.exe", "Chrome", "chrome.exe", "Edge", "msedge.exe" )

; Чтобы получить значение, в квадратных скобках указываем ключ - в данном случае имя из Combobox
Ed_Browser := browserNameToExe[chosenBrowser]

marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Замена значений в Combobox

Post by marusa122 » 08 Aug 2023, 01:58

@mcl, попробовала все перечисленные вами способы - почему-то они не работают. Скрипт выдает ошибку - судя по ее тексту, он при выборе того же "Chrome" из Combobox продолжает распознавать его как "Chrome", а не как "chrome.exe". Может, я как-то не так вставила код?..

Code: Select all

#SingleInstance Force
#NoEnv
SetWorkingDir %A_ScriptDir%

ProgramName := "Program1"
ProgramName5 := "Рабочий сайт"

; Читаем настройки
GoSub ReadSettingsFromIni

MsgBox, 4, %ProgramName%, Вы хотите изменить настройки запуска? `n%ProgramName% пропустит этот шаг через несколько секунд..., 5
IfMsgBox Yes
{
	GoSub ShowSettingsWindow
	Return
}
else
; Тут или прошло пять секунд, или пользователь нажал Нет.
{
GoTo OnButtonRun
Return
}

; ===========================
; Конец секции автовыполнения



; Чтение настроек из .ini-файла в переменные
; ==========================================
ReadSettingsFromIni:
{
IniRead, Ed_App5, %A_ScriptDir%\..\AppLauncher.ini, Settings, AppToRun5, %A_Space%
IniRead, Ed_Browser, %A_ScriptDir%\..\AppLauncher.ini, Settings, Browser

	Return
}


; Создание окна настроек
; ======================
ShowSettingsWindow:
{
Gui, New
Gui, Add, Text  , XM+20   Y80  W90  R1, %ProgramName5%:
Gui, Add, Edit  , X+10 YP   W120 R1 vEd_App5,   %Ed_App5%
Gui, Add, Button, X+0  YP   W20  R1 vBt_App5 gOnButtonApp5, ...
Gui, Add, Text, XM+20   Y115  W90  R1, Рабочий браузер:
Gui, Add, Combobox, x+10 yp w120 r5 vEd_Browser, Chrome|Edge|Explorer|Firefox|Opera

Gui, Add, Button, XM   Y200 W270 R3 vBt_Run  gOnButtonRun , Начать работу
Gui, Add, Button, XM   Y+M W130 R1 vBt_Save gOnButtonSave, Сохранить
Gui, Add, Button, X+10 YP  W130 R1 vBt_Exit gOnButtonExit, Выйти

Gui, Show,, %ProgramName%
Return
}

; При нажатии Save значения из текстовых полей сохраняются в файл настроек AppLauncher.ini
OnButtonSave:
{
	Gui, Submit, NoHide
	IniWrite, %Ed_App5% , %A_ScriptDir%\..\AppLauncher.ini, Settings, AppToRun5
	IniWrite, %Ed_Browser%, %A_ScriptDir%\..\AppLauncher.ini, Settings, Browser
	Sleep 100
	Msgbox,, %ProgramName%, Настройки успешно сохранены!, 3
	Return
}

OnButtonApp5:
{
	MsgBox, 48, %ProgramName%, В это поле нужно вставить ссылку!, 5
	Return
}

; Обработчик изменения значения Combobox для выбора браузера
Ed_Browser:
GuiControlGet, chosenBrowser
Global Ed_Browser

If (chosenBrowser = "Chrome")
	Ed_Browser := "chrome.exe"
If (chosenBrowser = "Edge")
	Ed_Browser := "msedge.exe"
If (chosenBrowser = "Explorer")
	Ed_Browser := "iexplore.exe"
If (chosenBrowser = "Firefox")
	Ed_Browser := "firefox.exe"
If (chosenBrowser = "Opera")
	Ed_Browser := "opera.exe"


Switch chosenBrowser
{
	Case "Chrome":   Ed_Browser := "chrome.exe"
	Case "Edge":     Ed_Browser := "msedge.exe"
	Case "Explorer": Ed_Browser := "iexplore.exe"
	Case "Firefox":  Ed_Browser := "firefox.exe"
	Case "Opera":    Ed_Browser := "opera.exe"
}

Ed_Browser := (chosenBrowser = "Opera")   ? "opera.exe"
            : (chosenBrowser = "Firefox") ? "firefox.exe"
            : (chosenBrowser = "Chrome")  ? "chrome.exe"
            : (chosenBrowser = "Edge")    ? "msedge.exe"
            : (chosenBrowser = "Explorer")    ? "iexplore.exe"

browserNameToExe := { "Opera":"opera.exe", "Firefox":"firefox.exe", "Chrome":"chrome.exe", "Edge":"msedge.exe", "Explorer":"iexplore.exe" }

Ed_Browser := browserNameToExe[chosenBrowser]

; При нажатии кнопки Start запускаем приложение с указанными в текстовых полях данными
OnButtonRun:
{
Gui, Submit
Gui, New
Gui, Font, s10
Gui, Add, Text, x10 y10  w128 h50 center, Выберите способ работы с документами:
Gui, Add, Picture, x10 y60 w128 h128 gA1, %A_ScriptDir%\..\Design\Ярлык для %ProgramName5%.png
Gui, Show,  xCenter yCenter w148 h200, %ProgramName%
Return
}

	A1:
if (Ed_Browser = "") 
{
    MsgBox, 48, Ошибка, Не указан рабочий браузер!
    Gui, Destroy
    return
}
if (Ed_App5 = "")
{
    	Run, %Ed_Browser% "https://www.google.com/" --new-window
	Sleep, 5000
	MsgBox, 64, %ProgramName%, %ProgramName% запущена!`nЗдесь вы сможете начать работу!
	WinSet, AlwaysOnTop, , A
	Return
}
else
{
    	Run, %Ed_Browser% %Ed_App5% --new-window
	Sleep, 5000
	MsgBox, 64, %ProgramName%, %ProgramName% запущена!`nЗдесь вы сможете начать работу!
	WinSet, AlwaysOnTop, , A
	Return
}

; При нажатии Esc, закрытии окна или нажатии кнопки Exit скрипт завершается.
GuiClose:
GuiEscape:
OnButtonExit:
	ExitApp

mcl-at-work

Re: Замена значений в Combobox  Topic is solved

Post by mcl-at-work » 08 Aug 2023, 05:14

marusa122 wrote: @mcl, попробовала все перечисленные вами способы - почему-то они не работают. Скрипт выдает ошибку - судя по ее тексту, он при выборе того же "Chrome" из Combobox продолжает распознавать его как "Chrome", а не как "chrome.exe". Может, я как-то не так вставила код?..

Code: Select all

; Строка 49: не была указана G-метка, так что комбобокс при изменении ничего и не делал.
Gui, Add, Combobox, x+10 yp w120 r5 vEd_Browser gEd_Browser, Chrome|Edge|Explorer|Firefox|Opera
;                                               ^^^^^^^^^^^
; Строка 78: не было указано, откуда прочесть переменную chosenBrowser
GuiControlGet, chosenBrowser,, Ed_Browser
;                              ^^^^^^^^^^

; Код дальше: необязательно вставлять вообще все продемонстрированные методы - они ведь делают одно и то же.
; И в конце Return потерялся (перед меткой OnButtonRun)
Но проблема на самом деле в другом. Обработчик изменения комбобокса не нужен — при запуске (в метке OnButtonRun) Gui Submit перечитывает значение Ed_Browser заново. Поэтому и трансформации имя_браузера <=> запускаемый_файл лучше делать там же.
Ниже исправленный код целиком:

Code: Select all

#SingleInstance Force
#NoEnv
SetWorkingDir %A_ScriptDir%

ProgramName := "Program1"
ProgramName5 := "Рабочий сайт"

; Читаем настройки
GoSub ReadSettingsFromIni

MsgBox, 4, %ProgramName%, Вы хотите изменить настройки запуска? `n%ProgramName% пропустит этот шаг через несколько секунд..., 5
IfMsgBox Yes
{
	GoSub ShowSettingsWindow
	Return
}
else
; Тут или прошло пять секунд, или пользователь нажал Нет.
{
GoTo OnButtonRun
Return
}

; ===========================
; Конец секции автовыполнения



; Чтение настроек из .ini-файла в переменные
; ==========================================
ReadSettingsFromIni:
{
IniRead, Ed_App5, %A_ScriptDir%\..\AppLauncher.ini, Settings, AppToRun5, %A_Space%
IniRead, Ed_Browser, %A_ScriptDir%\..\AppLauncher.ini, Settings, Browser

	Return
}


; Создание окна настроек
; ======================
ShowSettingsWindow:
{
Gui, New
Gui, Add, Text  , XM+20   Y80  W90  R1, %ProgramName5%:
Gui, Add, Edit  , X+10 YP   W120 R1 vEd_App5,   %Ed_App5%
Gui, Add, Button, X+0  YP   W20  R1 vBt_App5 gOnButtonApp5, ...
Gui, Add, Text, XM+20   Y115  W90  R1, Рабочий браузер:
Gui, Add, ComboBox, x+10 yp w120 r5 vEd_Browser gEd_Browser, Chrome|Edge|Explorer|Firefox|Opera

Gui, Add, Button, XM   Y200 W270 R3 vBt_Run  gOnButtonRun , Начать работу
Gui, Add, Button, XM   Y+M W130 R1 vBt_Save gOnButtonSave, Сохранить
Gui, Add, Button, X+10 YP  W130 R1 vBt_Exit gOnButtonExit, Выйти

Gui, Show,, %ProgramName%
Return
}

; При нажатии Save значения из текстовых полей сохраняются в файл настроек AppLauncher.ini
OnButtonSave:
{
	Gui, Submit, NoHide
	IniWrite, %Ed_App5% , %A_ScriptDir%\..\AppLauncher.ini, Settings, AppToRun5
	IniWrite, %Ed_Browser%, %A_ScriptDir%\..\AppLauncher.ini, Settings, Browser
	Sleep 100
	Msgbox,, %ProgramName%, Настройки успешно сохранены!, 3
	Return
}

OnButtonApp5:
{
	MsgBox, 48, %ProgramName%, В это поле нужно вставить ссылку!, 5
	Return
}

; Обработчик изменения значения Combobox для выбора браузера
Ed_Browser:
GuiControlGet, chosenBrowser,, Ed_Browser
Global Ed_Browser

Switch chosenBrowser
{
	Case "Chrome":   Ed_Browser := "chrome.exe"
	Case "Edge":     Ed_Browser := "msedge.exe"
	Case "Explorer": Ed_Browser := "iexplore.exe"
	Case "Firefox":  Ed_Browser := "firefox.exe"
	Case "Opera":    Ed_Browser := "opera.exe"
}

ToolTip, Я отладочный тултип!`nВы выбрали %chosenBrowser%`, так что я запущу %Ed_Browser%
; Но значение переменной Ed_Browser всё равно будет перечитано при запуске после Gui Submit
Return

; При нажатии кнопки Start запускаем приложение с указанными в текстовых полях данными
OnButtonRun:
{
Gui, Submit
Gui, New
Gui, Font, s10
Gui, Add, Text, x10 y10  w128 h50 center, Выберите способ работы с документами:
Gui, Add, Picture, x10 y60 w128 h128 gA1, %A_ScriptDir%\..\Design\Ярлык для %ProgramName5%.png
Gui, Show,  xCenter yCenter w148 h200, %ProgramName%
Return
}

A1:
Switch Ed_Browser
{
	Case "Chrome":   Ed_Browser_Exe := "chrome.exe"
	Case "Edge":     Ed_Browser_Exe := "msedge.exe"
	Case "Explorer": Ed_Browser_Exe := "iexplore.exe"
	Case "Firefox":  Ed_Browser_Exe := "firefox.exe"
	Case "Opera":    Ed_Browser_Exe := "opera.exe"
	Default :        Ed_Browser_Exe := ""
}

if (Ed_Browser_Exe = "") 
{
    MsgBox, 48, Ошибка, Не указан рабочий браузер!
    Gui, Destroy
    return
}
if (Ed_App5 = "")
{
    	Run, %Ed_Browser_Exe% "https://www.google.com/" --new-window
	Sleep, 5000
	MsgBox, 64, %ProgramName%, %ProgramName% запущена!`nЗдесь вы сможете начать работу!
	WinSet, AlwaysOnTop, , A
	Return
}
else
{
    	Run, %Ed_Browser_Exe% %Ed_App5% --new-window
	Sleep, 5000
	MsgBox, 64, %ProgramName%, %ProgramName% запущена!`nЗдесь вы сможете начать работу!
	WinSet, AlwaysOnTop, , A
	Return
}

; При нажатии Esc, закрытии окна или нажатии кнопки Exit скрипт завершается.
GuiClose:
GuiEscape:
OnButtonExit:
	ExitApp
P.S.: Возможно, стоит заменить Combobox на DropDownList - он такой же, только пользователь не сможет в него сам написать ерунды.

marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Замена значений в Combobox

Post by marusa122 » 08 Aug 2023, 06:05

mcl-at-work wrote:
08 Aug 2023, 05:14
P.S.: Возможно, стоит заменить Combobox на DropDownList - он такой же, только пользователь не сможет в него сам написать ерунды.
Думала об этом, но проблема в том, что у разных пользователей могут быть разные браузеры. Я в Combobox перечислила самое распространенное, но если человек захочет использовать для работы какую-нибудь экзотику - его право, пусть только впишет название исполняемого файла.
Исправленный вами код работает, большое спасибо!

Post Reply

Return to “Помощь”