Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Табличное поле: Как ячейку авт. поставить в режим редактирования?

v7: Табличное поле: Как ячейку авт. поставить в режим редактирования?
Я
   Zhuravlik
 
24.01.13 - 13:26
Добрый день. Пишу небольшую обработку для ввода значений, пользую ТП. Хочу сделать нечто похожее на редактирование строки документа (т.е. после окончания редактирования текущей ячейки нужно сделать текущую в той-же строке, в след. колонке, и открыть ее для редактирования). Не пойму как ее "Выбрать", чтобы сработала процедура "Выбор".  Вот код:


//ОКНО ОТКРЫВАЕТСЯ МОДАЛЬНО
 
Перем ТекКолонка, ТП, тзРедактор;

 //======================================================================
 
Процедура ПриОтжатииКнопкиКлавиатуры(Код, Альт, Шифт, Кнтрл, Сим, ФСО)
    
    Если Код = 45 Тогда
        тзРедактор.НоваяСтрока();        
        ТП.ОбновитьСтроки();        
    ИначеЕсли Код = 46 Тогда
        нс = ТП.ТекущаяСтрока;        
        Если Число(нс) > 0 Тогда            
            тзРедактор.УдалитьСтроку(нс);
            ТП.ОбновитьСтроки();                        
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры// ПриОтжатиКнопкиКлавиатуры
 

 //====================================================
 
Процедура ТаблПоле_ПриАктивизацииКолонки(ТП)
    Если ПустоеЗначение(ТекКолонка)=0 Тогда
        ТекКолонка.ЦветФона=-1;
    КонецЕсли;
    ТП.ТекущаяКолонка.ЦветФона=гд_ПолучитьЦвет(231, 234, 254);
    ТекКолонка=ТП.ТекущаяКолонка;
КонецПроцедуры

 //======================================================================
 
Процедура РедактироватьЗначениеТП(нс)
    Перем зн;
    
    зн = тзРедактор.ПолучитьЗначение(нс, ТекКолонка.Данные);
    
    Длина = 0; Точность = 0; Идент = 0;
    тзРедактор.ПолучитьПараметрыКолонки(ТекКолонка.Данные, ,Длина, Точность, Идент);

    ТП.РедактироватьЗначение(
                            нс,
                            ТекКолонка,
                           3,
                           зн,
                            Длина,
                            Точность,
                            Идент,
                            "");    
КонецПроцедуры// РедактироватьЗначениеТП
 

 //======================================================================
 
Процедура ТаблПоле_Выбор(ТП, нс, Колонка, ТипРегиона)
    Перем зн;
    
    Если ТипРегиона <> 3 Тогда
        Возврат;
    КонецЕсли;

    РедактироватьЗначениеТП(нс);
КонецПроцедуры// ТаблПоле_ПриАктивизацииЯчейки
 

 //======================================================================
 
Процедура ТаблПоле_ПриРедактированииЗначения(ТП, стр, кол, рег, зн)
    тзРедактор.УстановитьЗначение(стр, кол.Данные, зн);
    ТП.ОбновитьСтроки();
    
    нк = ТП.Колонки.Индекс(кол);
    Если нк < 2 Тогда
 //Вот здесь перехожу к следующей колонке (их всего 3, проверяю по индексу колонки ТП)
 
        ТП.ТекущаяКолонка = ТП.Колонки.Получить(нк + 1);
        ТаблПоле_ПриАктивизацииКолонки(ТП);
        РедактироватьЗначениеТП(стр);
 //Я так понимаю, что здесь нужно программно нажать "Enter" на текущей ячейке, чтобы сработала процедура
 
//ТаблПоле_Выбор(). Если же я тупо ставлю эту процедуру вот так:
 //ТаблПоле_Выбор(ТП, стр, ТекКолонка, 3) - то происходит следующее:
 
//1. ячейка становится как-бы выбранной, но не активной (курсора в ней нет)
 //2. При закрытии окна обработки 1С чуть приторомаживает и вылетает безо всяких ошибок.
 
    КонецЕсли;
    
КонецПроцедуры// ТаблПоле_ПриРедактированииЗначения(стр, кол, рег, знач)
 




Процедура ФормаПриСоздании(_Форма)

    тзРедактор = СоздатьОбъект("ТаблицаЗначений");
    тзРедактор.НоваяКолонка("НомерТТН", "Строка", "6");
    тзРедактор.НоваяКолонка("ДатаРейса", "Дата");
    тзРедактор.НоваяКолонка("Кол_АМ", "Число", 2, 0);

    ТП=_Форма.СоздатьЭлементУправления("ТабличноеПоле", Форма.ТаблПоле_);
    ТП.ПоставщикДанных=СоздатьОбъект("ПоставщикДанныхТЗ");
    ТП.ПоставщикДанных.УстТаблицуЗначений(тзРедактор);

    ТП.СтильЗаголовков = 1;
    ТП.РежимВыделенияСтроки = 2;
    ТП.ЦветФонаВыделения2 = гд_ПолучитьЦвет(231, 234, 254);
    ТП.Колонки.Добавить("НомерТТН").Данные = "НомерТТН";
    ТП.Колонки.Получить("НомерТТН").Заголовок = "Номер ТТН";

    ТП.Колонки.Добавить("ДатаРейса").Данные = "ДатаРейса";
    ТП.Колонки.Получить("ДатаРейса").Заголовок = "Дата рейса";

    ТП.Колонки.Добавить("Кол_АМ").Данные = "Кол_АМ";
    ТП.Колонки.Получить("Кол_АМ").Заголовок = "Кол а/м";    
    
    ТаблПоле_ПриАктивизацииКолонки(ТП);
    ТП.ОбновитьСтроки();    
    
КонецПроцедуры

 //======================================================================
 
Процедура ПриОткрытии()
    _Форма=СоздатьОбъект("Форма");
    _Форма.УстановитьФорму(Форма);
КонецПроцедуры// ПриОткрытии
 
 
   Zhuravlik
 
1 - 24.01.13 - 13:36
+ Не могу найти в описании метод, чтобы выполнить выбор текущей ячейки...
   Ёпрст
 
2 - 24.01.13 - 13:44
ntreofzrjkjyrf/ntreofzcnhjrf
   Zhuravlik
 
3 - 24.01.13 - 13:45
Уже разобрался)) 
гСервис.ЭмулироватьКлавиатуру("{ENTER}");
   Zhuravlik
 
4 - 24.01.13 - 13:46
(2) текущаяколонка.текущаястрока ? Это надо прожевать...
   Zhuravlik
 
5 - 24.01.13 - 13:48
(2) В смысле устанваливать текущую строку  и текущую колонку? Это я и так делаю, проблема в том, чтобы ячейку "Выбрать". Вот догнал - эмулирую нажатие ентера, но подозреваю что это не совсем хорошо, если можно лучше - подскажите пожалуйста?
   antoneus
 
6 - 24.01.13 - 14:17
Ну и вызывай метод РедактироватьЗначение, подсовывай ему следующую колонку после того как завершишь редактирование в текущей ячейке.
   Zhuravlik
 
7 - 24.01.13 - 14:28
(6) Я так делал, в комментарии забыл сказать. Происходит то же самое, как и при вызове процедуры "Выбор":


//1. ячейка становится как-бы выбранной, но не активной (курсора в ней нет)
 
 
 //2. При закрытии окна обработки 1С чуть приторомаживает и вылетает безо всяких ошибок.
 

Можно еще вопрос? Я читал на форуме, что вроде есть событие "ПриОтменеРедактирования()", но описал в модуле, а реакции нет... В документации описание отсутствует, есть такое событие или нет?
   Mikeware
 
8 - 24.01.13 - 14:31
(7) как описал в модуле?
   antoneus
 
9 - 24.01.13 - 14:34
ПриОтменеРедактированияЗначения
Синтаксис:
ПриОтменеРедактированияЗначения(ТабличноеПоле, стр, кол, рег)
Назначение:
- Завершает отмену ввода значения
Параметры:
стр, кол, рег: строка, колонка, регион - координаты окна
   antoneus
 
10 - 24.01.13 - 14:35
(7) >как-бы выбранной, но не активной (курсора в ней нет)

тут недопонял
 
 Рекламное место пустует
   Zhuravlik
 
11 - 24.01.13 - 14:42
(10) Т.е. она становится "беленькой", но курсора в ней не стоит. Когда я ставлю в нее курсор, все-равно вводить значение не получается, надо выделить пустую область, и вот тогда можно что-нибудь вбить. Это если я вызываю РедактироватьЗначениеТП(стр) в процедуре "ПриРедактированииЗначения" (в коде (0)). А потом 1С вылетает.
(8) Описал неправильно, ПриОтменеРедактирования(), надо было ПриОтменеРедактированияЗначения(), но в доках не нашел.
(9) Спасибо)
   Zhuravlik
 
12 - 24.01.13 - 14:51
+ В принципе обойдусь ЭмулироватьКлавиатуру(), вроде полчаса - полет нормальный) ни глюка, ни вылета. 1С++ рулит)
Спасибо всем за поддержку.
   varelchik
 
13 - 24.01.13 - 19:00
А ты еще список редактируемых колонок используй.
и походу иди по нем определяя где находишься.
Причем для полей с типом Справочник,Документ,Перечисление еще можно эмулировать F4 если значение не вырано, тогда полностью получаеться эмуляция работы с Табличной часть документа.
   ADirks
 
14 - 25.01.13 - 07:45
ну вот так всё работает, например

Процедура тпТЧПослеРедактированияЗначения(Источник, нСтрТП, КолонкаТП, ТипРегиона)
    ИмяКолТП = КолонкаТП.Имя;
    тпТЧ_тзДанные.ПолучитьСтрокуПоНомеру(нСтрТП);
    Если ИмяКолТП = "Материал" Тогда
        Если тпТЧ_тзДанные.КоличествоШтук = 0 Тогда
            кол = тпТЧ.Колонки.КоличествоШтук;
            тпТЧ.ТекущаяКолонка = кол;
            тпТЧВыбор(Источник, нСтрТП, кол, ТипРегиона);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
   ADirks
 
15 - 25.01.13 - 07:49
Ну и цитата из описалова, на всякий

РедактироватьЗначение(стр, кол, рег, знач, длина, точность, идентификатор, флаги)

- Открывает окно для редактирования значения по заданным координатам.

Параметры:
стр, кол, рег: строка, колонка, регион - координаты окна
знач: значение, определяет тип контрола и начальные данные
длина: доп. характеристика типа для чисел и строк
точность: доп. характеристика типа для чисел
идентификатор: идентификатор элемента управления (может быть пустым)
флаги: параметры создаваемого контрола; могут задаваться числом и строкой, в том числе шестнадцатиричной (с префиксом 0x)

ЗавершитьРедактированиеЗначения()

- Завершает редактирование с вызовом события
- Возвращает флаг успешности операции (1 или 0)

ОтменитьРедактированиеЗначения()

- Отменяет редактирование без вызова события
- Возвращает флаг успешности операции (пока всегда 1)

--> События ТП:
ПриРедактированииЗначения(стр, кол, рег, знач, фсо)

- Завершает успешный ввод значения

Параметры:
стр, кол, рег: строка, колонка, регион - координаты окна
знач: введенное значение
фсо: флаг стандартной обработки

ПриОтменеРедактированияЗначения(стр, кол, рег)

- Завершает отмену ввода значения

Параметры:
стр, кол, рег: строка, колонка, регион - координаты окна
ПослеРедактированияЗначения(стр, кол, рег)

- Вызывается после успешного ввода значения (и отработки события ПриРедактированииЗначения)
- Событие может быть использовано для запуска нового редактирования значения

Параметры:
стр, кол, рег: строка, колонка, регион - координаты окна завершенного редактирования


Флаги:
dpDoNotTab     0x00000004    // пропускать при вводе
 
dpQuickChoice     0x00000008    // быстрый выбор
 
dpUseHelpString     0x00000010    // использовать описание (в качестве подсказки)
 
dpHasButton     0x00000020    // имеет кнопку выбора
 
dpDisableAutoChoice     0x00000200    // автовыбор выкл
 
dpUndefined     0x00100000    // неопределенный тип (тип может быть назначен)
   Zhuravlik
 
16 - 25.01.13 - 12:23
(13) Текущую колонку я определяю так (это из демо-примера):

Процедура ТаблПоле_ПриАктивизацииКолонки(ТП)
    Если ПустоеЗначение(ТекКолонка)=0 Тогда
        ТекКолонка.ЦветФона=-1;
    КонецЕсли;
    ТП.ТекущаяКолонка.ЦветФона=гд_ПолучитьЦвет(231, 234, 254);
    ТекКолонка=ТП.ТекущаяКолонка;
КонецПроцедуры

(14)(15) "ПослеРедактированияЗначения(стр, кол, рег)" -  Не знал, спасибо)
   ADirks
 
17 - 25.01.13 - 12:32
Зачем определять тек.колонку, когда она тебе в событие передаётся? Ну или ТЧ.ТекущаяКолонка, если нет такого параметра.
   Zhuravlik
 
18 - 25.01.13 - 13:18
(17) Это понятно, но если я уже пользуюсь (для смены фона) этой процедурой, почему бы ее и не юзать? Мне кажется так и код читабельней.
   ADirks
 
19 - 25.01.13 - 13:27
Это тебе кажется. А на самом деле это источник труднообнаружимых ошибок.
   Zhuravlik
 
20 - 25.01.13 - 15:34
(19) Понял, перепишу.

Список тем форума
Рекламное место пустует  Рекламное место пустует
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Э. Йодан
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует