1 (изменено: Morux2112, 2022-02-09 17:09:31)

Тема: AHK: Взаимодействие со строками в Listbox.

Еще раз здравствуйте. Возник вопрос, как взаимодействовать со строками в Listbox'e. Добавлять, удалять, изменять данные не изменяя код, то есть в запущенном скрипте?

2

Re: AHK: Взаимодействие со строками в Listbox.

Читайте описание команды GuiControl.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Взаимодействие со строками в Listbox.

teadrinker, благодарю. А можно ли сделать цветной текст в Listbox'e?

4

Re: AHK: Взаимодействие со строками в Listbox.

Можно, смотрите здесь.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Взаимодействие со строками в Listbox.

teadrinker, извиняюсь за множество глупых вопросов, но ответы на них я найти не могу. Как можно изменить текст и удалять строчки в ListBox?

6

Re: AHK: Взаимодействие со строками в Listbox.

Morux2112

В поиске можно найти легко же - пример как удалить.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

7

Re: AHK: Взаимодействие со строками в Listbox.

__Михаил__, благодарю, а на счет изменения строк есть что-нибудь?

8

Re: AHK: Взаимодействие со строками в Listbox.

GuiControl,, ControlID, |Red|Green|Blue
GuiControl пишет:

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).

Тут что-то не понятно?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Взаимодействие со строками в Listbox.

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

10 (изменено: __Михаил__, 2022-02-08 23:21:41)

Re: AHK: Взаимодействие со строками в Listbox.

Morux2112

Для начала приведите свой тестовый код, затем будем смотреть где ошибки.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

11

Re: AHK: Взаимодействие со строками в Listbox.

__Михаил__, Да тут не на что смотреть.

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

Нужно, чтобы при нажатии на галочку она ставилась в выбранную строку, вместо ☐.

12

Re: AHK: Взаимодействие со строками в Listbox.

Morux2112, я не совсем понял, вы, может, перепутали знаки / и | ? Или весть текст

☐ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / 20

должен находится в одной строке?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13 (изменено: __Михаил__, 2022-02-09 01:24:44)

Re: AHK: Взаимодействие со строками в Listbox.

Morux2112

1) Наверно нужно все данные хранить в переменных а не сразу в 'ListBox' пихать? Зачем потом извлекать данные, делать лишние проверки. Оптимизация кода как никак нужна. А вот символы я бы не использовал - не у всех может отобразиться как нужно, потом снова нытьё на форуме будет.

2) И где попытки сделать хоть одно манипулирование с 'ListBox'? А не одной не вижу. Вообще нет ничего.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

14

Re: AHK: Взаимодействие со строками в Listbox.

teadrinker пишет:

, я не совсем понял, вы, может, перепутали знаки / и | ? Или весть текст должен находится в одной строке?

Все верно, текст должен быть в одной строке, а разделил для удобствия.

__Михаил__ пишет:

1) Наверно нужно все данные хранить в переменных а не сразу в 'ListBox' пихать? Зачем потом извлекать данные, делать лишние проверки. Оптимизация кода как никак нужна.

Все эти данные выведены из переменных, на форум в код я выложил для наглядности. Про изменение данных в самих переменных я подумал, но не знаю как реализовать. Как изменить переменную определенной строчки и сделать так, чтобы эта строчка "обновилась"? Потому что обычное изменение переменной ничего не дает.

15

Re: AHK: Взаимодействие со строками в Listbox.

Morux2112 пишет:

не понятно как с этим работать

GuiControl,, MyListBox, |✅ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / 20
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Взаимодействие со строками в Listbox.

teadrinker пишет:
GuiControl,, MyListBox, |✅ / ILKOK / ULLI / ULLI / A012 / V / —— / RNAV / RVSM / 20

Он удаляет все строки и добавляет только эту.

17

Re: AHK: Взаимодействие со строками в Listbox.

Какие все? У вас в коде только одна и была.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18

Re: AHK: Взаимодействие со строками в Listbox.

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

19

Re: AHK: Взаимодействие со строками в Listbox.

Например, так:

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?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20

Re: AHK: Взаимодействие со строками в Listbox.

teadrinker, спасибо, всё работает, но только на одну строчку. Можно сделать так, чтобы значения менялись в строках, которые я выберу? Мне не нужна "активация, деактивация" на одну кнопку, я планирую не только "галочки" ставить, но, например, менять цифры в конце.

И можно ли как-то избежать переменной items такого рода, либо же записывать новые строки туда? Просто новые строки записываются таким родом:

GuiControl,, MyListBox, %sost% / %callsign% / %dep% / %dest% / %fl% / %rules% / %sid% / %rnav% / %rvsm% / %altitude%

21

Re: AHK: Взаимодействие со строками в Listbox.

Morux2112 пишет:

Можно сделать так, чтобы значения менялись в строках, которые я выберу?

Конечно, всё можно. Если вы поняли принцип, вам не составит труда изменить код.

Morux2112 пишет:

И можно ли как-то избежать переменной items такого рода, либо же записывать новые строки туда? Просто новые строки записываются таким родом

Я не совсем понял, что вы имеете в виду. Данные всегда находятся в какой-либо переменной, где ж им ещё быть.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

22 (изменено: Morux2112, 2022-02-10 14:55:25)

Re: AHK: Взаимодействие со строками в Listbox.

teadrinker пишет:

Конечно, всё можно. Если вы поняли принцип, вам не составит труда изменить код.

Я не совсем понимаю как оно работает. Точнее понимаю, но не могу сделать так, чтобы оно работало на все строчки. Не поможете?

teadrinker пишет:

И можно ли как-то избежать переменной 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
}

23

Re: AHK: Взаимодействие со строками в Listbox.

Нужно всё время менять содержимое переменной 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
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24

Re: AHK: Взаимодействие со строками в Listbox.

Также можно воспользоваться более продвинутым способом, который будет заменять не всё содержимое контрола сразу, а только одну строку:

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
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

25

Re: AHK: Взаимодействие со строками в Listbox.

Хотя, если уж использовать сообщения, можно избавиться от переменной 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
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26 (изменено: Morux2112, 2022-02-10 21:24:35)

Re: AHK: Взаимодействие со строками в Listbox.

teadrinker, огромное спасибо.

27

Re: AHK: Взаимодействие со строками в Listbox.

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?

28

Re: AHK: Взаимодействие со строками в Listbox.

Я ничего не понял, что откуда удалять.

Morux2112 пишет:
SendMessage, 0x188 ...

Никто не обязан знать, что означает число 0х188 и какому сообщению оно соответствует, поэтому непонятно, что это сообщение делает.
В последнем варианте моего кода переменная items не используется для замен, попробуйте его.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

29

Re: AHK: Взаимодействие со строками в Listbox.

teadrinker пишет:

В последнем варианте моего кода переменная items не используется для замен, попробуйте его.

А не могли бы вы убрать функцию "активации/деактивации" этой галочки на одну кнопку. Просто я не знаю как эта функция работает и поэтому самостоятельно убрать её не могу.

30

Re: AHK: Взаимодействие со строками в Listbox.

Замените

text := InStr(text, "☐") ? StrReplace(text, "☐", "✅") : StrReplace(text, "✅", "☐")

на

text := StrReplace(text, "☐", "✅")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

31

Re: AHK: Взаимодействие со строками в Listbox.

teadrinker, огромное спасибо. Ну и последний вопрос: можно ли сделать так, чтобы при изменении строки выделение с неё не убиралось? Либо же как-то считывать содержимое строки по другому? Просто я использую код с кнопки "OnButton" и в качестве переменной с содержанием этой строчки использую text.

32

Re: AHK: Взаимодействие со строками в Listbox.

Morux2112 пишет:

можно ли сделать так, чтобы при изменении строки выделение с неё не убиралось?

По-моему, нет. Можно снова выделить её же, номер же есть.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

33

Re: AHK: Взаимодействие со строками в Listbox.

teadrinker пишет:

Можно снова выделить её же, номер же есть.

Не подскажите?)

34

Re: AHK: Взаимодействие со строками в Listbox.

Что именно?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

35

Re: AHK: Взаимодействие со строками в Listbox.

teadrinker, как выделить?

36

Re: AHK: Взаимодействие со строками в Listbox.

GuiControl.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder