Что нового

[Элементы GUI] Создание GUI формы чата, передача текста от одного элемента управления другому

Сообщения
137
Репутация
-2
Добрый день,

Мне нужно создать две области в GUI: в одной мы текст вводим и отсылаем, вторая текст принимает и отображает. Каждый новый текст должен отображаться под предыдущим (некое подобие переписки), а у меня он перезаписывает предыдущий. Как это можно исправить?
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPIGdi.au3>
#include <Misc.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>
#include <Date.au3>
#include <TabConstants.au3>
#include <GuiListView.au3>

Local $hGui, $Input, $Label, $BtnOk, $Text, $Data, $sRead, $iListView

Opt("GUIOnEventMode", 1) ; Включает режим OnEvent


HotKeySet('{Esc}', '_Quit') ; полный выход из скрипта по Esc
HotKeySet('{ENTER}', '_Button1')

$hGui = GUICreate("GUI", 700, 300, 300, 200, $WS_OVERLAPPEDWINDOW + $WS_POPUP)
;$iListView = GUICtrlCreateListView("", 10, 5, 600, 200)
$Label = GUICtrlCreateLabel("", 10, 5, 600, 200, $WS_BORDER)
$Input = GUICtrlCreateInput('', 10, 210, 600, 50, -1)
$BtnOk = GUICtrlCreateButton('Send', 620, 210, 70, 26)
GUICtrlSetOnEvent(-1, '_Button1')
GUICtrlSetState(-1, $GUI_FOCUS) ; устанавливает фокус на кнопку

GUISetState(@SW_SHOW)

;$sPath_ini = @ScriptDir & "\Example.ini"


While 1
	Sleep(500)
WEnd


Func _Button1()

	$Text = GUICtrlRead($Input, 1)
	GUICtrlSetData($Label, 'Char: ' & $Text)
	GUICtrlSetData($Input, '')

EndFunc   ;==>_Button1

Func _Quit()
	Exit
EndFunc   ;==>_Quit
Не уверен, что верно выбрал элементы управления и, видимо, надо подключать txt файл как промежуточное звено, для сохранения истории, но у меня не получилось
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
считываешь уже записанный и добавляешь к нему новый. и так от раза к разу
 
Автор
D
Сообщения
137
Репутация
-2
Получилось, спасибо!

Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPIGdi.au3>
#include <Misc.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>
#include <Date.au3>
#include <TabConstants.au3>
#include <GuiListView.au3>

Local $hGui, $Input, $Label, $BtnOk, $Text, $Data, $sRead, $iListView

Opt("GUIOnEventMode", 1) ; Включает режим OnEvent


HotKeySet('{Esc}', '_Quit') ; полный выход из скрипта по Esc
HotKeySet('{ENTER}', '_Button1')

$hGui = GUICreate("GUI", 700, 300, 300, 200, $WS_OVERLAPPEDWINDOW + $WS_POPUP)
;$iListView = GUICtrlCreateListView("", 10, 5, 600, 200)
$Label = GUICtrlCreateLabel("", 10, 5, 600, 200, $WS_BORDER)
$Input = GUICtrlCreateInput('', 10, 210, 600, 50, -1)
$BtnOk = GUICtrlCreateButton('Send', 620, 210, 70, 26)
GUICtrlSetOnEvent(-1, '_Button1')
GUICtrlSetState(-1, $GUI_FOCUS) ; устанавливает фокус на кнопку

GUISetState(@SW_SHOW)

;$sPath_ini = @ScriptDir & "\Example.ini"


While 1
    Sleep(500)
WEnd


Func _Button1()
    $Data = GUICtrlRead($Label, 1)
    $Text = GUICtrlRead($Input, 1)
    GUICtrlSetData($Label, $Data & @CRLF & 'Char: ' & $Text  )
    GUICtrlSetData($Input, '')

EndFunc   ;==>_Button1

Func _Quit()
    Exit
EndFunc   ;==>_Quit

Но с большими объёмами переписки, наверно, так нельзя делать и надо всё записывать в какой-то log файл. Какой функцией мне сделать привязку log файла, чтоб вся писанина сначала копировалась туда, а потом уже оттуда попадала в мой Label? Или так я только компьютер грузить буду постоянными запросами?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Dessan
Сделайте оба элемента Edit. Так и многострочность появится, и добавлять текст можно в конец, и копировать из верхнего. При закрытии сохраняйте всю историю в файл, при запуске - загружайте
Код:
#include <GUIConstants.au3>

Local $hGui, $Input, $Label, $BtnOk, $Text, $Data, $sRead, $iListView

Opt("GUIOnEventMode", 1) ; Включает режим OnEvent

HotKeySet('{Esc}', '_Quit') ; полный выход из скрипта по Esc
;~ HotKeySet('{ENTER}', '_Button1')

$hGui = GUICreate("GUI", 700, 300, 300, 200, $WS_OVERLAPPEDWINDOW + $WS_POPUP)
$Label = GUICtrlCreateEdit("", 10, 5, 600, 200, BitXOR($GUI_SS_DEFAULT_EDIT, $WS_HSCROLL, $ES_READONLY))
$Input = GUICtrlCreateEdit('', 10, 210, 600, 50, BitXOR($GUI_SS_DEFAULT_EDIT, $WS_HSCROLL))
$BtnOk = GUICtrlCreateButton('Send', 620, 210, 70, 26)
GUICtrlSetOnEvent(-1, '_Button1')
GUICtrlSetState($Input, $GUI_FOCUS) ; устанавливает фокус в поле ввода

GUICtrlSetData($Label, FileRead("history.txt")) ; загрузка истории
GUISetState(@SW_SHOW)

While 1
    Sleep(500)
WEnd

Func _Button1()
    $Text = GUICtrlRead($Input)
    GUICtrlSetData($Label, 'Char: ' & $Text & @CRLF, 1) ; добавление текста
    GUICtrlSetData($Input, '')
    GUICtrlSetState($Input, $GUI_FOCUS)
EndFunc   ;==>_Button1

Func _Quit()
    ; сохранение истории
    $File = FileOpen("history.txt", 1)
    FileWrite($File, GUICtrlRead($Label))
    FileClose($File)
    Exit
EndFunc   ;==>_Quit
 
Автор
D
Сообщения
137
Репутация
-2
Идеально, разве что я добавил вертикальную прокрутку для поля Label. Спасибо!

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

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Dessan
добавил вертикальную прокрутку для поля Label
Согласен. Тоже добавил.

OffTopic:
В принципе, есть готовое решение Miranda NG с протоколом для локальной сети E-mage LAN. Попробуйте, вдруг понравится.
 
Автор
D
Сообщения
137
Репутация
-2
InnI
Да, спасибо.Готовых решений много, но самое ценное - практическое применение Autoit. :smile:
 
Верх