Что нового

GUIHyperLink - Создание элементов гиперссылки

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AutoIt: 3.3.6.1 - 3.3.10.2
Версия: 1.2

Категория: Элементы GUI

Описание: Библиотека предназначена для создания элементов HyperLink (гиперссылка).
Некоторые отличительные возможности от обычного Label'а:
* Открытие ссылки/функций (см. далее) срабатывает только после отпускания ссылки, и только над элементом этой ссылки.
* Изменение цвета посещённой ссылки.
* При перетаскивании ссылки иконка курсора меняется на запретный знак (индикация о невозможности перетащить ссылку).
* Можно указать не только открытие ссылки, но и выполнение произвольной функций.

Код/Пример:
Код:
#include <GUIConstantsEx.au3>
#include "GUIHyperLink.au3"

$hGUI = GUICreate("GUICtrlHyperLink UDF Demo!", 300, 200)

$nAutoItScript_Com_HyperLink = _GUICtrlHyperLink_Create("AutoIt Official Website", 100, 50, 110, 15, 0x0000FF, 0x551A8B, _
	-1, 'http://google.com', 'Visit: www.google.com', $hGUI) ;Intentionally set as google.com, will change later

$nAutoItScript_Ru_HyperLink = _GUICtrlHyperLink_Create("AutoIt Russian Community", 90, 80, 130, 15, 0x0000FF, 0x551A8B, _
	-1, 'http://autoit-script.ru', 'Visit: www.autoit-script.ru', $hGUI)

$nCreatoRLab_HyperLink = _GUICtrlHyperLink_Create("CreatoR's Lab", 120, 110, 70, 15, 0x0000FF, 0x551A8B, _
	1, '_CreatoRLab_ShowInfo(@THIS@, HWnd("' & $hGUI & '"))', 'Show website information...', $hGUI)

_GUICtrlHyperLink_SetData($nAutoItScript_Com_HyperLink, 2, 'www.autoitscript.com')
GUICtrlSetTip($nAutoItScript_Com_HyperLink, 'Visit: www.autoitscript.com')

GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _CreatoRLab_ShowInfo($nCtrlID, $h_GUI)
	MsgBox(64, 'Info', 'HyperLink Clicked:' & @CRLF & GUICtrlRead($nCtrlID), 0, $h_GUI)
EndFunc

Файл: Прикреплён.

Снимок:


История версий:
v1.2
* Попытка исправить проблему связанную с ошибкой: "Array variable has incorrect number of subscripts or subscript dimension range exceeded".

v1.1
+ Добавлена функция _GUICtrlHyperLink_SetData. Задаёт данные элемента HyperLink.
* Изменён пример.
* Исправлена проблема с директивой "THIS", теперь вместо неё следует использовать @THIS@.
* Исправлена проблема с обработкой кликов даже в том случае, когда элемент HyperLink находился под другим окном (главное окно не активно).
* Исправлена проблема с обработкой кликов когда зажатие кнопки мышки было сделано не на элементе label.

v1.0
Первая публичная версия.

Источник: www.autoit-script.ru (тема зарождения библиотеки)
Автор(ы): G.Sandler (CreatoR)
 

Вложения

  • GUIHyperLink_1.2.zip
    3.6 КБ · Просмотры: 77

erlik

Продвинутый
Сообщения
317
Репутация
84
Re: GUICtrlHyperLink - Создание элементов гиперссылки

Прежде всего хочу сказать автору UDF спасибо за нужную библиотеку. :smile:
Но вот небольшой bag report.
На этапе старта приложения (использующего эту UDF) иногда (пока замечена всего раза три) возникает вот такая ошибка:
[box title=TitleBox]F:\Install\AutoIT3\Include\GUICtrlHyperLink.au3 (224) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$hWnd = $aGCHL_Ctrls[$i][0]
$hWnd = ^ ERROR[/box]
Моя программа использует эту UDF и первое обращение к ее функциям происходит в скрипте инициализации главного окна - вот сам строчка:
Код:
$HyperLinkSite = _GUICtrlHyperLink_Create("Сигнатуры WinAPI", 10, 303, 105, 20, 0x0000FF, 0x551A8B, -1, $DEFAULTHYPERLINK, 'Перейти на: ' &$DEFAULTHYPERLINK,$hMainWnd)

И видимо именно после этого этапа ошибка и происходит (хотя в скрипте чуть ниже есть еще вызов _GUICtrlHyperLink_Create - но вероятнее всего скрипт спотыкается на первом месте). Судя по ошибке массив $aGCHL_Ctrls при некоторых вызовах не содержит правильное число индексов. К сожалению более точной информации предоставить не могу - так как ошибка происходила абсолютно случайно и всего, как я указал, раза три на примерно 500-1000 запусков приложения(прогу я тестил и запускал порядочное число раз). Может быть стоит увеличить время таймаута для обработчика
Код:
AdlibRegister("__GUICtrlHyperLink_Handler", 10)
? Вдруг он слишком рано начинает массив перебирать?
PS: версия UDF 1.1 - качал наверно с autoitscript.com, так как здесь выложена 1.0.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: GUICtrlHyperLink - Создание элементов гиперссылки

С подобной проблемой сталкивался раньше, и в других UDF, это скорее всего связано с неправильной обработкой переменных в самом AutoIt (на оф. форуме как то писали про это).

Можно попробовать это исправить методом добавления следующего перед строкой с ошибкой:

Код:
If UBound($aGCHL_Ctrls, 0) < 2 Or $i > UBound($aGCHL_Ctrls) Then
			ExitLoop
		EndIf
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: GUICtrlHyperLink - Создание элементов гиперссылки

Ну или сделать так:
Код:
Func _GUICtrlHyperLink_Create($sText, $iLeft, $iTop, $iWidth = -1, $iHeight= - 1, $iColor = 0x0000FF, $iVisitedColor = 0x551A8B, $iAction = -1, $sActionURL = "", $sToolTip = "", $hWnd = 0)
	Local $nID = GUICtrlCreateLabel($sText, $iLeft, $iTop, $iWidth, $iHeight)
	
	If $nID Then
		GUICtrlSetFont($nID, -1, -1, 4)
		GUICtrlSetColor($nID, $iColor)
		GUICtrlSetCursor($nID, 0)
		GUICtrlSetTip($nID, $sToolTip)
	EndIf
	
	Local $iPreCount = $aGCHL_Ctrls[0][0]
	
	$aGCHL_Ctrls[0][0] += 1
	ReDim $aGCHL_Ctrls[$aGCHL_Ctrls[0][0]+1][5]
	
	$aGCHL_Ctrls[$aGCHL_Ctrls[0][0]][0] = $hWnd
	$aGCHL_Ctrls[$aGCHL_Ctrls[0][0]][1] = $nID
	$aGCHL_Ctrls[$aGCHL_Ctrls[0][0]][2] = $iAction
	$aGCHL_Ctrls[$aGCHL_Ctrls[0][0]][3] = $sActionURL
	$aGCHL_Ctrls[$aGCHL_Ctrls[0][0]][4] = $iVisitedColor
	
	If $iPreCount = 0 Then
		AdlibRegister("__GUICtrlHyperLink_Handler", 10)
	EndIf
	
	Return $nID
EndFunc

скорее всего в этом проблема.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Обновление:

v1.2
* Попытка исправить проблемы связанную с ошибкой: "Array variable has incorrect number of subscripts or subscript dimension range exceeded".

v1.1
+ Добавлена функция _GUICtrlHyperLink_SetData. Задаёт данные элемента HyperLink.
* Изменён пример.
* Исправлена проблема с директивой "THIS", теперь вместо неё следует использовать @THIS@.
* Исправлена проблема с обработкой кликов даже в том случае, когда элемент HyperLink находился под другим окном (главное окно не активно).
* Исправлена проблема с обработкой кликов когда зажатие кнопки мышки было сделано не на элементе label.
 

erlik

Продвинутый
Сообщения
317
Репутация
84
Ок. Попробую такой вариант. Кстати поставил в AdlibRegister таймаут в 100 мс - работает нормально. А вот если оставить стандартный - 250 мс, тогда обработка нажатий ссылок пропускается. А 100 вполне хватает.
 

Dm666

Осваивающий
Сообщения
221
Репутация
48
Это я что-то делаю не так, или пример, идущий с UDF не совсем рабочий?
Код:
$nCreatoRLab_HyperLink = _GUICtrlHyperLink_Create("CreatoR's Lab", 120, 110, 70, 15, 0x0000FF, 0x551A8B, 1, '_CreatoRLab_ShowInfo(@THIS@, ' & $hGUI & ')', 'Show website information...', $hGUI)

не работает, при клике на ней ничего не происходит.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Скорее всего используется 3.3.6.1.

Поправка:
Код:
$nCreatoRLab_HyperLink = _GUICtrlHyperLink_Create("CreatoR's Lab", 120, 110, 70, 15, 0x0000FF, 0x551A8B, 1, '_CreatoRLab_ShowInfo(@THIS@, Hwnd("' & $hGUI & '"))', 'Show website information...', $hGUI)
 

Dm666

Осваивающий
Сообщения
221
Репутация
48
3.3.8.0. Версия не последняя, факт. Все никак не обновлюсь...
Спасибо, так все работает. UDF весьма и весьма полезная
 
Верх