Что нового

Возможно ли заставить поле Edit обрабатывать тэги?

Latoid

Знающий
Сообщения
95
Репутация
11
Имеется обыкновенное поле Edit, в нем отображается содержимое текстового файла. В файле, допустим, есть тэг mailto:[email protected]
Возможно ли сделать этот кусок текста кликабельным? Чтоб нажать на него - и открылось окно создания письма почтового клиента по умолчанию с проставленным адресом?
Если Edit это не умеет, может, какой-нибудь другой GUI элемент с этим справится?
 

El Panda

Продвинутый
Сообщения
101
Репутация
59
IEEmbedded справится, Edit и другие стандартные контролы - нет.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Должно подойти: http://autoit-script.ru/index.php/topic,339.0.html
 
Автор
L

Latoid

Знающий
Сообщения
95
Репутация
11
Спасибо.
_GUICtrlRichEdit мне больше понравилась
 
Автор
L

Latoid

Знающий
Сообщения
95
Репутация
11
Наблюдается одна маленькая неприятность
Вот код:

Код:
#include <GuiRichEdit.au3>
#include <GUIConstants.au3>

Global $hRichEdit

Main()

Func Main()
	Local $hGui, $iMsg
	$hGui = GUICreate("Rich Edit Example", 500, 550, -1, -1)
	$hRichEdit = _GUICtrlRichEdit_Create($hGui, "This is a test.", 10, 10, 480, 420, _
			BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
	GUISetState()
	
	GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
	_GuiCtrlRichEdit_SetEventMask($hRichEdit, $ENM_LINK)

	_GuiCtrlRichEdit_AutoDetectURL($hRichEdit, True)
	_GuiCtrlRichEdit_AppendText($hRichEdit, @CR & "mailto:[email protected]?subject=oil_pump" & @CRLF )
	While True
		$iMsg = GUIGetMsg()
		Select
			Case $iMsg = $GUI_EVENT_CLOSE
				Exit
		EndSelect
	WEnd
EndFunc   ;==>Main

Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
	Local $hWndFrom, $iCode, $tNMHDR, $tEnLink, $cpMin, $cpMax, $tMsgFilter
	$tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $hWndFrom
		Case $hRichEdit
			Select
				Case $iCode = $EN_LINK
					$tMsgFilter = DllStructCreate($tagEN_MSGFILTER, $iLparam)
					If DllStructGetData($tMsgFilter, "msg") = $WM_LBUTTONUP Then
						$tEnLink = DllStructCreate($tagENLINK, $iLparam)
						$cpMin = DllStructGetData($tEnLink, "cpMin")
						$cpMax = DllStructGetData($tEnLink, "cpMax")
						ShellExecute (_GuiCtrlRichEdit_GetTextInRange($hRichEdit, $cpMin, $cpMax))
					EndIf
			EndSelect
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


При клике на тэг mailto: открывается окно создания письма Thunderbird, проставляется адрес и тема. Т.е. всё хорошо. Но тут же вылазит системный MessageBox Windows с таким текстом
"Windows не удалось найти ''mailto:[email protected]?subject=oil_pump". Проверьте, что имя введено правильно и повторите попытку. Чтобы выполнить поиск файла, нажмите кнопку "Пуск", а затем выберите команду "Найти"
MessageBox этот абсолютно ни к месту. Самое интересное, что на тэге http:// он не появляется. Можно как-нибудь сиё побороть?
Система - WinXP SP3
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
А что если повесить обработчик событий для поля Edit (можно и Label), что если там есть http:// или mailto: вначале, то при клике делать то-то или то-то... например открывать браузер или почтовик :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Latoid [?]
Наблюдается одна маленькая неприятность
Не могу подтвердить, у меня такое не наблюдается, хотя как почтовик использую браузер (Opera).

Можно как-нибудь сиё побороть?
Видимо только локально, т.к видимо оно напрямую связано с почтовым клиентом.
P.S
А если убрать из адреса «?subject=oil_pump», тоже выводится сообщение?

Kaster [?]
А что если повесить обработчик событий для поля Edit
Он уже повешен, посмотри на пример внимательнее ;)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
CreatoR [?]
Он уже повешен, посмотри на пример внимательнее
да не, я про стандартный Edit, да и вызов не встроенными средствами, а прямой, типа
Код:
Run($Browser & ' ' & $Text)

или
Код:
Run($MailClient & ' ' $parameters)
:smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Kaster [?]
я про стандартный Edit
Как ты себе представляешь в обычном Edit'е выводить содержимое файла, и чтобы все текстовые ссылки в нём отображались как реальные-кликабельные ссылки? Это даже не вопрос обработки ссылок, а реализация отображения таких элементов. Обычный Edit не поддерживает такие свойства, именно поэтому и был разработан новый элемент поддерживающий форматирование текста.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
По поводу отображения - никак. это был бы обычный текст. но если по нему кликнуть выполнялось бы действие. а говорил я не про все содержимое файла, а некая строка, и если вначале этой строки есть http:// то одно, mailto:// то другое, если третье, то и действие третье...
 
Автор
L

Latoid

Знающий
Сообщения
95
Репутация
11
Kaster сказал(а):
CreatoR [?]
Он уже повешен, посмотри на пример внимательнее
да не, я про стандартный Edit, да и вызов не встроенными средствами, а прямой, типа
Код:
Run($Browser & ' ' & $Text)

или
Код:
Run($MailClient & ' ' $parameters)
:smile:

Далеко не все почтовые клиенты поймут переданные им параметры, к сожалению.

Не могу подтвердить, у меня такое не наблюдается, хотя как почтовик использую браузер (Opera).
Да, назначил клиентом по умолчанию The Bat - MessageBox не появляется.

Видимо только локально, т.к видимо оно напрямую связано с почтовым клиентом.
P.S
А если убрать из адреса «?subject=oil_pump», тоже выводится сообщение?
Получается верно, глюк проявляется только при Thunderbird' е по умолчанию. Странно сиё. Наличие или отсуствие «?subject=oil_pump» никак не влияет.
А что значит "локально"? Послать нажатие пробела MessageBox'у ? Ничего иного не придумал )
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Latoid [?]
Послать нажатие пробела MessageBox'у ? Ничего иного не придумал
Есть самопальная ShellExecute, с ней вроде никаких сообщений не выводится при ошибке запуска:

Код:
#include <GuiRichEdit.au3>
#include <GUIConstants.au3>

Global $hRichEdit

Main()

Func Main()
    Local $hGui, $iMsg
    $hGui = GUICreate("Rich Edit Example", 500, 550, -1, -1)
    $hRichEdit = _GUICtrlRichEdit_Create($hGui, "This is a test.", 10, 10, 480, 420, _
            BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
    GUISetState()
    
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    _GuiCtrlRichEdit_SetEventMask($hRichEdit, $ENM_LINK)

    _GuiCtrlRichEdit_AutoDetectURL($hRichEdit, True)
    _GuiCtrlRichEdit_AppendText($hRichEdit, @CR & "mailto:[email protected]?subject=oil_pump" & @CRLF )
    While True
        $iMsg = GUIGetMsg()
        Select
            Case $iMsg = $GUI_EVENT_CLOSE
                Exit
        EndSelect
    WEnd
EndFunc   ;==>Main

Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
    Local $hWndFrom, $iCode, $tNMHDR, $tEnLink, $cpMin, $cpMax, $tMsgFilter
    $tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hRichEdit
            Select
                Case $iCode = $EN_LINK
                    $tMsgFilter = DllStructCreate($tagEN_MSGFILTER, $iLparam)
                    If DllStructGetData($tMsgFilter, "msg") = $WM_LBUTTONUP Then
                        $tEnLink = DllStructCreate($tagENLINK, $iLparam)
                        $cpMin = DllStructGetData($tEnLink, "cpMin")
                        $cpMax = DllStructGetData($tEnLink, "cpMax")
                        _ShellExecuteEx(_GuiCtrlRichEdit_GetTextInRange($hRichEdit, $cpMin, $cpMax))
                    EndIf
            EndSelect
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _ShellExecuteEx($sFileName, $sParameters = "", $sWorkingDir = "", $sVerb = "open", $iShowFlag = @SW_SHOWNORMAL)
	Local $aRet = DllCall("Shell32.dll", "long", "ShellExecute", _
		"hwnd", 0, "str", $sVerb, "str", $sFileName, "str", $sParameters, "str", $sWorkingDir, "int", $iShowFlag)
	
	If @error Or $aRet[0] <= 32 Then Return SetError(1, 0, 0)
	Return 1
EndFunc
 
Автор
L

Latoid

Знающий
Сообщения
95
Репутация
11
Creator
:ok: :ok: :ok:
PS Вы смотрели эту тему? http://autoit-script.ru/index.php/topic,681.0.html
 
Верх