Тема: AHK : DropDownList
Приветствую, возник вопрос.
Как из элемента drowdownlist можно удалить/добавить новые столбцы |slot1|slo2| и.т.д?
Идея как например регулярным выражением, но возможно есть другой способ?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Приветствую, возник вопрос.
Как из элемента drowdownlist можно удалить/добавить новые столбцы |slot1|slo2| и.т.д?
Идея как например регулярным выражением, но возможно есть другой способ?
Не совсем понятно, в чём вопрос. Как добавлять или заменять элементы в списке DDL описано в GuiControl, Tab/DropDownList/ComboBox/ListBox.
teadrinker
В общем понятно, как либо редактировать DDL можно лишь через guicontrol вписывая уже готовый вариант отображаемых элементов.
Если мне из |1|2|3|4| нужно убрать "3"
Через guicontrol переписываю все столбцы, а именно |1|2|4|
Я так и не понял, в чём заключается вопрос.
teadrinker
Я хотел узнать, как можно удалять/добавлять элементы в DDL.
Так вы не поняли статью в хэлпе?
teadrinker
Я как раз в 3-м сообщении и написал как это реализовывается через guicontrol.
То-есть, всё понятно теперь?
teadrinker
В общих чертах, если ничего лучше предложить нет конечно.
А чем этот вариант не устраивает?
teadrinker
Да мне не нравится что мы каждый раз переписываем целую DDL, вместо нужного элемента. Но похоже без этого никак.
Так это надо весь список переписывать.
Gui, Add, DropDownList, hwndhDDL, Colors||White|Red|Green|Blue
Gui, Show
Sleep 1000
ItemIndex = 1
SendMessage, 0x0144, ItemIndex - 1, , , ahk_id %hDDL% ; CB_DELETESTRING
GuiControl, +Redraw, %hDDL%
Sleep 1000
ItemText = Colours list
SendMessage, 0x014A, ItemIndex - 1, &ItemText , , ahk_id %hDDL% ; CB_INSERTSTRING
GuiControl, Choose, %hDDL%, % ItemIndex
Return
Так нагляднее.
Кстати вопрос, как обновить окно со списком, не скрывая его, при удалении строки, чтобы пустой строки не оставалось.
Gui, Add, DropDownList, hwndhDDL, Colors||White|Red|Green|Blue
Gui, Show
SendMessage, 0x014F, 1, , , ahk_id %hDDL% ; CB_SHOWDROPDOWN
Sleep 1000
ItemText = Colors
SendMessage, 0x158, 1, &ItemText, , ahk_id %hDDL% ; CB_FINDSTRINGEXACT
SendMessage, 0x0144, ErrorLevel, , , ahk_id %hDDL% ; CB_DELETESTRING
GuiControl, +Redraw, %hDDL%
hDDLList := ComboBoxGetList(hDDL)
WinSet, Redraw, , ahk_id %hDDLList%
Sleep 1000
ItemIndex = 1
ItemText = Colours list
SendMessage, 0x014A, ItemIndex - 1, &ItemText , , ahk_id %hDDL% ; CB_INSERTSTRING
GuiControl, Choose, %hDDL%, % ItemIndex
Sleep 1000
ItemText = Black
ItemIndex = 3
SendMessage, 0x014A, ItemIndex - 1, &ItemText , , ahk_id %hDDL% ; CB_INSERTSTRING
ItemText = Orange
SendMessage, 0x143, 0, &ItemText , , ahk_id %hDDL% ; CB_ADDSTRING
Sleep 1000
SendMessage, 0x014F, 0, , , ahk_id %hDDL% ; CB_SHOWDROPDOWN
SendMessage, 0x0146, 0, 0, , ahk_id %hDDL% ; CB_GETCOUNT
GuiControl, Choose, %hDDL%, % ErrorLevel
Return
ComboBoxGetList(hCombo) {
Static SizeOfCBI := 40 + (A_PtrSize * 3)
VarSetCapacity(CBI, SizeOfCBI, 0) ; COMBOBOXINFO structure - msdn.microsoft.com/en-us/library/bb775798(v=vs.85).aspx
NumPut(SizeOfCBI, CBI, 0, "UInt")
DllCall("GetComboBoxInfo", "Ptr", hCombo, "Ptr", &CBI, "Int") ; msdn.microsoft.com/en-us/library/bb775939(v=vs.85).aspx
Return NumGet(CBI, 40 + A_PtrSize*2, "UPtr")
}
serzh82saratov
Благодарю, отличный пример!
serzh82saratov
А вот ещё 1 маленький вопрос.
Gui, Add, DropDownList, vasd gdsa hwndhDDL, Colors|AA|White|Red|Green|Blue
Если элемент в DDL выбран, то
msgbox % asd
показывает этот элемент, а как можно отобразить весь список DDL?
serzh82saratov
Остался вопрос выше.
С удалением удивили, пример то отличный.
ControlGet есть даже в русской справке на этом же ресурсе.
serzh82saratov
Спасибо ещё один раз
serzh82saratov
Хоть я и получил ответы на мои вопросы, но всё же я не понял сути.
Откуда вы берёте/как пишете sendmessage запросы на манипуляции с ddl/combobox?
Во время написания кода всплыла ещё 1 проблема - как изменять элемент ddl. Конечно, можно считать № строки, удалить и добавить нужную - но ведь можно проще?
Я нашел тему с библиотекой, которая позволяет выполнять все эти действия и более - https://autohotkey.com/board/topic/3116 … functions/
Но библиотеку не скачать - ошибка страницы выдаёт.
Я нашел тему с "Коды оконных сообщений" со справки PostMessage / SendMessage, но там нет и близко таких кодов как 0x014A, 0x143 и 0x0146, что в свою очередь вы использовали при написании примеров ниже.
Подскажите, если не примером, то хоть справкой по этому вопросу.
Тут используются константы, которые можно получить в удобном виде, например, отсюда. В Вашем случае, это список констант для ComboBox.
Программирование — не магия. Всё происходит именно так, как подсказывает логика и когда нужно один компонент заменить на другой, то всегда это происходит, как и в жизни => заменяемый нужно найти, удалить и добавить другой.
serzh82saratov просто пошёл на встречу Вашему любопытству, на самом же деле, Ваши догадки из третьего сообщения наименее заморочены и именно они и используются в подавляющем большинстве. То есть, создаётся новая строка для ДДЛ и через GuiControl заменяется.
Конечно, можно считать № строки, удалить и добавить нужную - но ведь можно проще?
https://github.com/ahkscript/autohotkey … ons/CB.ahk
Там тоже, удаляется и создаётся строка.
Есть некое CB_SETITEMDATA, но я не нашёл примеров, и не уверен что это про то.
АП: считать № строки можно с помощью CB_FINDSTRINGEXACT, номер будет в ErrorLevel, это есть и в примере выше.
Gui, Add, DropDownList, hwndhDDL, Colors||White|Red|Green|Blue
Gui, Show
SendMessage, 0x014F, 1, , , ahk_id %hDDL% ; CB_SHOWDROPDOWN
ItemText = White
Loop
{
Sleep 100
SendMessage, 0x158, 1, &ItemText, , ahk_id %hDDL% ; CB_FINDSTRINGEXACT
ItemIndex := ErrorLevel
SendMessage, 0x0144, ItemIndex, , , ahk_id %hDDL% ; CB_DELETESTRING
ItemText := A_TickCount
SendMessage, 0x014A, ItemIndex, &ItemText , , ahk_id %hDDL% ; CB_INSERTSTRING
}
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться