|
v7: Табличное поле: Как ячейку авт. поставить в режим редактирования? | ☑ | ||
---|---|---|---|---|
0
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); ТП.Колонки.Добавить("НомерТТН").Данные = "НомерТТН"; ТП.Колонки.Получить("НомерТТН").Заголовок = "Номер ТТН"; ТП.Колонки.Добавить("ДатаРейса").Данные = "ДатаРейса"; ТП.Колонки.Получить("ДатаРейса").Заголовок = "Дата рейса"; ТП.Колонки.Добавить("Кол_АМ").Данные = "Кол_АМ"; ТП.Колонки.Получить("Кол_АМ").Заголовок = "Кол а/м"; ТаблПоле_ПриАктивизацииКолонки(ТП); ТП.ОбновитьСтроки(); КонецПроцедуры //====================================================================== Процедура ПриОткрытии() _Форма=СоздатьОбъект("Форма"); _Форма.УстановитьФорму(Форма); КонецПроцедуры // ПриОткрытии |
|||
1
Zhuravlik
24.01.13
✎
13:36
|
+ Не могу найти в описании метод, чтобы выполнить выбор текущей ячейки...
|
|||
2
Ёпрст
24.01.13
✎
13:44
|
ntreofzrjkjyrf/ntreofzcnhjrf
|
|||
3
Zhuravlik
24.01.13
✎
13:45
|
Уже разобрался))
гСервис.ЭмулироватьКлавиатуру("{ENTER}"); |
|||
4
Zhuravlik
24.01.13
✎
13:46
|
(2) текущаяколонка.текущаястрока ? Это надо прожевать...
|
|||
5
Zhuravlik
24.01.13
✎
13:48
|
(2) В смысле устанваливать текущую строку и текущую колонку? Это я и так делаю, проблема в том, чтобы ячейку "Выбрать". Вот догнал - эмулирую нажатие ентера, но подозреваю что это не совсем хорошо, если можно лучше - подскажите пожалуйста?
|
|||
6
antoneus
24.01.13
✎
14:17
|
Ну и вызывай метод РедактироватьЗначение, подсовывай ему следующую колонку после того как завершишь редактирование в текущей ячейке.
|
|||
7
Zhuravlik
24.01.13
✎
14:28
|
(6) Я так делал, в комментарии забыл сказать. Происходит то же самое, как и при вызове процедуры "Выбор":
//1. ячейка становится как-бы выбранной, но не активной (курсора в ней нет) //2. При закрытии окна обработки 1С чуть приторомаживает и вылетает безо всяких ошибок. Можно еще вопрос? Я читал на форуме, что вроде есть событие "ПриОтменеРедактирования()", но описал в модуле, а реакции нет... В документации описание отсутствует, есть такое событие или нет? |
|||
8
Mikeware
24.01.13
✎
14:31
|
(7) как описал в модуле?
|
|||
9
antoneus
24.01.13
✎
14:34
|
ПриОтменеРедактированияЗначения
Синтаксис: ПриОтменеРедактированияЗначения(ТабличноеПоле, стр, кол, рег) Назначение: - Завершает отмену ввода значения Параметры: стр, кол, рег: строка, колонка, регион - координаты окна |
|||
10
antoneus
24.01.13
✎
14:35
|
(7) >как-бы выбранной, но не активной (курсора в ней нет)
тут недопонял |
|||
11
Zhuravlik
24.01.13
✎
14:42
|
(10) Т.е. она становится "беленькой", но курсора в ней не стоит. Когда я ставлю в нее курсор, все-равно вводить значение не получается, надо выделить пустую область, и вот тогда можно что-нибудь вбить. Это если я вызываю РедактироватьЗначениеТП(стр) в процедуре "ПриРедактированииЗначения" (в коде (0)). А потом 1С вылетает.
(8) Описал неправильно, ПриОтменеРедактирования(), надо было ПриОтменеРедактированияЗначения(), но в доках не нашел. (9) Спасибо) |
|||
12
Zhuravlik
24.01.13
✎
14:51
|
+ В принципе обойдусь ЭмулироватьКлавиатуру(), вроде полчаса - полет нормальный) ни глюка, ни вылета. 1С++ рулит)
Спасибо всем за поддержку. |
|||
13
varelchik
24.01.13
✎
19:00
|
А ты еще список редактируемых колонок используй.
и походу иди по нем определяя где находишься. Причем для полей с типом Справочник,Документ,Перечисление еще можно эмулировать F4 если значение не вырано, тогда полностью получаеться эмуляция работы с Табличной часть документа. |
|||
14
ADirks
25.01.13
✎
07:45
|
ну вот так всё работает, например
Процедура тпТЧПослеРедактированияЗначения(Источник, нСтрТП, КолонкаТП, ТипРегиона) ИмяКолТП = КолонкаТП.Имя; тпТЧ_тзДанные.ПолучитьСтрокуПоНомеру(нСтрТП); Если ИмяКолТП = "Материал" Тогда Если тпТЧ_тзДанные.КоличествоШтук = 0 Тогда кол = тпТЧ.Колонки.КоличествоШтук; тпТЧ.ТекущаяКолонка = кол; тпТЧВыбор(Источник, нСтрТП, кол, ТипРегиона); КонецЕсли; КонецЕсли; КонецПроцедуры |
|||
15
ADirks
25.01.13
✎
07:49
|
Ну и цитата из описалова, на всякий
РедактироватьЗначение(стр, кол, рег, знач, длина, точность, идентификатор, флаги) - Открывает окно для редактирования значения по заданным координатам. Параметры: стр, кол, рег: строка, колонка, регион - координаты окна знач: значение, определяет тип контрола и начальные данные длина: доп. характеристика типа для чисел и строк точность: доп. характеристика типа для чисел идентификатор: идентификатор элемента управления (может быть пустым) флаги: параметры создаваемого контрола; могут задаваться числом и строкой, в том числе шестнадцатиричной (с префиксом 0x) ЗавершитьРедактированиеЗначения() - Завершает редактирование с вызовом события - Возвращает флаг успешности операции (1 или 0) ОтменитьРедактированиеЗначения() - Отменяет редактирование без вызова события - Возвращает флаг успешности операции (пока всегда 1) --> События ТП: ПриРедактированииЗначения(стр, кол, рег, знач, фсо) - Завершает успешный ввод значения Параметры: стр, кол, рег: строка, колонка, регион - координаты окна знач: введенное значение фсо: флаг стандартной обработки ПриОтменеРедактированияЗначения(стр, кол, рег) - Завершает отмену ввода значения Параметры: стр, кол, рег: строка, колонка, регион - координаты окна ПослеРедактированияЗначения(стр, кол, рег) - Вызывается после успешного ввода значения (и отработки события ПриРедактированииЗначения) - Событие может быть использовано для запуска нового редактирования значения Параметры: стр, кол, рег: строка, колонка, регион - координаты окна завершенного редактирования Флаги: dpDoNotTab 0x00000004 // пропускать при вводе dpQuickChoice 0x00000008 // быстрый выбор dpUseHelpString 0x00000010 // использовать описание (в качестве подсказки) dpHasButton 0x00000020 // имеет кнопку выбора dpDisableAutoChoice 0x00000200 // автовыбор выкл dpUndefined 0x00100000 // неопределенный тип (тип может быть назначен) |
|||
16
Zhuravlik
25.01.13
✎
12:23
|
(13) Текущую колонку я определяю так (это из демо-примера):
Процедура ТаблПоле_ПриАктивизацииКолонки(ТП) Если ПустоеЗначение(ТекКолонка)=0 Тогда ТекКолонка.ЦветФона=-1; КонецЕсли; ТП.ТекущаяКолонка.ЦветФона=гд_ПолучитьЦвет(231, 234, 254); ТекКолонка=ТП.ТекущаяКолонка; КонецПроцедуры (14)(15) "ПослеРедактированияЗначения(стр, кол, рег)" - Не знал, спасибо) |
|||
17
ADirks
25.01.13
✎
12:32
|
Зачем определять тек.колонку, когда она тебе в событие передаётся? Ну или ТЧ.ТекущаяКолонка, если нет такого параметра.
|
|||
18
Zhuravlik
25.01.13
✎
13:18
|
(17) Это понятно, но если я уже пользуюсь (для смены фона) этой процедурой, почему бы ее и не юзать? Мне кажется так и код читабельней.
|
|||
19
ADirks
25.01.13
✎
13:27
|
Это тебе кажется. А на самом деле это источник труднообнаружимых ошибок.
|
|||
20
Zhuravlik
25.01.13
✎
15:34
|
(19) Понял, перепишу.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |