On-line: PSP, Haz, tnsr2, гостей 2. Всего: 5 [подробнее..]
АвторСообщение



Пост N: 10
Зарегистрирован: 30.01.18
ссылка на сообщение  Отправлено: 07.05.19 15:49. Заголовок: Выделение текста мышью в GTWVT на Harbour


Добрый день, коллеги!
После прочтения этого форума заинтересовался терминалом GTWVT,
стал на него переводить консольную программу на Harbour но в процессе
столкнулся с тем, что как то странно работает выделение мышью текста.
Оно начинает работать только если в верхнем левом углу консольного окна
нажать "Mark and Copy", начинаю выделение мышью но оно сразу заканчивается
не успевая нажать Ctrl-C.
Можно ли как то сделать нормальное выделение текста мышью как это сделано
в GTWIN терминале?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 14 [только новые]


администратор




Пост N: 7035
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.05.19 17:36. Заголовок: Это работает чуть не..


Это работает чуть не так.
Выделяем мышкой и педаль мышки отпускаем.
Всё , текст уже в буфере.

Спасибо: 1 
ПрофильЦитата Ответить



Пост N: 11
Зарегистрирован: 30.01.18
ссылка на сообщение  Отправлено: 08.05.19 10:10. Заголовок: Dima, спасибо большо..


Dima, спасибо большое. Никогда бы не догадался.
А можно как то сделать чтобы каждый раз "Mark and Copy" для очередного выделения не нажимать?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7036
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.05.19 22:00. Заголовок: NickSam пишет: А мо..


NickSam пишет:

 цитата:
А можно как то сделать чтобы каждый раз "Mark and Copy" для очередного выделения не нажимать?


А как часто это нужно ?
У "моих" таких потребностей вообще не возникает...

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 12
Зарегистрирован: 30.01.18
ссылка на сообщение  Отправлено: 09.05.19 14:07. Заголовок: Dima пишет: А как ч..


Dima пишет:

 цитата:
А как часто это нужно ?

Dima пишет:
[quote]`
"Мои" достаточно часто этим пользуются и, к сожалению, это единственный момент,
который мешает переходу на GTWVT.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 656
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 10.05.19 12:26. Заголовок: Можно что угодно дел..


Можно что угодно делать с буфером обмена при помощи нескольких вызовов:

xValue := hb_GtInfo( HB_GTI_CLIPBOARDDATA ) - прочитать содержимое буфера обмена
hb_GtInfo( HB_GTI_CLIPBOARDDATA, xValue ) - поместить xValue в буфер обмена
hb_GtInfo( HB_GTI_CLIPBOARDPASTE ) - вставить содержимое буфера обмена в буфер клавиатуры

Остается организовать вызов этих функций наиболее привычным для Ваших юзеров способом: стрелки с шифтом, Ctrl-C/Ctrl-V или ещё как...

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 13
Зарегистрирован: 30.01.18
ссылка на сообщение  Отправлено: 13.05.19 11:53. Заголовок: Sergy пишет: hb_GtI..


Sergy пишет:

 цитата:
hb_GtInfo( HB_GTI_CLIPBOARDDATA, xValue ) - поместить xValue в буфер обмена


У меня все равно остается вопрос: как сформировать этот xValue с помощью выделения мышью
не обращаясь каждый раз к "Mark and Copy".

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2542
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.05.19 12:55. Заголовок: NickSam пишет У меня..


NickSam пишет
 цитата:
У меня все равно остается вопрос: как сформировать этот xValue с помощью выделения мышью
не обращаясь каждый раз к "Mark and Copy".


Ловите
#define K_LBUTTONDOWN 1002
запоминаете координаты, ловите
#define K_MOUSEMOVE 1001
до момента поимки
#define K_LBUTTONUP 1003
разница между координатами даст значение xValue (читаете с экрана или еще как ...)

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 658
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 13.05.19 14:12. Заголовок: NickSam пишет: как ..


NickSam пишет:
 цитата:
как сформировать этот xValue с помощью выделения мышью
не обращаясь каждый раз к "Mark and Copy".


Другого встроенного и универсального решения нет.

Если речь идет о редактировании текста - можно посмотреть в соседней ветке, как реализован класс Tedit() и в аналогичных примерах: обычно юзер "привык" к комбинации SHIFT+стрелки.

Если речь об "общем" решении в пределах всего приложения, я-бы пошел таким путем: определил через SETKEY() процедуру, которая будет обрабатывать ситуацию "выделить и скопировать" в любом месте программы.
После вызова данная процедура через SAVESCREEN() получает текущее содержимое экрана. Его формат - простая строка, в которой чередуется 1 байт с кодом символа и 1 байт цветовыми атрибуами этого символа.

Далее, анализируя работу юзера с мышью (см. коды в сообщении выше или inkey.ch) и зная размер экрана (MAXROW(), MAXCOL()), получаете нужный фрагмент строки из SAVESCREEN(), выкидываете из него цветовые атрибуты и вставляете итог в буфер обмена.

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2543
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.05.19 15:13. Заголовок: Sergy пишет определи..


Sergy пишет
 цитата:
определил через SETKEY() процедуру, которая будет обрабатывать ситуацию "выделить и скопировать" в любом месте программы. ...
Далее, анализируя работу юзера с мышью ...


Давно не работал с wvt терминалом ..., большого анализа и не надо, вроде (или подзабыл уже)
 
SET EVENTMASK TO INKEY_ALL
... обработчики
SetKey(K_LBUTTONDOWN, {|| ... })
SetKey(K_MOUSEMOVE , {|| ... })
SetKey(K_LBUTTONUP , {|| ... })
SetKey(K_CTRL_C , {|| ... })
... и т.д.
на текстах и др. местах с
k := INKEY(0)
If ! empty( b := SetKey(k) )
EVal(b, ...)
EndIf

А тексты с экрана брать SaveScreen, как и было сказано выше

Спасибо: 1 
ПрофильЦитата Ответить



Пост N: 14
Зарегистрирован: 30.01.18
ссылка на сообщение  Отправлено: 16.05.19 15:46. Заголовок: Sergy, SergKis спаси..


Sergy, SergKis спасибо большое за идею. Сделал все так Вы расписали, все получилось,
ниже приведен код. Единственно, не получается подкрасить область выделения экрана
где находится курсор в Tbrowse и активный Get в Read.
То есть это строка экрана попадает в буфер, но визуально другим цветом не выделяется.

FUNCTION Main()

PUBLIC y1_mouse := 0, x1_mouse := 0, y2_mouse := 0, x2_mouse := 0
PUBLIC lMark := .F., scr_origin := ''

SET EVENTMASK TO INKEY_ALL
SetKey(K_LBUTTONDOWN, {|| MarkAndCopy() })
SetKey(K_MOUSEMOVE , {|| MarkAndCopy() })
SetKey(K_LBUTTONUP , {|| MarkAndCopy() })

..........
..........

RETURN

FUNCTION MarkAndCopy()
LOCAL scr := ''
LOCAL i := 0, n := 0, cStr := '', len_str := 0

if lastkey () == K_LBUTTONDOWN // Начинаем выделение
scr_origin = savescreen()
y1_mouse = mrow()
x1_mouse = mcol()
lMark = .T.

elseif lastkey () == K_MOUSEMOVE .and. lMark // Закрашиваем выделенную область экрана
y2_mouse = mrow()
x2_mouse = mcol()
scr = savescreen(y1_mouse,x1_mouse,y2_mouse,x2_mouse)

for i = 1 to len(scr)
n = i/2
if int(n) == n
cStr += chr(224) // Меняем атрибут на цвет выделения
else
cStr += substr(scr,i,1)
endif
next
restscreen(,,,,scr_origin)
restscreen(y1_mouse,x1_mouse,y2_mouse,x2_mouse,cStr)

elseif lastkey () == K_LBUTTONUP // Сохраняем в буфер содержимое выделенной области экрана
y2_mouse = mrow()
x2_mouse = mcol()
if y1_mouse <> y2_mouse .or. x1_mouse <> x2_mouse
scr = savescreen(y1_mouse,x1_mouse,y2_mouse,x2_mouse)
scr = CharOdd(scr) // Отбрасываем атрибуты

// Вставляем символ переноса строки между строками экрана
len_str = abs(x2_mouse - x1_mouse) + 1
for i = 1 to len(scr)
cStr += substr(scr,i,1)
n = i/len_str
if int(n) == n
cStr += chr(10)
endif
next

hb_GtInfo( HB_GTI_CLIPBOARDDATA, cStr )

restscreen(,,,,scr_origin)
endif
lMark = .F.
endif

RETURN

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2560
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.05.19 16:23. Заголовок: NickSam пишет не пол..


NickSam пишет
 цитата:
не получается подкрасить область выделения экрана
где находится курсор в Tbrowse и активный Get в Read.


Для покраски, наверно, надо лезть в обработчик Tbrowse ( Userfunc после внутреннего inkey получает работу ), а для GET\READ в класс лезть, как это делать не помню, забыл уже, где то в темах поднимали этот вопрос. А с Tbrowse не работал (только щупал), т.к. еще с Summer 87 с dbf была работа своей таблицы, примерно как в hbedit FMenu сделана. Может кто подскажет как красить, кто в теме.
А в тексте выше, не увидел, учет движения мыши справа налево

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2564
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.05.19 22:43. Заголовок: NickSam Попробуйте ..


NickSam
Попробуйте на K_LBUTTONDOWN организовать свой цикл с iney(0) поимки перемещения мыши и закраски до нажатия K_LBUTTONUP остановки закраски и ожидания K_CTRL_C. Любые другие коды разрывают цикл

Спасибо: 1 
ПрофильЦитата Ответить



Пост N: 15
Зарегистрирован: 30.01.18
ссылка на сообщение  Отправлено: 17.05.19 11:19. Заголовок: SergKis, еще раз огр..


SergKis, еще раз огромное спасибо за помощь. В таком варианте все получилось.
Ниже код, может кому пригодится.

FUNCTION Main()

SET EVENTMASK TO INKEY_ALL
SetKey(K_LBUTTONDOWN, {|| MarkAndCopy() })

..........
..........

RETURN

FUNCTION MarkAndCopy()
LOCAL y1_mouse := 0, x1_mouse := 0, y2_mouse := 0, x2_mouse := 0
LOCAL scr := '', scr_origin := ''
LOCAL i := 0, n := 0, cStr := '', len_str := 0

scr_origin = savescreen()
y1_mouse = mrow()
x1_mouse = mcol()

do while .T.
inkey(0)

if lastkey () == K_MOUSEMOVE // Закрашиваем выделенную область экрана
y2_mouse = mrow()
x2_mouse = mcol()
scr = savescreen(y1_mouse,x1_mouse,y2_mouse,x2_mouse)

cStr = ''
for i = 1 to len(scr)
n = i/2
if int(n) == n
cStr += chr(224) // Меняем атрибут на цвет выделения
else
cStr += substr(scr,i,1)
endif
next
restscreen(,,,,scr_origin)
restscreen(y1_mouse,x1_mouse,y2_mouse,x2_mouse,cStr)

elseif lastkey () == K_LBUTTONUP // Сохраняем в буфер содержимое выделенной области экрана
y2_mouse = mrow()
x2_mouse = mcol()
if y1_mouse <> y2_mouse .or. x1_mouse <> x2_mouse
scr = savescreen(y1_mouse,x1_mouse,y2_mouse,x2_mouse)
scr = CharOdd(scr) // Отбрасываем атрибуты

// Вставляем символ переноса строки между строками экрана
cStr = ''
len_str = abs(x2_mouse - x1_mouse) + 1
for i = 1 to len(scr)
cStr += substr(scr,i,1)
n = i/len_str
if int(n) == n
cStr += chr(10)
endif
next

hb_GtInfo( HB_GTI_CLIPBOARDDATA, cStr )

restscreen(,,,,scr_origin)
endif
exit
elseif .T.
exit
endif

enddo

RETURN

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 16
Зарегистрирован: 30.01.18
ссылка на сообщение  Отправлено: 17.05.19 11:21. Заголовок: SergKis пишет: А в ..


SergKis пишет:

 цитата:
А в тексте выше, не увидел, учет движения мыши справа налево


Как ни странно, так все нормально работает.
Видимо savescreen() сам распознает min-max значения координат.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 223
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет