Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Получить выделенную область Таблицы (число прочтений - 2083 )
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Получить выделенную область Таблицы
26. Сентября 2018 :: 11:42
Печать  
Таблица.Защита(1);
Таблица.ТолькоПросмотр(1);

Как можно получить выделенную область?

Далее хочу устанавливать в буфер обмена

Процедура ПриНажатииКнопкиКлавиатуры(КонтекстФормы, КодКлавиши, ФлагAlt, ФлагShift, ФлагCtrl, СимволВФорматеASCII, ФлагСтандартнойОбработки)
     Если (ФлагCtrl = 1) И (ФлагAlt + ФлагShift = 0) Тогда
           Если КодКлавиши = 67 Тогда
                 БуферОбменаТекст = "ОК";
                 БуферОбмена = СоздатьОбъект("БуферОбмена");
                 БуферОбмена.Установить(БуферОбменаТекст);
           КонецЕсли;
     КонецЕсли;
КонецПроцедуры
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Получить выделенную область Таблицы
Ответ #1 - 26. Сентября 2018 :: 13:30
Печать  
Правильно ли использую TableDoc?
http://www.1cpp.ru/forum/YaBB.pl?num=1177688915/0


// ===============================
Процедура Сформировать()
...
     Т.Показать("Отчет","");
     ТабМенеджер.УстановитьТаблицу(Т);
...
КонецПроцедуры

// ===============================
Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, ФлагAlt, ФлагShift, ФлагCtrl)
     Если (ФлагCtrl = 1) И (ФлагAlt + ФлагShift = 0) Тогда
           Если КодКлавиши = 67 Тогда
                 БуферОбменаТекст = ТабМенеджер.ПолучитьВыделенные();
                 БуферОбмена = СоздатьОбъект("БуферОбмена");
                 БуферОбмена.Установить(БуферОбменаТекст);
           КонецЕсли;
     КонецЕсли;
КонецПроцедуры

// ===============================
Процедура ПриОткрытии()

     ИмяФ = "C:\1Cv77\Bin\TableDoc.dll";
     Если ФС.СуществуетФайл(ИмяФ) = 0 Тогда
           Предупреждение("Файл не найден: "+ИмяФ, 5);
           СтатусВозврата(0);
           Возврат;
     ИначеЕсли ЗагрузитьВнешнююКомпоненту(ИмяФ) = 1 Тогда
           ТабМенеджер = СоздатьОбъект("МенеджерТабличногоДокумента");
     Иначе
           Предупреждение("Ошибка загрузки "+ИмяФ, 5);                  
           СтатусВозврата(0);
           Возврат;
     КонецЕсли;
КонецПроцедуры


Выскакивает ошибка:
БуферОбмена.Установить(БуферОбменаТекст);
{Отчет.Продажи.Форма.Модуль(214)}: CClipboard::Set - должна быть передана строка
БуферОбменаТекст - значение ТаблицаЗначений

И подскажите где прочитать почему при активной форме таблицы не срабатывает Ctrl+C (ПриНажатииКнопкиКлавиатуры)?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Получить выделенную область Таблицы
Ответ #2 - 27. Сентября 2018 :: 07:49
Печать  
ПриНажатииКнопкиКлавиатуры что за событие?
формекс?
оно срабатывает только в активной форме
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Получить выделенную область Таблицы
Ответ #3 - 27. Сентября 2018 :: 07:59
Печать  
Чтобы ловить события в таблице нужно использовать события менеджера ПриНажатииКлавиши.

Процедура МенеджерТаблДокПриНажатииКлавиши(Менеджер, ВиртКод, Данные, Клавиатура, ФСО, Таб)
     
     Если Клавиатура.ПолучитьСостояниеКлавиши(Клавиатура.VK_CONTROL) = 1 Тогда
           
           Если ВиртКод = 67 Тогда

           КонецЕсли;

     КонецЕсли;
     
КонецПроцедуры
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Получить выделенную область Таблицы
Ответ #4 - 27. Сентября 2018 :: 08:07
Печать  
пример

Перем мМенеджер;

//*******************************************
Процедура МенеджерТаблДокПриНажатииКлавиши(Менеджер, ВиртКод, Данные, Клавиатура, ФСО, Таб)
     
     Если Клавиатура.ПолучитьСостояниеКлавиши(Клавиатура.VK_CONTROL) = 1 Тогда
           Сообщить(ВиртКод);
     КонецЕсли;
     
КонецПроцедуры


//*******************************************
Процедура ПриОткрытии()
     
     Таб = СоздатьОбъект("Таблица");
     Таб.Показать();
     
     мМенеджер = СоздатьОбъект("МенеджерТабличногоДокумента");
     мМенеджер.УстановитьТаблицу(Таб, Форма);
     
КонецПроцедуры

  

1&&2&&3
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Получить выделенную область Таблицы
Ответ #5 - 27. Сентября 2018 :: 11:29
Печать  
Спасибо Вам за разработку и объяснения. Все работает.

Сделал перебор выбранных ячеек. Можно ли как-то по другому скопировать выделенную область?

// ===============================
// TableDoc, менеджер табличного документа
Процедура МенеджерТаблДокПриНажатииКлавиши(Менеджер, ВиртКод, Данные, Клавиатура, ФСО, Таб)

     Если Клавиатура.ПолучитьСостояниеКлавиши(Клавиатура.VK_CONTROL) = 1 Тогда
           Если ВиртКод = 67 Тогда // ctrl+c
                 ВыделеннаяТЗ = ТабМенеджер.ПолучитьВыделенные();
                 R1 = Число(ВыделеннаяТЗ.ПолучитьЗначение(1,"R1"));
                 C1 = Число(ВыделеннаяТЗ.ПолучитьЗначение(1,"C1"));
                 R2 = Число(ВыделеннаяТЗ.ПолучитьЗначение(1,"R2"));
                 C2 = Число(ВыделеннаяТЗ.ПолучитьЗначение(1,"C2"));
                 
                 БуферОбменаТекст = "";
                 Стр = R1;
                 Пока  Стр <= R2 Цикл // строки
                       Кол = C1;
                       Пока Кол <= C2 Цикл // колонки
                             БуферОбменаТекст = БуферОбменаТекст + Т.Область("R"+Стр+"C"+Кол+":"+"R"+Стр+"C"+Кол).Текст + СимволТабуляции;
                             Кол = Кол + 1;
                       КонецЦикла;
                       Стр = Стр + 1;
                       БуферОбменаТекст = БуферОбменаТекст + РазделительСтрок;
                 КонецЦикла;
                 
                 БуферОбмена = СоздатьОбъект("БуферОбмена");
                 БуферОбмена.Установить(БуферОбменаТекст);
                 
           КонецЕсли;
     КонецЕсли;
     
КонецПроцедуры
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Получить выделенную область Таблицы
Ответ #6 - 01. Октября 2018 :: 07:12
Печать  
Скопированная область и так в буфере в виде текста.
  

1&&2&&3
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Получить выделенную область Таблицы
Ответ #7 - 02. Октября 2018 :: 08:13
Печать  
в буфере обмена нет выделенной информации т.к.
пользователю запрещено редактирование печатной формы
Таблица.Защита(1);
Таблица.ТолькоПросмотр(1);

но копирование по Ctrl+C я хочу разрешить.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Получить выделенную область Таблицы
Ответ #8 - 03. Октября 2018 :: 12:25
Печать  
ок
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Получить выделенную область Таблицы
Ответ #9 - 03. Октября 2018 :: 12:30
Печать  
Если принимающая сторона таже 1ска:
ВыделеннаяТЗ = ТабМенеджер.ПолучитьВыделенные();
БуферОбменаТекст = ЗначениеВСтрокуВнутр(ВыделеннаяТЗ);
БуферОбмена = СоздатьОбъект("БуферОбмена");
БуферОбмена.Установить(БуферОбменаТекст);

на принимающей стороне обратно через ЗначениеИзСтрокиВнутр
  

1&&2&&3
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Получить выделенную область Таблицы
Ответ #10 - 04. Октября 2018 :: 06:50
Печать  
ТабМенеджер.ПолучитьВыделенные() получает ТЗ с данными по выделению.
Вот пример:
Номер R1 C1 R2 C2 ТипОбласти Верх Лево Низ Право
1 9 1 13 4 3 9 1 13 4

Принимающая сторона это мессенджер или Excel.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать