Что нового

GUICtrlSetData > вывод текста вверх а не вниз

maddoc

Новичок
Сообщения
48
Репутация
2
Я использую простую функцию для вывода лога по ходу выполнения скрипта :
Код:
Func MemoWrite($sMessage)
GUICtrlCreateEdit("", 0, 25, 200, 220, BitOR($ES_AUTOVSCROLL, $ES_READONLY, $ES_AUTOHSCROLL))

GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)

EndFunc   ;==>MemoWrite

Получается так :

Сообщение 1
Сообщение 2
Сообщение 3

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

Вообщем вопрос - как перенастроить так чтобы было :

Сообщение 3
Сообщение 2
Сообщение 1

чтобы скроллинг был не нужен в принципе ( он отключен так как визуально не красив ))) ) и чтобы последние сообщения появлялись сверху.

Спасибо за ответ.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Ественно скролл можно было бы автоматом прокручивать к последней строчке, но т.к зада не в этом, вот решение проблеме:

Код:
GUICtrlSetData($iMemo, $sMessage & @CRLF & GUICtrlRead($iMemo))


Т.е перезапись и чтение лога каждый раз.

P.S
Не очень разумно создавать Edit каждый раз при вызове функций.
 
Автор
M

maddoc

Новичок
Сообщения
48
Репутация
2
CreatoR сказал(а):
Ественно скролл можно было бы автоматом прокручивать к последней строчке, но т.к зада не в этом, вот решение проблеме:

Код:
GUICtrlSetData($iMemo, $sMessage & @CRLF & GUICtrlRead($iMemo))


Т.е перезапись и чтение лога каждый раз.

P.S
Не очень разумно создавать Edit каждый раз при вызове функций.

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

Да - GUICtrlSetData($iMemo, $sMessage & @CRLF & GUICtrlRead($iMemo)) - то что нужно.
Объясни пожалуйста попунктно, почему я сам недошел до этого?))
 
Автор
M

maddoc

Новичок
Сообщения
48
Репутация
2
Нет ну серьезно :laugh:

GUICtrlRead = даже прочитав описание этой функции я не пойму что именно она делает. Хотя вроде англ не так уж и плох :blum:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
maddoc [?]
GUICtrlRead = даже прочитав описание этой функции я не пойму что именно она делает
Ну если с английским всё в порядке, то что делает функция можно понять из самого её названия.

Read state or data of a control.
Читает состояние или данные элемента.

В нашем случае это данные.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
GUICtrlSetData($iMemo, $sMessage, 1)
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
CreatoR [?]
После использования данного кода появилась ошибка при повторном прочтении из файла, а именно содержимое остаётся и к нему добавляется новое содержимое... Возник вопрос, как определить последнюю строчку в файле, чтоб скрипт добавлял в лог только её
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Код:
#include <ScrollBarConstants.au3>
#include <WindowsConstants.au3>
#include <Encoding.au3>
#include <GuiEdit.au3>

GUICreate('Ping Google', 600, 200)
GUISetFont(9, 400, -1, 'Tahoma')
$Edit = GUICtrlCreateEdit('', 10, 10, 580, 180, $WS_VSCROLL + $ES_READONLY)
GUICtrlSetBkColor(-1, 0xCCCC99)
$OK = GUICtrlCreateButton('OK', 280, 350, 60, 25)
GUISetState()
$PID = Run('ping -t 74.125.232.19', @SystemDir, @SW_HIDE, 2)
$EditText = ''
While 1
	$line = StdoutRead($PID)
	If @error Then ExitLoop
	$EditText &= $line
	If $line Then
		GUICtrlSetData($Edit, _Encoding_866To1251($EditText))
		_GUICtrlEdit_Scroll($Edit, $SB_BOTTOM)
	EndIf
	$msg = GUIGetMsg()
	Switch $msg
		Case -3, $OK
			ProcessClose($PID)
			Exit
	EndSwitch
WEnd
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Спасибо. Я решил проблему иначе. Просто добавил переменную счётчик, т.к. скрипт сам заполняет файл :smile:
 

focus

Осваивающий
Сообщения
69
Репутация
20
AZJIO, запустил Ваш пример. Нарисовалась форма, пинг пошёл. Всё нормально. Закрываю форму - закрылась. А пинг продолжается... Помогла перезагузка. Как отключить - включить пинг ?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
focus
Наверно убить процесс ping.exe, я делал как пример плавного прокручивания, пример поправлю.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
DarWiM [?]
После использования данного кода появилась ошибка при повторном прочтении из файла, а именно содержимое остаётся и к нему добавляется новое содержимое
Можно предварительно опустошать Edit (GUICtrlSetData($iMemo, '')). Хотя правильнее конечно будет так:

Код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>

Opt("GUIOnEventMode", 1)

$hGUI = GUICreate("Test Script", 500, 500)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Quit")
$nEdit = GUICtrlCreateEdit("", 0, 0, 500, 500, BitOR($ES_AUTOVSCROLL, $ES_READONLY, $ES_AUTOHSCROLL))
GUISetState(@SW_SHOW, $hGUI)

$aRead = StringSplit(StringStripCR(FileRead(@ScriptFullPath)), @LF)

For $i = 1 To $aRead[0]
	MemoWrite($nEdit, $aRead[$i] & @CRLF)
	Sleep(500)
Next

Func _Quit()
	Exit
EndFunc

Func MemoWrite($nCtrlID, $sMessage)
	GUICtrlSetData($nCtrlID, $sMessage, 1)
EndFunc


как определить последнюю строчку в файле
Уже было на форуме, и есть в справке:
Код:
$sLastLine = FileReadLine($sFile, -1)

хотя это не надёжно в случае если в файле последние две или более строчки пустые, тут надёжнее будет так:
Код:
$sLastLine = StringRegExpReplace(FileRead(@ScriptFullPath), '(?s).+?([^\r\n]+?)(\r?\n)*$', '\1')

ну или так:
Код:
ConsoleWrite(_FileReadLastLine(@ScriptFullPath) & @LF)

Func _FileReadLastLine($sFile)
	;Return StringRegExpReplace(FileRead($sFile), '[\s\S]+?([^\r\n]*?)(\r?\n)*$', '\1')
	
	Local $hFile, $iC, $sLine, $sLastLine
	
	$hFile = FileOpen($sFile, 0)
	
	While 1
		$iC += 1
		
		$sLine = FileReadLine($hFile, $iC)
		
		If @error <> 0 Then ExitLoop
		If $sLine <> '' Then $sLastLine = $sLine
	WEnd
	
	FileClose($hFile)
	Return $sLastLine
EndFunc
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
А как сделать, чтоб курсор всегда был в конце и его небыло видно?
 
Верх