|
v7: Как обновлять ТабличноеПоле + ПоставщикДанныхИТ (1С++) | ☑ | ||
---|---|---|---|---|
0
zelenprog
09.07.24
✎
13:53
|
Здравствуйте!
Подскажите, как правильно обновить ТП (ТабличноеПоле)? Есть ТП + ПоставщикДанныхИТ + ИТ (ИндексированнаяТаблица). В цикле в ИТ добавляются строки. Нужно сделать, чтобы после добавления каждой новой строки в ИТ, ТП обновилось и показало эту последнюю строку. Какие методы каких объектов для этого нужно вызвать? Сейчас у меня сделано просто вот так:
Вроде работает, но интерфейс сильно "дергается" при этом. Можно ли это сделать как-то по другому, чтобы было меньше "дерганий"? |
|||
1
trad
09.07.24
✎
11:41
|
зачем обновлять "после добавления каждой новой строки"?
|
|||
2
zelenprog
09.07.24
✎
11:42
|
(1) Мне нужно, чтобы именно в цикле при добавлении каждой новой строки это отображалось пользователю.
То есть чтобы пользователь видел как "растет" табличка. Но без лишних мельканий. Сейчас это очень сильно мелькает. |
|||
3
trad
09.07.24
✎
11:42
|
попробуй ПерерисоватьСтроки()
|
|||
4
Злопчинский
09.07.24
✎
11:58
|
(2) ну нарисуй прогресс-бар. Будет видно как идет процесс. В формексе для прогрессбара появился спецметод.
|
|||
5
zelenprog
09.07.24
✎
12:04
|
(3) А в чем разница "ОбновитьСтроки" и "ПерерисоватьСтроки"?
Кстати, экспериментируя, я выяснил что если убрать строку "мТабличноеПоле.ВертСкроллер = 1;" то мельканий становится меньше. |
|||
6
zelenprog
09.07.24
✎
12:07
|
(4) Это уже не то.
Задумка была такая, что в строках выводится нужная информация по обработанному объекту: - обработали объект - добавили в таблицу строку - заполнили нужной для пользователя информацией. И пользователь сидит и видит подробную информацию о ходе обработки. |
|||
7
trad
09.07.24
✎
12:24
|
(5) >> А в чем разница "ОбновитьСтроки" и "ПерерисоватьСтроки"?
Кратко в документации написано, подробно - в исходниках |
|||
8
Злопчинский
09.07.24
✎
12:26
|
(6) имитация бурной деятельности пользователем?
|
|||
9
trad
09.07.24
✎
12:44
|
Собрал тестовый пример (с чего собственно нужно было начать тебе) - ничего не мелькает.
Отсекай все лишнее. Ищи что приводит к мельканию. Во-первых проверь ПриВыводеСтроки, ПриАктивизацииСтроки |
|||
10
trad
09.07.24
✎
12:42
|
(8) почему?..
Вполне бывает нужно видеть ход какого-то процесса с выводом информации (логирование) с автоскролом |
|||
11
Злопчинский
09.07.24
✎
12:57
|
(10) сомневаюсь, что это такой случай.
Скорее просто "для красоты", сам иногда так делаю ;-) |
|||
12
zelenprog
09.07.24
✎
13:26
|
(9) >> Отсекай все лишнее.... Во-первых проверь ПриВыводеСтроки, ПриАктивизацииСтроки
Да вроде нету у меня ничего лишнего. Код примерно такой как в (0). То есть просто цикл и в цикле добавление строки. Есть обработчики событий "ПриНачалеВыбораЗначения", "ПриИзмененииРазмераОкна". Они не срабатывают при заполнении таблицы. Других событий нет. >> Собрал тестовый пример ... ничего не мелькает. А ты пробовал с включенной полосой прокрутки? "мТабличноеПоле.ВертСкроллер = 1;" |
|||
13
zelenprog
09.07.24
✎
13:51
|
(7) >> >> А в чем разница "ОбновитьСтроки" и "ПерерисоватьСтроки"?
>> Кратко в документации написано, подробно - в исходниках Где взять исходники? |
|||
14
zelenprog
09.07.24
✎
14:43
|
(13)+ В документации написано:
Синтаксис: ОбновитьСтроки()
Описание: перечитать строки, отображаемые в данный момент в табличном поле. Табличное поле будет стараться сохранить текущую строку. ПерерисоватьСтроки / RedrawRows Синтаксис: ПерерисоватьСтроки() Описание: Обновить строки, отображаемые в данный момент в табличном поле, без обращения к провайдеру. Из этого описания следует, что метод "ПерерисоватьСтроки" не подходит при добавлении в ИТ новой строки. Он не сможет корректно отобразить изменения в ТП без обращения к провайдеру. Так как про новую добавленную строку "знает" только провайдер. Хотя вопрос про взаимодействие провайдера и ТП интересно. В какой момент ТП запрашивает данные у провайдера? Только при вызове "ОбновитьСтроки"? |
|||
15
trad
09.07.24
✎
14:39
|
(14) отлично. Значит не подходит
|
|||
16
trad
09.07.24
✎
14:40
|
(12) полоса есть, не выключал
|
|||
17
zelenprog
09.07.24
✎
15:43
|
(15) >> ... Значит не подходит
Из любопытства проверил - работает!!! Либо описание метода неверно, либо реализация не соответствует описанию. Действительно без исходников не разобраться. Все-таки где их взять? На 1cpp.ru - не нашел. |
|||
18
zelenprog
09.07.24
✎
15:42
|
И еще второй вопрос.
Если в ИТДанные меняется какое-то значение в конкретной колонке в конкретной строке. Как сделать, чтобы это изменение сразу отобразилось в ТабличномПоле в соответствующей ячейке с минимальной перерисовкой интерфейса? То есть нужно обновить только эту ячейку, всю ТП обновлять не надо. Если обновлять всю ТП - опять получим "мельканья". |
|||
19
trad
09.07.24
✎
15:48
|
(18) нет такой возможности. Самый "щадящий" метод ПерерисоватьСтроки
|
|||
20
trad
09.07.24
✎
15:55
|
||||
21
zelenprog
09.07.24
✎
16:00
|
(20) нет, не мелькает
|
|||
22
trad
09.07.24
✎
16:07
|
значит все же есть что-то "лишнее"
|
|||
23
zelenprog
09.07.24
✎
16:25
|
(22) Согласен.
Только не могу понять, что мешает. Думал может быть привязка границ приводит к лишним перерисовкам? У меня привязка делается классом "Общие.Форма.Привязка2". Убрал эту привязку - все равно мелькает. Причем мелькает при включенном скроллере: "ВертСкроллер = 1". Если сделать "ВертСкроллер = 0" - не мелькает. Похоже, что как будто каждый раз при добавлении новой строки в ИТ, текущая строка Табличного поля прыгает в начало. |
|||
24
zelenprog
09.07.24
✎
16:55
|
У тебя какая версия TableDoc.dll?
У меня 0.1.1.47. Может быть в этом дело? |
|||
25
trad
09.07.24
✎
18:14
|
Табледок то тут причем?
У тебя есть два образца для исследования. С проблемой и без. Какая сложность выявить зависимость? |
|||
26
zelenprog
10.07.24
✎
08:41
|
Понял, в чем дело.
Мелькание есть и в твоем тесте. Просто в твоем тесте оно не заметно, потому что окошко в высоту слишком маленькое. Прикладываю твой тест чуть переделанный: сделал окошко побольше и добавил задержку между выводом строк. Теперь мелькание очень даже заметно. Мелькание происходит пока не заполнена вся видимая часть таблицы при включенном вертикальном скроллбаре. https://dropmefiles.com/BSxAn При выключенном вертскроллере мелькание отсутствует. |
|||
27
trad
10.07.24
✎
08:54
|
да, есть мелькание
Выход - оставлять полоску в авторежиме |
|||
28
zelenprog
10.07.24
✎
08:56
|
А насчет исходников можешь помочь?
Все-таки интересно посмотреть как реализованы "ОбновитьСтроки", "ПерерисоватьСтроки". |
|||
29
trad
10.07.24
✎
09:02
|
У меня, скорее всего, не самые последние, но, касательно твоего вопроса, актуальные
https://www.dropbox.com/scl/fi/znuh9q8prji5vyfr8gqh6/icpp.zip?rlkey=ldet9l0t18qfkpujpqbkki00g&dl=0 |
|||
30
trad
10.07.24
✎
09:14
|
||||
31
victuan1
11.07.24
✎
07:21
|
А есть метод, который позволяет позиционироваться на выбранную строку тп? или хотя бы на первую строку?
А то иной раз при изменении данных в тп, часть верхних строк после обновления данных в ПД в тп загружаются, но оказываются за пределами видимости. Например, в тп стало 30 строк, но видны с 18-ой по 30-ую. Первые 17 строк за пределами видимости, приходится пролистывать пользователю тп. |
|||
32
zelenprog
11.07.24
✎
08:34
|
(31) Дык выше в примерах есть пример позиционирования: " мТабличноеПоле.ТекущаяСтрока = ИТДанные.КоличествоСтрок();"
|
|||
33
victuan1
11.07.24
✎
14:18
|
(32) Этот пример не работает, делаю так:
мТабличноеПоле.ТекущаяСтрока = 1; мТабличноеПоле.ОбновитьСтроки(); И всё равно верхняя строка на форме - 18-я. Чтобы увидеть первую, приходится перелистывать тп. |
|||
34
victuan1
11.07.24
✎
15:04
|
(33) Оно и не должно работать, т.к. фильтр на ИТ установлен.
Видимая строка, к примеру 1-ая, а фактическая - 64-ая. Получается, нужно указывать номер первой видимой строки. Ладно, подумаю еще... PS. Подумал, вопрос решен: для свойства ТекущаяСтрока нужно брать номер видимой строки (с учетом индекса по ПД). |
|||
35
zelenprog
12.07.24
✎
08:39
|
(34) То есть, чтобы в ТП спозиционироваться на первой строке для твоего примера с учетом индекса, надо указать
мТабличноеПоле.ТекущаяСтрока = 64; Верно я понял? А как определить этот реальный номер "64"? |
|||
36
victuan1
12.07.24
✎
09:42
|
(35) Верно понял.
Способы найти разные. Например, через метод ИТ - НайтиСтроку отыскать номер первой строки по нужному индексу. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |