gifts2017

Алгоритм смены страниц

Опубликовал Сергей JesteR (JesteR) в раздел Программирование - Практика программирования

Предлагаю свой алгоритм смены страниц с помощью команд Далее/Назад

Иногда приходится создавать группу страниц с навигацией через команды Далее/Назад.
Предлагаю свой алгоритм смены страниц. Если кому-то облегчит труд, буду рад. 

Что нам понадобится:

1. Переменная модуля формы, которая будет хранить порядок страниц, и ее инициализация

&НаКлиенте 
Перем мПорядокСтраниц; //Переменная типа Массив, который хранит ссылки на страницы в упорядоченном виде 

В подвале модуля формы инициализируем переменную 

//очередность страниц в массив важна, на основании нее будет подбираться следующая или предыдущая страница
мПорядокСтраниц = Новый Массив;
мПорядокСтраниц.Добавить(Элементы.НачальнаяСтраница);
мПорядокСтраниц.Добавить(Элементы.Страница2);
мПорядокСтраниц.Добавить(Элементы.Страница3);
мПорядокСтраниц.Добавить(Элементы.ПоследняяСтраница);

2. Две команды формы Вперед, Назад и их обработчики:

&НаКлиенте
Процедура Вперед(Команда)
	СменитьСтраницу(Истина);
КонецПроцедуры

&НаКлиенте
Процедура Назад(Команда)
	СменитьСтраницу();
КонецПроцедуры

3. Процедура смены страницы

&НаКлиенте
Процедура СменитьСтраницу(Вперед=Ложь)
	ГруппаСтраниц				= Элементы.ГруппаСтраниц;//группа страниц, которыми мы управляем
	ИндексТекущейСтраницы		= мПорядокСтраниц.Найти(ГруппаСтраниц.ТекущаяСтраница);
	НовыйИндексТекущейСтраницы	= ИндексТекущейСтраницы;//по умолчанию новый индекс - текущая страница
	
	Если Вперед Тогда
		Если НЕ ИндексТекущейСтраницы=мПорядокСтраниц.ВГраница() Тогда
			//если мы не на последней странице, то можем увеличить индекс 
			НовыйИндексТекущейСтраницы = ИндексТекущейСтраницы+1;
		КонецЕсли; 
	Иначе
		Если ИндексТекущейСтраницы<>0 Тогда
			//если мы не на первой странице, то можем уменьшить индекс 
			НовыйИндексТекущейСтраницы = ИндексТекущейСтраницы-1;
		КонецЕсли; 
	КонецЕсли; 
	
	//Установим новую текущую страницу
	ГруппаСтраниц.ТекущаяСтраница = мПорядокСтраниц[НовыйИндексТекущейСтраницы];
КонецПроцедуры

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Алексей Роза (DoctorRoza) 16.09.15 07:32
Я правильно понял, что Вы этим:

//очередность страниц в массив важна, на основании нее будет подбираться следующая или предыдущая страница
мПорядокСтраниц = Новый Массив;
мПорядокСтраниц.Добавить(Элементы.НачальнаяСтраница);
мПорядокСтраниц.Добавить(Элементы.Страница2);
мПорядокСтраниц.Добавить(Элементы.Страница3);
мПорядокСтраниц.Добавить(Элементы.ПоследняяСтраница);

жестко вводите количество страниц? Ну тогда за такую писанину клавиатурой Вам по сопатке! Динамику, что слабо наваять!?
2. Сергей Ларичев (kolo6ok) 16.09.15 08:40
(1) DoctorRoza, какие претензии к автору? Что мешает вам динамически обновлять массив?
TreeDogNight; JesteR; Serega-artem; region.eburg; IgorS; VitaliyCeban; +6 Ответить
3. Сергей JesteR (JesteR) 16.09.15 10:56
(1) Спасибо за критику и за сопатку :)
Я не претендую на оптимальность, можете динамически его заполнять. Всего лишь поделился идеей.
У меня как правило три-пять страниц, мне легче будет руками массив заполнить. Тут надо без фанатизма :).

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

4. Сергей Поликарпов (Serega-artem) 16.09.15 10:56
Код простой, за это плюс!
5. Максим *** (premier) 16.09.15 14:24
А зачем вообще массив нужен? Страницы панели сами являются коллекцией!
Индекс текущей страницы определяем как:
ИндексТекущейСтраницы = Панель.Страницы.Индекс(Панель.ТекущаяСтраница);
Верхнюю границу индекса как:
ВерхняяГраница = Панель.Страницы.Количество() - 1;

Хотя, невнимательно код прочитал. Он для управляемых форм...
6. Сергей JesteR (JesteR) 16.09.15 14:43
(5) premier,
А если очередность страниц должна быть не такой, какая задана в описании формы, а произвольной ?
Например, в зависимости от каких-то параметров, некоторые страницы должны быть пропущены.

premier, ваш вариант для управляемых тоже будет работать, только немного по-другому обращаться к страницам:

Элементы.ГруппаПанель.ПодчиненныеЭлементы
7. Максим *** (premier) 16.09.15 14:50
(6) JesteR, я полагаю, что навигация вперёд - назад предполагает перемещение на соседнюю страницу.
В любом случае, очередность страниц можно изменить и на самой форме (всё равно конфигуратор использовать).
8. Сергей JesteR (JesteR) 16.09.15 15:05
(7) JesteR, я полагаю, что навигация вперёд - назад предполагает перемещение на соседнюю страницу.
premier, в большинстве случаев да и я с вами согласен, что ваше решение более простое.

Но в случае динамической очередности, ваш вариант не подходит.
Как написали выше, очередь можно выстроить динамически, в зависимости от выбранного в режиме предприятия параметра.



9. Яков Коган (Yashazz) 17.09.15 09:09
И вот за такую, извиняюсь, фигню - столько плюсов? Мдаааа...
10. Сергей Галюк (dj_serega) 18.09.15 08:20
(7) premier,
В любом случае, очередность страниц можно изменить и на самой форме (всё равно конфигуратор использовать)

Не согласен. Есть 5 страниц. Заполнение следующее: 1,2,3,4,5.
4ю видно если реквизит А = 150.
Если реквизит А = 250 тогда мы заполняем так: 1,3,2,5.
Но если реквизит Б = Истина, тогда мы видим страницу 2 :)
11. ivanov660 ivanov660 (ivanov660) 20.09.15 00:17
Я бы предложил использовать бинарное дерево, когда в каждой точке дерева у вас хранится информация о предыдущем и следующем:
// формируем дерево
мПорядокСтраниц = новый Соответствие();
мПорядокСтраниц.Вставить(Элементы.НачальнаяСтраница,
новый Структура("лево,право",Элементы.НачальнаяСтраница,Элементы.Страница2));
мПорядокСтраниц.Вставить(Элементы.Страница2,
новый Структура("лево,право",Элементы.НачальнаяСтраница,Элементы.Страница3));
...

// направление: лево или право тип строка
Процедура СменитьСтраницу(направление)
Структура = мПорядокСтраниц.Получить(ГруппаСтраниц.ТекущаяСтраница);
// проверка на всякий случай ))) вдруг что-то изменилось, пользователь удалил страницу (у автора алгоритм упадет?) или добавил новую страницу в пользовательском режиме (это уже отдельная история)
Если Структура<>Неопределено Тогда
    ГруппаСтраниц.ТекущаяСтраница = Структура[направление];
КонецЕсли;
КонецПроцедуры
...Показать Скрыть
dj_serega; +1 Ответить
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа