Clipboard Copy/Past меню на TEXT-control

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
morkovin
Ветеран
Сообщения: 924
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 8 раз
Поблагодарили: 3 раза
Контактная информация:

Clipboard Copy/Past меню на TEXT-control

Сообщение morkovin »

C11.
Долгое время использовал шаблоны 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.
Зачем они сейчас ? Всё прекрасно работает со штатными шаблонами.

1.jpg
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5109
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 55 раз

Clipboard Copy/Past меню на TEXT-control

Сообщение finsoftrz »

Это кому как. Даже у англоязычных периодически спрашивают, как заменить это безобразие на что-нибудь более адекватное. :lol:
По сабжу не помню точно, кажется, что-то правилось. У меня на text все работает.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5109
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 55 раз

Clipboard Copy/Past меню на TEXT-control

Сообщение finsoftrz »

А, сорри, у меня просто шаблон упомянутый зарегистрирован. А реально его не использую.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7891
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 89 раз

Clipboard Copy/Past меню на TEXT-control

Сообщение Игорь Столяров »

morkovin писал(а): 02 Апрель 2025, 6:47 что Popup-menu по RightClick не срабатывает на TEXT-control
finsoftrz писал(а): 02 Апрель 2025, 12:38 как заменить это безобразие
Это иное ! Я так понимаю, что это штатное меню WinAPI для работы с текстовым полем ...
Можно конечно перехватывать и подменять ... здесь главное, что бы потом не получилось как в первом сообщении этой темы. :D
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5109
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 55 раз

Clipboard Copy/Past меню на TEXT-control

Сообщение finsoftrz »

Шаблон просто старый, он не без проблем. Я сделал проще. Нарисовал небольшую функцию в стандартной библиотеке, которая автоматом цепляется ко всем app, а в шаблонах достаточно повесить alert на mouseright и 93 (специальная клавиша на клавиатуре для вызова контекстного меню) и в обработке события EVENT:AlertKey вставить код вида:

Код: Выделить всё

       if keycode() = MouseRight or keycode()=93
          if FsEntryPopUp()=1
             cycle
          end
       end
Сама функция FsEntryPopUp выглядит так.

Код: Выделить всё

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

Сообщение finsoftrz »

Вдогонку. В приведенном коде вызывается еще функция преобразования числа. Это, в основном, чтобы можно было вставлять числа из экселевских таблиц. Она так выглядит, может тоже пригодится.

Код: Выделить всё

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

Сообщение morkovin »

Игорь Столяров писал(а): 02 Апрель 2025, 11:43 ДД !

Эти шаблоны с длинными названиями были сделаны 20 лет назад для C5.
Зачем они сейчас ? Всё прекрасно работает со штатными шаблонами.
В том-то и дело, что в этой же проге в другом окне в ТЕХТ-поле всё именно так и работает!
WBR, morkovin
Аватара пользователя
morkovin
Ветеран
Сообщения: 924
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 8 раз
Поблагодарили: 3 раза
Контактная информация:

Clipboard Copy/Past меню на TEXT-control

Сообщение morkovin »

Игорь Столяров писал(а): 02 Апрель 2025, 11:43 Эти шаблоны с длинными названиями были сделаны 20 лет назад для C5.
Зачем они сейчас ? Всё прекрасно работает со штатными шаблонами.
Да, действительно, это тянулось с прошлых версий. Удалил эти шаблоны и *.CLW, перегенерировал и т.д. Всё заработало! :)
WBR, morkovin
Ответить