Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Tip (GUICtrlSetTip) в n строк/Авторазбиение Tip на строки заданной длины (http://forum.oszone.net/showthread.php?t=185885)

saavaage 19-09-2010 15:41 1499116

Tip (GUICtrlSetTip) в n строк/Авторазбиение Tip на строки заданной длины
 
Проблема:
есть, положим, простейший скрипт с подсказкой:

Код:

#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("OPPPPP", 619, 442, 189, 122)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)
$DriverErrors = GUICtrlCreateTabItem("XXXXXXXXXX")

GUICtrlCreateGroup("YYYYYYYYYYYYYYYY", 14, 40, 255, 345)

GUICtrlCreateLabel('Подсказка. Наведи мышку!', 300, 250, 250, 45)
GUICtrlSetTip(-1, 'Внимание! Для показа защищенных системных файлов, необходимо отмениь скрытие папок и файлов!')

GUICtrlCreateTabItem("")
GUISetState()

While 1
    Sleep(100)
WEnd

Func CLOSEClicked()
  Exit
EndFunc

Как сделать, чтобы подсказка выводилась в несколько строк? Как сделать, чтобы длина строки подсказки была определенной длины?

PS в справке ничего подобного не нашел :( . Версия Autoit 3.3.6.1

Заранее спасибо за любую помощь.

Creat0R 19-09-2010 16:03 1499128

Цитата:

Цитата saavaage
Как сделать, чтобы подсказка выводилась в несколько строк? »

Добавить @CRLF там где нужно разделить строку.

Цитата:

Цитата saavaage
Как сделать, чтобы длина строки подсказки была определенной длины? »

StringLeft($sTip, N)?

saavaage 19-09-2010 16:25 1499147

Creat0R, спасибо. Я был невнимателен: пробовал использовать @CRLF, но забывал ставить после @CRLF знак &.
Итак, правильный вариант :

Код:

GUICtrlSetTip(-1, 'Внимание! Для показа защищенных системных файлов,' & @CRLF & 'необходимо отмениь скрытие папок и файлов!')
Creat0R, по второму вопросу я был немного неточен.
Я хотел узнать, можно ли, задав длину подсказки, получить автоматический вывод текста подсказки в несколько строк?
То есть, у меня срока подсказки содержит 500 символов. Я задаю длину в 50 и получаю на мониторе подсказку в 10 строк? при этом разбиение происходит по словам - если граница строки приходится на слово, то слово не бьется, а перенос на следующую строку происходит после его окончания. Не уверен, но, возможно, это можно реализовать через регулярные выражения + @CRLF?

Creat0R 19-09-2010 17:24 1499177

Цитата:

Цитата saavaage
срока подсказки содержит 500 символов. Я задаю длину в 50 и получаю на мониторе подсказку в 10 строк? при этом разбиение происходит по словам - если граница строки приходится на слово, то слово не бьется, а перенос на следующую строку происходит после его окончания. »

Пример:

Код:

$sStr = 'В соответствии со статьей 21 Закона от 21.07.1997 г. N 122-ФЗ "О государственной регистрации прав на недвижимое имущество и сделок с ним" срок исправления технических ошибок, допущенных при государственной регистрации прав, не должен превышать трех календарных дней с момента обнаружения ошибки или получения заявления от любого заинтересованного лица в письменной форме об исправлении технических ошибок. До получения заявителем документов после проведения государственной регистрации прав срок исправления технических ошибок осуществляется в течение дня, отведенного для получения документов.'

#include <GUIConstantsEx.au3>

$hGUI = GUICreate("_StringAlignment", 250, 150)

GUICtrlCreateCheckbox("Закон 122-ФЗ", 20, 20)
GUICtrlSetTip(-1, _StringAlignment($sStr, 50, 4))

GUISetState(@SW_SHOW, $hGUI)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _StringAlignment($sStr, $iWidth, $iIndent = 0, $iMaxExpand = -1, $fLastExpand = 0)
    Local $Part, $Pos, $Count = 0, $Prev = 0, $Stop = 0, $Result = '', $Tab = ''

    If $iIndent > 0 Then
        For $i = 1 To $iIndent
            $Tab &= @TAB
        Next
    EndIf
    $sStr = $Tab & StringStripWS($sStr, 7)
    Do
        $Pos = StringInStr($sStr, ' ', 0, 1, $Prev + 1)
        If Not $Pos Then
            $Pos = StringLen($sStr)
            $Stop = 1
        EndIf
        If $Pos > $iWidth + 1 Then
            $Part = StringLeft($sStr, $Prev - 1)
            $sStr = StringTrimLeft($sStr, $Prev)
            $Result &= _StringExpand($Part, $iWidth, $iMaxExpand) & @CRLF
            $Prev = $Pos - $Prev
            $Count += 1
        Else
            $Prev = $Pos
        EndIf
    Until $Stop
    If ($fLastExpand) And ($Count) Then
        $sStr = _StringExpand($sStr, $iWidth, $iMaxExpand)
    EndIf
    $Result &= $sStr
    If $iIndent > 0 Then
        $Result = StringReplace($Result, $Tab, StringReplace($Tab, @TAB, ' '), 1)
    EndIf
    Return $Result
EndFunc  ;==>_StringAlignment

Func _StringExpand($sStr, $iWidth, $iMaxExpand)
    Local $aWord, $Add, $Num, $Space

;  $sStr = StringStripWS($sStr, 7)
    $aWord = StringSplit($sStr, ' ')
    If $aWord[0] < 2 Then
        Return $sStr
    EndIf
    $Num = $iWidth - (StringLen($sStr) - $aWord[0] + 1)
    $Add = Mod($Num, $aWord[0] - 1)
    $Num = ($Num - $Add) / ($aWord[0] - 1)
    If ($iMaxExpand > 0) And ($Num >= $iMaxExpand) Then
        $Num = $iMaxExpand
        $Add = 0
    EndIf
    $Space = StringFormat('%' & $Num & 's', '')
    For $i = 1 To $Add
        $aWord[$i] &= ' '
    Next
    $sStr = $aWord[1]
    For $i = 2 To $aWord[0]
        $sStr &= $Space & $aWord[$i]
    Next
    Return $sStr
EndFunc  ;==>_StringExpand


saavaage 19-09-2010 17:39 1499184

Creat0R, если бы можно было, нажал бы спасибо 3 раза. Спасибо! Тема решена.


Время: 21:55.

Время: 21:55.
© OSzone.net 2001-