Что нового

GuiRichEdit. Разрушение таблиц при попытке замены текста

Suppir

Продвинутый
Сообщения
967
Репутация
62
Я хочу использовать регулярные выражения для _GUICtrlRichEdit_Create. Все работает нормально за пределами вордовских таблиц - эти таблицы превращаются в обычный текст. Посмотрите код:


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

$Form1 = GUICreate("Form1", 800, 600, 300, 200)
$hRichEdit = _GUICtrlRichEdit_Create($Form1, "", 0, 0, 800, 600)
GUISetState(@SW_SHOW)

HotKeySet("^x", "_Replace")
HotKeySet("{ESC}", "_Exit")

Global $Records
Global $Search[1000][2]
Global $Matches
Global $i, $IN

TrayTip ("AutoIt", "Started", 1)
sleep(2000)
TrayTip("clears any tray tip","",0)

While 1
    Sleep(100)
    
WEnd

Func _Replace()
    
    Local $i
    $Text = _GUICtrlRichEdit_GetCtrlText($hRichEdit)
    
;~  HERE IS THE PROBLEM!  
    $Text = StringRegExpReplace($Text, "a", "b")
    _GuiCtrlRichEdit_AppendText($hRichEdit, $Text)
;~  THE TABLE IS NOT MS-WORD-TYPE ANYMORE
    
    TrayTip ("AutoIt", "Done", 1)
    sleep(1000)
    TrayTip("clears any tray tip","",0)
        
            
EndFunc

Func _Exit()
    TrayTip ("AutoIt", "Exit", 1)
    Sleep(1000)
Exit
EndFunc


1. Запустите скрипт
2. Скопируйте в GUI какую-нибудь вордовскую таблицу
3. Нажмите CTRL+x
4. Вы видите? Таблица превратилась в простой текст (потерялось свойство таблицы)
5. Нажмите ESC для выхода.

Наверное, в таблицах нельзя применять регулярные выражения. Однако в MS Word есть поддержка оных и все прекрасно меняется внутри таблиц. Наверное, я что-то не так делаю.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Suppir [?]
Наверное, в таблицах нельзя применять регулярные выражения
К регулярным выражениям оно не имеет никакого отношения, нужно использовать другие функция для получения данных из RichEdit:

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

HotKeySet("^x", "_Replace")
HotKeySet("^+e", "_Exit")

$Form1 = GUICreate("Form1", 800, 600, 300, 200)
$hRichEdit = _GUICtrlRichEdit_Create($Form1, "", 0, 0, 800, 600)
GUISetState(@SW_SHOW)

Global $Records
Global $Search[1000][2]
Global $Matches
Global $i, $IN

TrayTip("AutoIt", "Started", 1)
Sleep(2000)
TrayTip("clears any tray tip", "", 0)

While 1
	Sleep(100)
WEnd

Func _Replace()
	Local $i
	
	$Text = _GUICtrlRichEdit_StreamToVar($hRichEdit)
	$Text = StringRegExpReplace($Text, "a", "b")
	_GuiCtrlRichEdit_SetText($hRichEdit, "")
	_GUICtrlRichEdit_StreamFromVar($hRichEdit, $Text)
	
	TrayTip("AutoIt", "Done", 1)
	Sleep(1000)
	TrayTip("clears any tray tip", "", 0)
EndFunc

Func _Exit()
	TrayTip("AutoIt", "Exit", 1)
	Sleep(1000)
	Exit
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Creator, да, так получается, спасибо :smile:

Теперь я пытаюсь положить таблицу из GuiRichEdit в буфер обмена:


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

HotKeySet("^x", "_Replace")
HotKeySet("^+e", "_Exit")

$Form1 = GUICreate("Form1", 800, 600, 300, 200)
$hRichEdit = _GUICtrlRichEdit_Create($Form1, "", 0, 0, 800, 600)
GUISetState(@SW_SHOW)

Global $Records
Global $Search[1000][2]
Global $Matches
Global $i, $IN

TrayTip("AutoIt", "Started", 1)
Sleep(2000)
TrayTip("clears any tray tip", "", 0)

While 1
    Sleep(100)
WEnd

Func _Replace()
    Local $i
    
    $Text = _GUICtrlRichEdit_StreamToVar($hRichEdit)
    $Text = StringRegExpReplace($Text, "a", "b")
    _GuiCtrlRichEdit_SetText($hRichEdit, "")
    _GUICtrlRichEdit_StreamFromVar($hRichEdit, $Text)

# в этом месте проблема. Таблица разрушается и данные в буфер передаются абракадаброй
ClipPut(_GuiCtrlRichEdit_StreamToVar($hRichEdit))    

    TrayTip("AutoIt", "Done", 1)
    Sleep(1000)
    TrayTip("clears any tray tip", "", 0)
EndFunc

Func _Exit()
    TrayTip("AutoIt", "Exit", 1)
    Sleep(1000)
    Exit
EndFunc

С помощью _GuiCtrlRichEdit_StreamToVar - это не работает. С помощью _GuiCtrlRichEdit_Copy - также не работает. Задача состоит в копировании измененной таблицы в буфер обмена (чтобы ее можно было вставить в другую программу)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Suppir [?]
Задача состоит в копировании измененной таблицы в буфер обмена
А это уже проблема в ClipPut - нативные функций для работы с б.обмена не поддерживают форматирование текста.

У меня пока получилось только так:

Код:
;Это вместо ClipPut...
	_GUICtrlRichEdit_SetSel($hRichEdit, 0, -1)
	Sleep(10)
	ControlSend($hRichEdit, "", "", "^{INSERT}")
	Sleep(10)
	_GUICtrlRichEdit_SetSel($hRichEdit, 0, 0)
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Creator, я вот так вот сделал:

Код:
_GUICtrlRichEdit_SetSel($hRichEdit, 0, -1)
_GuiCtrlRichEdit_Copy($hRichEdit)



вроде заработало :smile:


Добавлено:
Сообщение автоматически объединено:

На главном форуме AutoIt мне дали такую функцию:

Код:
Func _SendTableToBuffer2()
    ; Author: [email protected]
    
    ;alternative 2:
    _ClipBoard_Open($hRichEdit)
    _ClipBoard_Empty()
    
    ; get Text
    $Data = _GUICtrlRichEdit_GetText($hRichEdit, True,1200)
    
    ; normal text
    $hMem = _MemGlobalAlloc(StringLen($Data), $GMEM_MOVEABLE)
    $struct = DllStructCreate("char[" & StringLen($Data) & "]", _MemGlobalLock($hMem))
    DllStructSetData($struct, 1, $Data)
    _MemGlobalUnlock($hMem)
    _ClipBoard_SetDataEx($hMem, $CF_TEXT)
    
    ; unicode text
    $hMem = _MemGlobalAlloc(StringLen($Data)*2, $GMEM_MOVEABLE)
    $struct = DllStructCreate("wchar[" & StringLen($Data) & "]", _MemGlobalLock($hMem))
    DllStructSetData($struct, 1, $Data)
    _MemGlobalUnlock($hMem)
    _ClipBoard_SetDataEx($hMem, $CF_UNICODETEXT)
    
    ; RTF with Objects:
    $Data = _GUICtrlRichEdit_StreamToVar($hRichEdit)
    $hMem = _MemGlobalAlloc(StringLen($Data), $GMEM_MOVEABLE)
    $struct = DllStructCreate("char[" & StringLen($Data) & "]", _MemGlobalLock($hMem))
    DllStructSetData($struct, 1, $Data)
    _MemGlobalUnlock($hMem)
    _ClipBoard_SetDataEx($hMem, $_GRE_CF_RETEXTOBJ)
    
    ; RTF without objects:
    $Data = _GUICtrlRichEdit_StreamToVar($hRichEdit, True, False)
    $hMem = _MemGlobalAlloc(StringLen($Data), $GMEM_MOVEABLE)
    $struct = DllStructCreate("char[" & StringLen($Data) & "]", _MemGlobalLock($hMem))
    DllStructSetData($struct, 1, $Data)
    _MemGlobalUnlock($hMem)
    _ClipBoard_SetDataEx($hMem, $_GRE_CF_RTF)
    _ClipBoard_Close()
                
EndFunc


однако она работает только со свежей бетой GuiRichEdit.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
CreatoR, кажется, тему удалили. Не знаю почему, наверное, потому что ее за час решили. Мне просто дали эту функцию, после чего тема исчезла.
Кажется, там один из модераторов - разработчик этой либы. Он написал, что это проблема либы и сейчас готовится бета, в которой будет пофиксено. А пока предложил воспользоваться этой функцией (после чего тема была удалена).
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
http://www.autoitscript.com/forum/index.php?showtopic=106115&view=findpost&p=749509&s=f6ea8edbb863faa9c5436300d1b687af

Google power! ;)
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Тю, я пытался ее найти через поиск форума - наверное, там индекс еще не обновлен :smile:
 
Верх