powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / FTREE. Как получить предыдущий элемент?
5 сообщений из 5, страница 1 из 1
FTREE. Как получить предыдущий элемент?
    #38611290
Bombat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем приветы!
Хотелось бы "приукрасить" дерево. При удалении текущего элемента хотелось бы сделать выделенным предыдущий элемент. Существует простой вариант решения?
...
Рейтинг: 0 / 0
FTREE. Как получить предыдущий элемент?
    #38620594
efendi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bombat,

Первое, что на ум приходит - массив.
...
Рейтинг: 0 / 0
FTREE. Как получить предыдущий элемент?
    #38621025
Bombat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
efendi
Дерево редактируемое и заниматься еще организацией массива что-то не очень хочется.
Думаю сделать иначе:
1. Запоминаем текущий элемент.
2. Проверяем есть ли родитель у данного элемента (поможет FTREE.GET_TREE_NODE_PARENT). Если есть - хорошо, т.к. придется перебрать только элементы этого родителя.
3. Если родителя нет, значит элемент первого уровня и перебрать придется только их.
4. Организуем цикл. Перебираем элементы либо с родителя, либо с начала дерева, запоминая предыдущий элемент (он то нам и нужен) и сравнивая текущий с нашим элементом из пункта 1. Как только доходим до запомненного элемента, выходим из цикла. Предыдущий элемент это как раз тот что нам нужен.
5. Удаляем текущий элемент и устанавливаем курсор в наш предыдущий.
Пока проще ничего не придумал.
...
Рейтинг: 0 / 0
FTREE. Как получить предыдущий элемент?
    #38621103
Bombat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот как-то так. Может упустил что, но общая схема такая.
Если удалить комментарии, то текста будет в два раза меньше.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
FUNCTION Get_Prev_Tree_Node(in_node IN FTREE.Node) RETURN FTREE.Node IS
	parent_node FTREE.Node;
	prev_node		FTREE.Node;
	cur_node		FTREE.Node;
	start_node	FTREE.Node;
	htree 			ITEM;	
	i number := 1;
BEGIN
	--Проверяем чтобы параметр не был пустым. Если входящий пустой, то и результат соответствующий.
  IF NOT FTREE.ID_NULL(in_node) THEN
		htree := Find_Item('TREE_OBJECTS.TREE');
  	parent_node := FTREE.GET_TREE_NODE_PARENT(htree, in_node);
  	--Проверяем есть ли родитель у входящего элемента.
  	IF NOT FTREE.ID_NULL(parent_node) THEN
  		--Если есть, то цикл будем начинать с родителя.
  		start_node := parent_node;
  	ELSE
  		start_node := FTREE.FIND_TREE_NODE(htree, '', FTREE.FIND_NEXT, FTREE.NODE_LABEL, FTREE.ROOT_NODE, FTREE.ROOT_NODE);
  	END IF;
  	--Если входящий параметр это первый элемент дерева, то сразу говорим что предыдущего элемента у него нет.
  	IF in_node = start_node THEN
  		RETURN NULL;
  	END IF;
  	--Организуем цикл.
 		prev_node := start_node;
  	LOOP
  		cur_node := FTREE.FIND_TREE_NODE(htree, '', FTREE.FIND_NEXT, FTREE.NODE_LABEL, FTREE.ROOT_NODE, prev_node);
  		IF cur_node = in_node THEN
  			EXIT;
  		END IF;
  		prev_node := cur_node;
  	END LOOP;
  ELSE
  	RETURN NULL;
  END IF;
  --Возможно, что предыдущий элемент "не раскрыт" и выделять его, раскрыв, будет не очень красиво.
  --Поэтому нужно найти его ближайшего "видимого" родителя.
  LOOP
  	i:=i+1;
  	if i>10 then exit;
  	end if;
  	parent_node := FTREE.GET_TREE_NODE_PARENT(htree, prev_node);
  	--Если родитель есть.
  	IF NOT FTREE.ID_NULL(parent_node) THEN
	  	--Если узел не раскрыт, то делаем родителя нашим искомым элементом и идем на следующую итерацию.
	  	IF FTREE.GET_TREE_NODE_PROPERTY(htree, parent_node, FTREE.NODE_STATE) = FTREE.COLLAPSED_NODE THEN
	  		prev_node := parent_node;
	  	--Если родитель раскрыт, выходим из цикла.
	  	ELSE
	  		EXIT;
	  	END IF;
		--Если родителя нет, то выходим из цикла.
  	ELSE
  		EXIT;
  	END IF;
  END LOOP;
  RETURN prev_node;
END;
...
Рейтинг: 0 / 0
FTREE. Как получить предыдущий элемент?
    #38621107
Bombat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл удалить из описания переменную i и ее использование в последнем цикле.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / FTREE. Как получить предыдущий элемент?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]