Автор Тема: Ассоциативное значение  (Прочитано 473 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Cytrus [?]

  • Новичок
  • *
  • Сообщений: 65
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Ассоциативное значение
« Создано: Сентябрь 28, 2018, 14:38:25 »
Привет.

Разъясните, плиз, кто в состоянии, что такое ассоциативное значение, определяемое приложением.

Их можно получить, и их можно назначить.

Я встречаю в справке такие вещи, и не совсем понимаю их назначение.

А также, что такое context help identifier.


Русское сообщество AutoIt

Ассоциативное значение
« Отправлен: Сентябрь 28, 2018, 14:38:25 »

Онлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2882
  • Репутация: 485
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Ассоциативное значение
« Ответ #1, Отправлен: Сентябрь 28, 2018, 16:23:28 »
у меня толковых объяснений не так много, точнее, почти нет :)
 при создании элемента в окне ему присваивается уникальный идентификатор или дескриптор.
Пример TreeView
при каждом запуске дескрипторы пунктов дерева меняются. Но есть функция, которая помогает присвоить любому пункту дерева свое значение(идентификатор), который можно будет сохранять и назначать при загрузке программы и самого дерева. Можно менять его. Как я это использовал?
Создавая дерево я присваивал каждому пункту уникальное значение. Это же значение я использовал как имя ключа в объекте Scripting.Dictionary
Уже по ходу взаимодействия с деревом я присваивал значения каждому пункту в виде массива. Как? Получал значение пункта дерева, а это значение является именем ключа в Scripting.Dictionary, вызывал этот ключ и вносил туда данные. таким образом, я мог каждому пункту назначить свои массивы(структуры) данных и получать их по мере надобности. Прописал функцию сохранения данных дерева в файл. И при каждой загрузке дерева программа присваивала ему его уникальное значение(из файла) и создавала ключ в Scripting.Dictionary с этим именем, загружая в него данные из файла
короче, объяснил как мог  ;D
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн Cytrus [?]

  • Новичок
  • *
  • Сообщений: 65

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Ассоциативное значение
« Ответ #2, Отправлен: Сентябрь 28, 2018, 18:16:43 »
Я так понимаю, что любому дескриптору мы можем присвоить любые другие идентификаторы?
Мы можем создавать dummy, получать из них хендлы, и присваивать им любые свои идентификаторы?

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4046
  • Репутация: 1074
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Ассоциативное значение
« Ответ #3, Отправлен: Сентябрь 28, 2018, 19:26:47 »
Cytrus
Некоторые элементы GUI Windows являются контейнерами. Например, список, дерево, меню. Эти контейнеры содержат пункты. Пункты описываются в виде структур. В этих структурах есть определённое поле: у списка и дерева поле Param, у меню поле ItemData. В это поле разработчик может записать число типа int, чем ассоциировать данный конкретный пункт с этим числом. Затем, прочитав это поле, по этому (уникальному) числу можно точно определить пункт.

AutoIt тоже пользуется этими полями. Например, когда вы через GUICtrlCreateListViewItem создаёте пункт списка, в это поле AutoIt заносит ID, которым вы в дальнейшем и пользуетесь и которым пользуется сам AutoIt. Поэтому не рекомендуется менять значения этих полей для пунктов, созданных внутренними функциями AutoIt. Вот пример
Код: AutoIt [Выделить]
#include <GuiListView.au3>

GUICreate("")
$LV = GUICtrlCreateListView("", 0, 0)

; создание ListViewItem
$Item = GUICtrlCreateListViewItem("test", $LV)
ConsoleWrite("Идентификатор пункта: " & $Item & @CRLF)
ConsoleWrite("Имя пункта: " & GUICtrlRead($Item) & @CRLF)

; чтение Param
$Param = _GUICtrlListView_GetItemParam(GUICtrlGetHandle($LV), 0)
ConsoleWrite("Значение Param: " & $Param & @CRLF)

; изменение Param
_GUICtrlListView_SetItemParam(GUICtrlGetHandle($LV), 0, 5)
ConsoleWrite("Имя пункта после изменения Param: " & GUICtrlRead($Item) & @CRLF)

; возврат Param
_GUICtrlListView_SetItemParam(GUICtrlGetHandle($LV), 0, 4)
ConsoleWrite("Имя пункта после возврата Param: " & GUICtrlRead($Item) & @CRLF)


Вывод. Ассоциативные значения, т.е. числа в определённом поле структуры пункта, можно использовать для работы через UDF. Для работы встроенными функциями эти поля трогать не нужно.

Русское сообщество AutoIt

Re: Ассоциативное значение
« Ответ #3 Отправлен: Сентябрь 28, 2018, 19:26:47 »

Онлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2882
  • Репутация: 485
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Ассоциативное значение
« Ответ #4, Отправлен: Сентябрь 28, 2018, 20:03:54 »
примерная иллюстрация как можно это применить. хотя можно и пофантазировать
во всяком случае, мне не встречались коды, где используется ассоциативное значение
(нажмите для показа/скрытия)

« Последнее редактирование: Сентябрь 28, 2018, 20:36:02 от joiner »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4046
  • Репутация: 1074
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Ассоциативное значение
« Ответ #5, Отправлен: Сентябрь 28, 2018, 20:29:37 »
joiner  [?]
Цитировать
мне не встречались коды, где используется ассоциативное значение
Для списка (сохранение значения цвета текста/фона пункта): http://autoit-script.ru/index.php?topic=6570.0
Для дерева (сохранение индекса элемента массива): http://autoit-script.ru/index.php?topic=3725.0
Есть и ещё примеры, в основном Yashied'а.

В списках можно использовать для уникальных сортировок типа "по популярности". Например, при клике на пункт увеличивать ассоциативное число и затем сортировать по этому полю.

Онлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2882
  • Репутация: 485
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Ассоциативное значение
« Ответ #6, Отправлен: Сентябрь 28, 2018, 20:40:57 »
InnI
эти примеры не попались на глаза. когда разрабатывал программу JMPACK(есть на форуме), то возникла необходимость идентифицировать пункты дерева просмотра. сразу взял инструмент из справки.
дополнил пример выше

Оффлайн Cytrus [?]

  • Новичок
  • *
  • Сообщений: 65

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Ассоциативное значение
« Ответ #7, Отправлен: Сентябрь 29, 2018, 07:37:12 »
InnI
Да, Yashied сделал мощный скрипт с деревом.
Только я не понял, откуда он берёт это число.

Русское сообщество AutoIt

Re: Ассоциативное значение
« Ответ #7 Отправлен: Сентябрь 29, 2018, 07:37:12 »

Оффлайн Cytrus [?]

  • Новичок
  • *
  • Сообщений: 65

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Ассоциативное значение
« Ответ #8, Отправлен: Март 11, 2019, 16:53:09 »
А как можно сделать так, чтобы программа "забыла" все назначенные значения?
Может есть какое-то сообщение или API-функция?

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4046
  • Репутация: 1074
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Ассоциативное значение
« Ответ #9, Отправлен: Март 11, 2019, 17:17:20 »
Cytrus  [?]
Цитировать
сделать так, чтобы программа "забыла" все назначенные значения
А зачем? Не нужно - не пользуйтесь.
Но если очень хочется, то можно в цикле обнулить.

Русское сообщество AutoIt

Re: Ассоциативное значение
« Ответ #9 Отправлен: Март 11, 2019, 17:17:20 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
18 Ответов
10565 Просмотров
Последний ответ Май 27, 2011, 15:26:08
от RUVATA
2 Ответов
3172 Просмотров
Последний ответ Июнь 09, 2010, 00:48:31
от Yashied
6 Ответов
6009 Просмотров
Последний ответ Октябрь 08, 2010, 11:37:45
от Yashied
2 Ответов
2755 Просмотров
Последний ответ Октябрь 07, 2010, 21:45:54
от Kalisnik
79 Ответов
32275 Просмотров
Последний ответ Июль 03, 2011, 20:22:43
от Afonichev
13 Ответов
5507 Просмотров
Последний ответ Ноябрь 22, 2010, 22:48:47
от assch
15 Ответов
12509 Просмотров
Последний ответ Декабрь 13, 2010, 01:15:23
от Ed_Vard
7 Ответов
5348 Просмотров
Последний ответ Декабрь 09, 2010, 12:55:49
от madmasles
13 Ответов
5907 Просмотров
Последний ответ Январь 01, 2011, 21:53:02
от lexaSF
4 Ответов
3381 Просмотров
Последний ответ Январь 10, 2011, 00:26:11
от `p r o x y