Clipboard Copy/Past меню на TEXT-control
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- morkovin
- Ветеран
- Сообщения: 924
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 8 раз
- Поблагодарили: 3 раза
- Контактная информация:
Clipboard Copy/Past меню на TEXT-control
C11.
Долгое время использовал шаблоны FormEntryFieldClipboardSupport(ABCfree) и MVEntryCopyPastePopupGlobal
для добавления Copy/Past меню для полей ввода на форме. Вдруг обнаружил, что Popup-menu по RightClick
не срабатывает на TEXT-control. По Ctrl-V вставляется нормально. В чём причина? Как обойти?
Долгое время использовал шаблоны FormEntryFieldClipboardSupport(ABCfree) и MVEntryCopyPastePopupGlobal
для добавления Copy/Past меню для полей ввода на форме. Вдруг обнаружил, что Popup-menu по RightClick
не срабатывает на TEXT-control. По Ctrl-V вставляется нормально. В чём причина? Как обойти?
WBR, morkovin
- Игорь Столяров
- Ветеран движения
- Сообщения: 7891
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 89 раз
Clipboard Copy/Past меню на TEXT-control
ДД !
Эти шаблоны с длинными названиями были сделаны 20 лет назад для C5.
Зачем они сейчас ? Всё прекрасно работает со штатными шаблонами.
Эти шаблоны с длинными названиями были сделаны 20 лет назад для C5.
Зачем они сейчас ? Всё прекрасно работает со штатными шаблонами.
Make Clarion Great Again ! 
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5109
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 11 раз
- Поблагодарили: 55 раз
Clipboard Copy/Past меню на TEXT-control
Это кому как. Даже у англоязычных периодически спрашивают, как заменить это безобразие на что-нибудь более адекватное.
По сабжу не помню точно, кажется, что-то правилось. У меня на text все работает.

По сабжу не помню точно, кажется, что-то правилось. У меня на text все работает.
C6/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5109
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 11 раз
- Поблагодарили: 55 раз
Clipboard Copy/Past меню на TEXT-control
А, сорри, у меня просто шаблон упомянутый зарегистрирован. А реально его не использую.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7891
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 89 раз
Clipboard Copy/Past меню на TEXT-control
Это иное ! Я так понимаю, что это штатное меню WinAPI для работы с текстовым полем ...
Можно конечно перехватывать и подменять ... здесь главное, что бы потом не получилось как в первом сообщении этой темы.

Make Clarion Great Again ! 
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5109
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 11 раз
- Поблагодарили: 55 раз
Clipboard Copy/Past меню на TEXT-control
Шаблон просто старый, он не без проблем. Я сделал проще. Нарисовал небольшую функцию в стандартной библиотеке, которая автоматом цепляется ко всем app, а в шаблонах достаточно повесить alert на mouseright и 93 (специальная клавиша на клавиатуре для вызова контекстного меню) и в обработке события EVENT:AlertKey вставить код вида:
Сама функция FsEntryPopUp выглядит так.
Код: Выделить всё
if keycode() = MouseRight or keycode()=93
if FsEntryPopUp()=1
cycle
end
end
Код: Выделить всё
FsEntryPopUp FUNCTION ! Объявление процедуры
FilesOpened LONG
Loc:Contr LONG
Loc:FlagKbd BYTE
Loc:Ok BYTE
Loc:X LONG
Loc:Y LONG
Loc:W LONG
Loc:H LONG
Loc:SelStart LONG
Loc:SelEnd LONG
Loc:PopupChoice LONG
Loc:ClipboardText CSTRING(1024)
Loc:FullText STRING(1024)
Loc:SelectedText STRING(1024)
Loc:PopupText CSTRING(1024)
CODE ! Начало исполняемого кода
if 0{prop:active}=0
return(0)
.
Loc:Contr = focus()
if Loc:Contr=0
return(0)
.
if Loc:Contr{prop:readonly}=1
return(0)
.
if Loc:Contr{PROP:Type} <> Create:Entry and |
Loc:Contr{PROP:Type} <> Create:Spin and |
Loc:Contr{PROP:Type} <> Create:Combo and |
Loc:Contr{PROP:Type} <> Create:Text
return(0)
.
Loc:X = Loc:Contr{PROP:Xpos}
Loc:Y = Loc:Contr{PROP:Ypos}
Loc:W = Loc:Contr{PROP:Width}
Loc:H = Loc:Contr{PROP:Height}
Loc:FlagKbd=0
if ~inrange(mouseX(), Loc:X, Loc:X+Loc:W) or |
~inrange(mouseY(), Loc:Y, Loc:Y+Loc:H)
if keycode()=mouseRight
return(0)
else
Loc:FlagKbd=1
.
.
loc:ClipboardText = clip(clipboard(1))
Loc:SelStart = Loc:Contr{PROP:SelStart}
Loc:SelEnd = Loc:Contr{PROP:SelEnd}
Loc:FullText = Loc:Contr{PROP:ScreenText}
Loc:SelectedText = Loc:FullText[Loc:SelStart : Loc:SelEnd]
if Loc:Contr{PROP:Upr}
loc:ClipboardText = UPPER(loc:ClipboardText)
.
if Loc:SelEnd=0
if Loc:ClipboardText=''
Loc:PopupText = '~Копировать|~Вырезать|~Вставить|~Удалить'
else
Loc:PopupText = '~Копировать|~Вырезать|Вставить|~Удалить'
.
else
if Loc:ClipboardText=''
Loc:PopupText = 'Копировать|Вырезать|~Вставить|Удалить'
else
Loc:PopupText = 'Копировать|Вырезать|Вставить|Удалить'
.
.
if Loc:FullText=''
Loc:PopupText = Loc:PopupText & '|-|~Очистить|~Выделить все'
else
Loc:PopupText = Loc:PopupText & '|-|Очистить|Выделить все'
.
setkeycode(0)
if Loc:FlagKbd=0
Loc:PopupChoice = PopUp(Loc:PopupText)
else
Loc:PopupChoice = PopUp(Loc:PopupText,Loc:X+loc:w/2,Loc:Y+Loc:h/2)
.
loc:ok=0
case Loc:PopupChoice
of 1 !копировать
setclipboard(clip(Loc:SelectedText))
Loc:Contr{prop:disable}=1
select(Loc:Contr)
Loc:Contr{prop:disable}=0
select(Loc:Contr,Loc:SelStart,Loc:SelEnd)
loc:ok=1
of 2 !вырезать
orof 4 !удалить
if Loc:PopupChoice=2
setclipboard(clip(Loc:SelectedText))
.
if Loc:SelStart <= 1
Loc:FullText = Loc:FullText[Loc:SelEnd + 1 : 1024]
else
Loc:FullText = Loc:FullText[1 : Loc:SelStart - 1] & Loc:FullText[Loc:SelEnd + 1 : 1024]
.
if Loc:Contr{PROP:READONLY}=False
change(Loc:Contr, clip(Loc:FullText))
Loc:Contr{prop:disable}=1
select(Loc:Contr)
Loc:Contr{prop:disable}=0
select(Loc:Contr,Loc:SelStart,0)
if instring('n',lower(Loc:Contr{PROP:Text}),1,1) !число
post(event:accepted,Loc:Contr)
else
Loc:Contr{prop:touched}=1
.
.
loc:ok=1
of 3 !вставить
if Loc:SelStart <= 1
if Loc:SelEnd=0
Loc:FullText = Loc:ClipboardText & Loc:FullText
else
Loc:FullText = Loc:ClipboardText & Loc:FullText[Loc:SelEnd + 1 : 1024]
.
else
if Loc:SelEnd=0
Loc:FullText = Loc:FullText[1 : Loc:SelStart - 1] & Loc:ClipboardText & Loc:FullText[Loc:SelStart : 1024]
else
Loc:FullText = Loc:FullText[1 : Loc:SelStart - 1] & Loc:ClipboardText & Loc:FullText[Loc:SelEnd + 1 : 1024]
.
.
if Loc:Contr{PROP:READONLY}=False
if instring('n',lower(Loc:Contr{PROP:Text}),1,1) !число
change(Loc:Contr, evaluate('deformat(format(''' & clip(FsStrNumDeformat(clipboard())) & ''',@' & Loc:Contr{PROP:Text} & '),@' & Loc:Contr{PROP:Text} & ')'))
post(event:accepted,Loc:Contr)
else
change(Loc:Contr, clip(Loc:FullText))
Loc:SelStart += len(clip(Loc:ClipboardText))
Loc:Contr{prop:disable}=1
select(Loc:Contr)
Loc:Contr{prop:disable}=0
select(Loc:Contr,Loc:SelStart,0)
Loc:Contr{prop:touched}=1
!post(event:accepted,Loc:Contr)
.
.
loc:ok=1
of 5 !очистить
if Loc:Contr{PROP:READONLY}=False
change(Loc:Contr, '')
if instring('n',lower(Loc:Contr{PROP:Text}),1,1) !число
post(event:accepted,Loc:Contr)
else
Loc:Contr{prop:touched}=1
.
.
loc:ok=1
of 6 !выделить все
Loc:Contr{PROP:SelStart} = Loc:SelStart
Loc:Contr{PROP:SelEnd} = len(clip(Loc:FullText))
loc:ok=1
else
Loc:Contr{prop:disable}=1
select(Loc:Contr)
Loc:Contr{prop:disable}=0
select(Loc:Contr,Loc:SelStart,Loc:SelEnd)
.
RETURN(Loc:Ok)
C6/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5109
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 11 раз
- Поблагодарили: 55 раз
Clipboard Copy/Past меню на TEXT-control
Вдогонку. В приведенном коде вызывается еще функция преобразования числа. Это, в основном, чтобы можно было вставлять числа из экселевских таблиц. Она так выглядит, может тоже пригодится.
Код: Выделить всё
FsStrNumDeformat FUNCTION (lop:str) ! Объявление процедуры
FilesOpened LONG
Loc:StrRet STRING(1024)
Loc:I LONG
Loc:FlagMinus BYTE
Loc:NumPoint LONG
CODE ! Начало исполняемого кода
!разделитель дробных разрядов всегда "." или ","
!разделитель триад может быть разным
loc:strRet=''
Loc:FlagMinus=0
Loc:NumPoint=0
loop loc:i=len(clip(lop:str)) to 1 by -1
if lop:str[loc:i]='.' or lop:str[loc:i]=','
Loc:NumPoint=loc:i
break
.
.
loop loc:i=1 to len(clip(lop:str))
if lop:str[loc:i]=' '
cycle
.
if lop:str[loc:i]='-'
if loc:strRet=''
Loc:FlagMinus=1
.
cycle
.
if lop:str[loc:i]='0'
if loc:strRet=''
cycle
.
.
if lop:str[loc:i]='.' or lop:str[loc:i]=','
if Loc:NumPoint<>loc:i
cycle
.
.
if lop:str[loc:i]<>'.' and lop:str[loc:i]<>','
if ~numeric(lop:str[loc:i])
cycle
.
.
if lop:str[loc:i]=','
loc:strRet=clip(loc:strRet) & '.' !изменяем разделитель дроби на стандартный
else
loc:strRet=clip(loc:strRet) & lop:str[loc:i]
.
.
if Loc:FlagMinus=1
loc:strRet='-' & loc:strRet
.
RETURN(Loc:StrRet)
C6/C11, ШВС, tps/btrieve.
- morkovin
- Ветеран
- Сообщения: 924
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 8 раз
- Поблагодарили: 3 раза
- Контактная информация:
Clipboard Copy/Past меню на TEXT-control
В том-то и дело, что в этой же проге в другом окне в ТЕХТ-поле всё именно так и работает!Игорь Столяров писал(а): ↑02 Апрель 2025, 11:43 ДД !
Эти шаблоны с длинными названиями были сделаны 20 лет назад для C5.
Зачем они сейчас ? Всё прекрасно работает со штатными шаблонами.
WBR, morkovin
- morkovin
- Ветеран
- Сообщения: 924
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 8 раз
- Поблагодарили: 3 раза
- Контактная информация:
Clipboard Copy/Past меню на TEXT-control
Да, действительно, это тянулось с прошлых версий. Удалил эти шаблоны и *.CLW, перегенерировал и т.д. Всё заработало!Игорь Столяров писал(а): ↑02 Апрель 2025, 11:43 Эти шаблоны с длинными названиями были сделаны 20 лет назад для C5.
Зачем они сейчас ? Всё прекрасно работает со штатными шаблонами.

WBR, morkovin