Тема: AHK: Взаимодействие со строками в Listbox.
Еще раз здравствуйте. Возник вопрос, как взаимодействовать со строками в Listbox'e. Добавлять, удалять, изменять данные не изменяя код, то есть в запущенном скрипте?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Еще раз здравствуйте. Возник вопрос, как взаимодействовать со строками в Listbox'e. Добавлять, удалять, изменять данные не изменяя код, то есть в запущенном скрипте?
Читайте описание команды GuiControl.
teadrinker, благодарю. А можно ли сделать цветной текст в Listbox'e?
Можно, смотрите здесь.
teadrinker, извиняюсь за множество глупых вопросов, но ответы на них я найти не могу. Как можно изменить текст и удалять строчки в ListBox?
Morux2112
В поиске можно найти легко же - пример как удалить.
__Михаил__, благодарю, а на счет изменения строк есть что-нибудь?
GuiControl,, ControlID, |Red|Green|Blue
Value should contain a pipe-delimited list of entries to be appended at the end of the control's list. To replace (overwrite) the list instead, include a pipe as the first character (e.g. |Red|Green|Blue). To make the control empty, specify only a pipe character (|). To have one of the entries pre-selected, include two pipes after it (e.g. Red|Green||Blue).
Тут что-то не понятно?
teadrinker, не понятно как с этим работать.
☐ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / 20
Как поменять данные из этой строчки? Например: ☐ на ✅
✅ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / 20
Или 20 на 50?
☐ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / 50
Morux2112
Для начала приведите свой тестовый код, затем будем смотреть где ошибки.
__Михаил__, Да тут не на что смотреть.
Gui, Add, ListBox, x12 y13 w410 h140 hwndhListbox vMyListBox, ☐ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / 20
Gui, Add, Button, x12 y153 w30 h30, ✅
Gui, Show, w435 h220, ULLI super-puper-mega helper
return
GuiClose:
ExitApp
Нужно, чтобы при нажатии на галочку она ставилась в выбранную строку, вместо ☐.
Morux2112, я не совсем понял, вы, может, перепутали знаки / и | ? Или весть текст
☐ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / 20
должен находится в одной строке?
Morux2112
1) Наверно нужно все данные хранить в переменных а не сразу в 'ListBox' пихать? Зачем потом извлекать данные, делать лишние проверки. Оптимизация кода как никак нужна. А вот символы я бы не использовал - не у всех может отобразиться как нужно, потом снова нытьё на форуме будет.
2) И где попытки сделать хоть одно манипулирование с 'ListBox'? А не одной не вижу. Вообще нет ничего.
, я не совсем понял, вы, может, перепутали знаки / и | ? Или весть текст должен находится в одной строке?
Все верно, текст должен быть в одной строке, а разделил для удобствия.
1) Наверно нужно все данные хранить в переменных а не сразу в 'ListBox' пихать? Зачем потом извлекать данные, делать лишние проверки. Оптимизация кода как никак нужна.
Все эти данные выведены из переменных, на форум в код я выложил для наглядности. Про изменение данных в самих переменных я подумал, но не знаю как реализовать. Как изменить переменную определенной строчки и сделать так, чтобы эта строчка "обновилась"? Потому что обычное изменение переменной ничего не дает.
не понятно как с этим работать
GuiControl,, MyListBox, |✅ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / 20
GuiControl,, MyListBox, |✅ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / 20
Он удаляет все строки и добавляет только эту.
Какие все? У вас в коде только одна и была.
Gui, Add, ListBox, x12 y13 w410 h140 hwndhListbox vMyListBox, ☐ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / 20|☐ / RYR1TZ / ULLI / UUEE / FL350 / I / —— / RNAV / RVSM / 35000|☐ / BRU457 / ULLI / UMMS / FL250 / I / —— / RNAV / RVSM / 20
Gui, Add, Button, x12 y153 w30 h30, ✅
Gui, Show, w435 h220, test
return
Например, так:
items =
(Join|
☐ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / 20
☐ / RYR1TZ / ULLI / UUEE / FL350 / I / —— / RNAV / RVSM / 35000
☐ / BRU457 / ULLI / UMMS / FL250 / I / —— / RNAV / RVSM / 20
)
Gui, Add, ListBox, x12 y13 w410 h140 hwndhListbox vMyListBox AltSubmit, % items
Gui, Add, Button, x12 y153 w30 h30 gOnButton, ✅
Gui, Show, w435 h220, test
return
OnButton() {
global items
GuiControlGet, selected,, MyListBox
newItems := ""
Loop, parse, items, |
newItems .= "|" . (A_Index = selected ? StrReplace(A_LoopField, "☐", "✅") : A_LoopField)
GuiControl,, MyListBox, % newItems
}
GuiClose() {
ExitApp
}
Подозреваю, что следующим вопросом будет, как их менять обратно.
Но, может, проще воспользоваться обычным контролом CheckBox?
teadrinker, спасибо, всё работает, но только на одну строчку. Можно сделать так, чтобы значения менялись в строках, которые я выберу? Мне не нужна "активация, деактивация" на одну кнопку, я планирую не только "галочки" ставить, но, например, менять цифры в конце.
И можно ли как-то избежать переменной items такого рода, либо же записывать новые строки туда? Просто новые строки записываются таким родом:
GuiControl,, MyListBox, %sost% / %callsign% / %dep% / %dest% / %fl% / %rules% / %sid% / %rnav% / %rvsm% / %altitude%
Можно сделать так, чтобы значения менялись в строках, которые я выберу?
Конечно, всё можно. Если вы поняли принцип, вам не составит труда изменить код.
И можно ли как-то избежать переменной items такого рода, либо же записывать новые строки туда? Просто новые строки записываются таким родом
Я не совсем понял, что вы имеете в виду. Данные всегда находятся в какой-либо переменной, где ж им ещё быть.
Конечно, всё можно. Если вы поняли принцип, вам не составит труда изменить код.
Я не совсем понимаю как оно работает. Точнее понимаю, но не могу сделать так, чтобы оно работало на все строчки. Не поможете?
И можно ли как-то избежать переменной items такого рода, либо же записывать новые строки туда? Просто новые строки записываются таким родом
Я не совсем понял, что вы имеете в виду. Данные всегда находятся в какой-либо переменной, где ж им ещё быть.
Строки в ListBox добавляются таким методом, только данные для переменных берутся с файла. После добавления строчки через GuiControl и попытки изменить в ней хоть что-то - она пропадает. Можно ли как-то это исправить?
global squawk := 2000
items =
(Join|
☐ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / %squawk%
☐ / RYR1TZ / ULLI / UUEE / FL350 / I / —— / RNAV / RVSM / %squawk%
☐ / BRU457 / ULLI / UMMS / FL250 / I / —— / RNAV / RVSM / %squawk%
)
Gui, Add, ListBox, x12 y13 w410 h140 hwndhListbox vMyListBox AltSubmit, % items
Gui, Add, Button, x12 y153 w30 h30 gOnButton, ✅
Gui, Add, Button, x50 y153 w30 h30 gAdd, +
Gui, Show, w435 h220, test
return
OnButton() {
global items
GuiControlGet, selected,, MyListBox
newItems := ""
Loop, parse, items, |
newItems .= "|" . (A_Index = selected ? StrReplace(A_LoopField, "☐", "✅") : A_LoopField)
GuiControl,, MyListBox, % newItems
}
Numpad1::
InputBox, sqk
global items
GuiControlGet, selected,, MyListBox
newItems := ""
Loop, parse, items, |
newItems .= "|" . (A_Index = selected ? StrReplace(A_LoopField, squawk, sqk) : A_LoopField)
GuiControl,, MyListBox, % newItems
return
Add() {
sost := "☐"
callsign := "NWS1234"
dep := "ULLI"
dest := "URSS"
fl := "FL350"
rules := "I"
sid := "SUGIN 1A"
rnav := "RNAV"
rvsm := "RVSM"
GuiControl,, MyListBox, %sost% / %callsign% / %dep% / %dest% / %fl% / %rules% / %sid% / %rnav% / %rvsm% / %squawk%
}
GuiClose() {
ExitApp
}
Нужно всё время менять содержимое переменной items, чтобы оно соответствовало текущему содержимому контрола:
global items, squawk := 2000
items =
(Join|
☐ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / %squawk%
☐ / RYR1TZ / ULLI / UUEE / FL350 / I / —— / RNAV / RVSM / %squawk%
☐ / BRU457 / ULLI / UMMS / FL250 / I / —— / RNAV / RVSM / %squawk%
)
Gui, Add, ListBox, x12 y13 w410 h140 hwndhListbox vMyListBox AltSubmit, % items
Gui, Add, Button, x12 y153 w30 h30 gOnButton, ✅
Gui, Add, Button, x50 y153 w30 h30 gAdd, +
Gui, Show, w435 h220, test
return
OnButton() {
GuiControlGet, selected,, MyListBox
newItems := ""
Loop, parse, items, |
{
item := A_LoopField
if (A_Index = selected) {
if InStr(A_LoopField, "☐")
item := StrReplace(A_LoopField, "☐", "✅")
else
item := StrReplace(A_LoopField, "✅", "☐")
}
newItems .= (A_Index = 1 ? "" : "|") . item
}
GuiControl,, MyListBox, % "|" . (items := newItems)
}
Add() {
sost := "☐"
callsign := "NWS1234"
dep := "ULLI"
dest := "URSS"
fl := "FL350"
rules := "I"
sid := "SUGIN 1A"
rnav := "RNAV"
rvsm := "RVSM"
newItem := sost " / " callsign " / " dep " / " dest " / " fl " / " rules " / " sid " / " rnav " / " rvsm " / " squawk
items .= "|" . newItem
GuiControl,, MyListBox, % newItem
}
GuiClose() {
ExitApp
}
Также можно воспользоваться более продвинутым способом, который будет заменять не всё содержимое контрола сразу, а только одну строку:
global items, hListbox, squawk := 2000
items =
(Join|
☐ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / %squawk%
☐ / RYR1TZ / ULLI / UUEE / FL350 / I / —— / RNAV / RVSM / %squawk%
☐ / BRU457 / ULLI / UMMS / FL250 / I / —— / RNAV / RVSM / %squawk%
)
Gui, Add, ListBox, x12 y13 w410 h140 hwndhListbox vMyListBox AltSubmit, % items
Gui, Add, Button, x12 y153 w30 h30 gOnButton, ✅
Gui, Add, Button, x50 y153 w30 h30 gAdd, +
Gui, Show, w435 h220, test
return
OnButton() {
static LB_INSERTSTRING := 0x0181
, LB_DELETESTRING := 0x0182
GuiControlGet, selected,, MyListBox
newItems := ""
Loop, parse, items, |
{
item := A_LoopField
if (A_Index = selected) {
if InStr(A_LoopField, "☐")
item := StrReplace(A_LoopField, "☐", "✅")
else
item := StrReplace(A_LoopField, "✅", "☐")
SendMessage, LB_DELETESTRING, A_Index - 1,,, ahk_id %hListbox%
SendMessage, LB_INSERTSTRING, A_Index - 1, &item,, ahk_id %hListbox%
}
newItems .= (A_Index = 1 ? "" : "|") . item
}
items := newItems
}
Add() {
sost := "☐"
callsign := "NWS1234"
dep := "ULLI"
dest := "URSS"
fl := "FL350"
rules := "I"
sid := "SUGIN 1A"
rnav := "RNAV"
rvsm := "RVSM"
newItem := sost " / " callsign " / " dep " / " dest " / " fl " / " rules " / " sid " / " rnav " / " rvsm " / " squawk
items .= "|" . newItem
GuiControl,, MyListBox, % newItem
}
GuiClose() {
ExitApp
}
Хотя, если уж использовать сообщения, можно избавиться от переменной items:
global hListbox, squawk := 2000
items =
(Join|
☐ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / %squawk%
☐ / RYR1TZ / ULLI / UUEE / FL350 / I / —— / RNAV / RVSM / %squawk%
☐ / BRU457 / ULLI / UMMS / FL250 / I / —— / RNAV / RVSM / %squawk%
)
Gui, Add, ListBox, x12 y13 w410 h140 hwndhListbox vMyListBox AltSubmit, % items
Gui, Add, Button, x12 y153 w30 h30 gOnButton, ✅
Gui, Add, Button, x50 y153 w30 h30 gAdd, +
Gui, Show, w435 h220, test
return
OnButton() {
static LB_INSERTSTRING := 0x0181
, LB_DELETESTRING := 0x0182
, LB_GETTEXT := 0x0189
, LB_GETTEXTLEN := 0x018A
GuiControlGet, selected,, MyListBox
WinExist("ahk_id" . hListbox)
SendMessage, LB_GETTEXTLEN, --selected
VarSetCapacity(text, ErrorLevel << !!A_IsUnicode, 0)
SendMessage, LB_GETTEXT, selected, &text
text := InStr(text, "☐") ? StrReplace(text, "☐", "✅") : StrReplace(text, "✅", "☐")
SendMessage, LB_DELETESTRING, selected
SendMessage, LB_INSERTSTRING, selected, &text
}
Add() {
sost := "☐"
callsign := "NWS1234"
dep := "ULLI"
dest := "URSS"
fl := "FL350"
rules := "I"
sid := "SUGIN 1A"
rnav := "RNAV"
rvsm := "RVSM"
newItem := sost " / " callsign " / " dep " / " dest " / " fl " / " rules " / " sid " / " rnav " / " rvsm " / " squawk
GuiControl,, MyListBox, % newItem
}
GuiClose() {
ExitApp
}
teadrinker, огромное спасибо.
teadrinker, мне уже не удобно просить, и так много сделали для меня. Как очищать item от строки, которую я удалил?
Delete:
SendMessage, 0x188, 0, 0, , ahk_id %hListbox% ; If (ErrorLevel = 0xffffffff) Not Selected
Control, Delete, % ++ErrorLevel, , ahk_id %hListbox%
return
Данный скрипт удаляет просто строку из Listbox'a и если попытаться изменить содержимое строки, которое идет после удаленной - оно поменяется на удаленную строку, т.к. в переменной items осталась данная удаленная строка. Так как её можно удалить из Items?
Я ничего не понял, что откуда удалять.
SendMessage, 0x188 ...
Никто не обязан знать, что означает число 0х188 и какому сообщению оно соответствует, поэтому непонятно, что это сообщение делает.
В последнем варианте моего кода переменная items не используется для замен, попробуйте его.
В последнем варианте моего кода переменная items не используется для замен, попробуйте его.
А не могли бы вы убрать функцию "активации/деактивации" этой галочки на одну кнопку. Просто я не знаю как эта функция работает и поэтому самостоятельно убрать её не могу.
Замените
text := InStr(text, "☐") ? StrReplace(text, "☐", "✅") : StrReplace(text, "✅", "☐")
на
text := StrReplace(text, "☐", "✅")
teadrinker, огромное спасибо. Ну и последний вопрос: можно ли сделать так, чтобы при изменении строки выделение с неё не убиралось? Либо же как-то считывать содержимое строки по другому? Просто я использую код с кнопки "OnButton" и в качестве переменной с содержанием этой строчки использую text.
можно ли сделать так, чтобы при изменении строки выделение с неё не убиралось?
По-моему, нет. Можно снова выделить её же, номер же есть.
Можно снова выделить её же, номер же есть.
Не подскажите?)
Что именно?
teadrinker, как выделить?
GuiControl.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться