Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Поиск по "Таблица+Дерево" (число прочтений - 2007 )
Winter
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 24. Сентября 2007
Пол: Мужской
Поиск по "Таблица+Дерево"
11. Декабря 2008 :: 12:29
Печать  
Подскажите, как осуществить поиск значения по "Таблице+Дерево". В описании FormEx не нашел, на форуме тоже.
  
Наверх
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Поиск по "Таблица+Дерево"
Ответ #1 - 11. Декабря 2008 :: 15:37
Печать  
Рекурсивным перебором
Цитата:
Синтаксис: ПерехватитьТаблицуЗначений()

Описание: Преобразует таблицу значений на форме в объект "Дерево+Таблица". Преобразуемая ТЗ должна иметь строго определенную структуру: первые три колонки служебные, остальные произвольные. Служебные колонки:
1: содержит ТЗ той же структуры со следующим уровнем дерева,
2: содержит номер пиктограммы, из установленной на перехватываемой ТЗ картинки, для отображения в дереве (если нулевое значение, то используются системные пиктограммы),
3: содержит наименование ветви дерева.
Метод работает только после физического открытия окна формы. Все методы для работы с объектом "Дерево+Таблица" работают только после вызова этого метода.

+
Цитата:
Синтаксис: ЗначениеИзДерева(Строка, Колонка)

Параметры:

Строка - тип: Строка. Полный путь к строке.
Колонка - тип: Число. Номер колонки.
Возвращает: тип: Любой. Значение, хранящееся в объекте "Дерево+Таблица" по указанным в параметрах координатам.

Описание: Метод предназначен для получения значения из объекта "Дерево+Таблица" по полному пути к строке и номеру колонки.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Поиск по "Таблица+Дерево"
Ответ #2 - 11. Декабря 2008 :: 15:39
Печать  
Я себе отдельный класс сделал для работы с Дерево+Таблица
Код
Выбрать все
// класс ДеревоТаблица:АтрибутФормы
Перем СостояниеУзлов, ТекущийУзел;

//*******************************************************************
Функция я() Возврат глВзятьКонтекст(Контекст); КонецФункции

//*******************************************************************
// возвращает тз указанного пути. Если путь не указан - возвращает тз текущего узла
Функция ПолучитьУзел(Путь = "") Экспорт // ... и установить курсор на текущей строке
	Если ПустаяСтрока(Путь) = 1 Тогда Путь = "/" + я().ТекущаяСтрокаДерева(); КонецЕсли;
	Дл = СтрДлина(Путь);
	Поз = Дл;
	Пока Поз > 0 Цикл
		Если Сред(Путь, Поз, 1) = "/" Тогда Прервать; КонецЕсли;
		Поз = Поз - 1;
	КонецЦикла;
	Если Поз = 1 Тогда
		тз = я().Значение
	Иначе
		тз = я().ЗначениеИзДерева(Сред(Путь, 2, Поз - 2), 1);
	КонецЕсли;
	НомСтроки = Число(Прав(Путь, Дл - Поз));
	Попытка
		тз.ПолучитьСтрокуПоНомеру(НомСтроки);
	Исключение
		//Сообщить(ОписаниеОшибки() + " / " + ТипЗначенияСтр(тз));
	КонецПопытки;
	Возврат тз;
КонецФункции

//*******************************************************************
Функция СостояниеУзла(Путь, Флаг = "*") Экспорт // замена одной функцией трех функций ФормЕкс
	Если Флаг = "*" Тогда Возврат я().УзелРазвернут(Путь); // вернуть текущее состояние узла
	ИначеЕсли ПустоеЗначение(Флаг) = 1 Тогда я().СвернутьУзел(Путь);
	Иначе я().РазвернутьУзел(Путь); КонецЕсли;
	Возврат "";
КонецФункции

//*******************************************************************
Процедура _РазвернутьВесьУзел(тз, _Путь, СостояниеУзла)
	Попытка
		тз.ВыбратьСтроки();
		Пока тз.ПолучитьСтроку() = 1 Цикл
			Путь = _Путь + Строка(тз.НомерСтроки);
			СостояниеУзла(Путь, СостояниеУзла);
			Если СостояниеУзла = 0 Тогда Продолжить; КонецЕсли;
			_РазвернутьВесьУзел(тз.ПолучитьЗначение(тз.НомерСтроки, 1), Путь + "/", СостояниеУзла);
		КонецЦикла;
	Исключение;
	КонецПопытки;
КонецПроцедуры

//*******************************************************************
Процедура РазвернутьВесьУзел(Путь = "", СостояниеУзла) Экспорт // развернуть/свернуть все узлы
	Если ПустаяСтрока(Путь) = 1 Тогда
		_РазвернутьВесьУзел(я().Значение, "", СостояниеУзла);
	Иначе
		_РазвернутьВесьУзел(я().ЗначениеИзДерева(Путь, 1), Путь + "/", СостояниеУзла);
	КонецЕсли;
КонецПроцедуры

//*******************************************************************
Функция НайтиУзел(Значение, ИмяКолонки, Путь = "/") Экспорт
	тз = ПолучитьУзел(Путь);
	тз.ВыбратьСтроки();
	Пока тз.ПолучитьСтроку() = 1 Цикл
		Если тз.ПолучитьЗначение(тз.НомерСтроки, ИмяКолонки) = Значение Тогда
			Возврат Путь + тз.НомерСтроки + "/";
		КонецЕсли;
		_Путь = НайтиУзел(Значение, ИмяКолонки, Путь + тз.НомерСтроки + "/");
		Если ПустаяСтрока(_Путь) = 0 Тогда Возврат _Путь; КонецЕсли;
	КонецЦикла;
	Возврат "";
КонецФункции

//*******************************************************************
Функция ТекущийУзел(Путь = "") Экспорт // замена одной функцией двух функций ФормЕкс
	Если ПустаяСтрока(Путь) = 0 Тогда
		я().УстановитьТекущийУзел(Прав(Путь, СтрДлина(Путь) - 1));
		Возврат "";
	Иначе
		Возврат "/" + я().ТекущаяСтрокаДерева();
	КонецЕсли;
КонецФункции

//*******************************************************************
Процедура ЗапомнитьСостояниеУзла(тз, _Путь)
	Попытка
		тз.ВыбратьСтроки();
		Пока тз.ПолучитьСтроку() = 1 Цикл
			Путь = _Путь + Строка(тз.НомерСтроки);
			СостояниеУзла = СостояниеУзла(Путь);
			СостояниеУзлов.Установить(Путь, СостояниеУзла);
			Если СостояниеУзла = 0 Тогда Продолжить; КонецЕсли;
			ЗапомнитьСостояниеУзла(тз.ПолучитьЗначение(тз.НомерСтроки, 1), Путь + "/");
		КонецЦикла;
	Исключение
	КонецПопытки;
КонецПроцедуры

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

//*******************************************************************
Процедура ВосстановитьСостояниеУзлов() Экспорт
	я().Видимость = 0;
	Для а = 1 По СостояниеУзлов.РазмерСписка() Цикл
		Путь = "";
		Значение = СостояниеУзлов.ПолучитьЗначение(а, Путь);
		СостояниеУзла(Путь, Значение);
	КонецЦикла;
	ТекущийУзел(ТекущийУзел);
	я().Видимость = 1;
КонецПроцедуры

//*******************************************************************
Функция НовыйУзел(Знач Путь = "") Экспорт // добавить узел по указанному пути и вернуть тз с курсором установленным на новой строке (узле)
	тз = ПолучитьУзел(Путь);
	тз.НоваяСтрока();
	тз1 = СоздатьОбъект("ТаблицаЗначений");
	тз.Выгрузить(тз1);
	тз1.УдалитьСтроки();
	тз.__Потомки = тз1;
	Возврат тз;
КонецФункции

//****************************************************************************
Процедура ПерехватитьТЗ(_Конт, ИмяТЗ) Экспорт
	я().УстановитьАтрибут(_Конт.Форма, ИмяТЗ);
	я().ПерехватитьТаблицуЗначений();
КонецПроцедуры

//****************************************************************************
Процедура Конструктор()
КонецПроцедуры //Конструктор 


P.S. В данном классе указание путей отличается наличием "/" впереди - надо иметь в виду.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать