powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / зашел в тупик с TreeView
15 сообщений из 15, страница 1 из 1
зашел в тупик с TreeView
    #32305207
МаксимВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Visual FoxPro 6.
Столкнулся с проблемой. Создал в форме объект TreeView. Описал методы Collapse и Expand. Вроде-бы все красиво: значки у узлов меняются при открытии и закрытии.
А как оброботать двойной Click на конечном узле(без Child), чтобы запустить на выполнение какую-нибудь процедуру, не знаю.
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32305319
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
PUBLIC otest

otest=NEWOBJECT( "test" )
otest.Show
RETURN

DEFINE CLASS test AS form
	DoCreate = .T.
	Caption =  "Form1" 
	activenode = .NULL.  && Свойство формы для хранения ссылки на Node
	Name =  "Test" 
	nodeclick = .F.      && Свойство формы для определения щелчка на Node
	Name =  "Test" 
	ADD OBJECT oimage AS olecontrol WITH ;
		Top =  12 , ; 
		Left =  324 , ;
		Height =  25 , ;
		Width =  25 , ;
		Name =  "oImage"  && ImageList с  3 -мя иконками
	ADD OBJECT otree AS olecontrol WITH ;
		Top =  12 , ;
		Left =  12 , ;
		Height =  217 , ;
		Width =  348 , ;
		Name =  "oTree"  && TreeView c соотв. настроками
	PROCEDURE nodedblclick
		WITH this
			IF !ISNULL(.activenode)
				=MESSAGEBOX(.activenode.text)
			ENDIF 
		ENDWITH 
	ENDPROC
	PROCEDURE Init
		LOCAL loNode && as Object 
		LOCAL i && as Integer 
		LOCAL j && as Integer 
		WITH this 
			.oTree.ImageList=.oImage.oBJECT 
			WITH .oTree.Nodes 
				FOR i= 1  TO  3 
					loNode=.Add(, 1 ,'_'+LTRIM(STR(i)),SYS( 2015 ), 2 )
					loNode.ExpandedImage= 3 
					FOR j= 1  TO  3 
						loNode=.Add('_'+LTRIM(STR(i)),;
						l4,'_'+LTRIM(STR(i* 10 +j)),SYS( 2015 ), 1 )
					ENDFOR
				ENDFOR
			ENDWITH 
		ENDWITH 
	ENDPROC
	PROCEDURE otree.NodeClick
		*** ActiveX Control Event ***
		LPARAMETERS node
		IF node.children= 0 
			WITH thisform
				.NodeClick=.T.
				.activenode=node
			ENDWITH 
		ENDIF
	ENDPROC
	PROCEDURE otree.DblClick
		*** ActiveX Control Event ***
		WITH thisform
			IF .NodeClick
				.NodeDblClick()
			ENDIF 
			.NodeClick=.F.
		ENDWITH 
	ENDPROC
ENDDEFINE
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32305344
МаксимВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, что ответили. Первый раз попробовал на форме что-то спросить. Не ожидал получить ответ. Попробую, результат сообщу.
С Уважением,
Максим.
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32305380
МаксимВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал.
Прописал следующее:

Код: plaintext
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.
*** ActiveX Control Event ***
PROCEDURE otree.NodeClick
LPARAMETERS node
*!*	IF node.children= 0 
IF node.Image= 3 
	WITH thisform
		ThisForm.NodeClick=.T.
		ThisForm.ActiveNode=node.Key
	ENDWITH 
ENDIF

*** ActiveX Control Event ***
PROCEDURE otree.DblClick
WITH thisform
	IF ThisForm.NodeClick = .T.
		ThisForm.NodeDblClick()
	ENDIF 
	ThisForm.NodeClick=.F.
ENDWITH 

PROCEDURE nodedblclick
WITH this
	IF ThisForm.activenode <> NULL
		QUIT && выдаст сообщение, что не может выйти из FoxPro
		*MESSAGEBOX(ThisForm.activenode.text)
	ENDIF 

ENDWITH 

==========
Проверял через Debugger. Метод otree.NodeClick обрабатывается нормально:
ThisForm.NodeClick и ThisForm.ActiveNode присваиваются в зависимости от Image.
Дальше дело не идет. Fox отказывается обрабатывать метод otree.DblClick
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32305390
МаксимВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почти "работает". Только нужно последовательно сначала щелкнуть мышкой на Node без дочерних узлов, а потом два раза щелкнуть мышкой в форме. Так не пойдет.
Может что-нибудь еще предложишь? У меня идеи кончились. Я уже неделю экспериментирую.
Максим.
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32305442
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2МаксимВ

Если ты инициировал дерево, так же, как и я, то для нод без дочерних у него Image=1, а не 3. Чем тебе свойство Children не понравилось? Оно возвращает кличество дочерних нод для ноды, как раз твой случай.
Последовательность обхода при двойном щелчке на ноде, неважно активная она или нет:
oTree.NodeClick()
oTree.DblClick()
Проверь как у тебя отрабатываю события, например таким образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
*** ActiveX Control Event ***
PROCEDURE otree.NodeClick
LPARAMETERS node
ERROR  1098 

*** ActiveX Control Event ***
PROCEDURE otree.DblClick
ERROR  1098 

PROCEDURE otree.Error
LPARAMETERS nError, cMethod, nLine
ACTIVATE SCREEN 
?cMethod

У меня все работает нормально, VFP8+Microsoft TreeView Control 6.0 (SP4)
Может у тебя версия контрола старая и она ведет себя по-другому? Тогда проще скачать последний серпак для фокса, там обновлены Common Controls OCX.
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32305460
МаксимВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал как посоветовал.
При Click на узле выходит ошибка:
API function_UserError() was called.
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32305463
МаксимВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня VFP6 + Microsoft TreeView Control 6.0
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32305465
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в событие otree.Error прописал, чтобы эта ошибка выводила на экран имя метода?
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32305474
МаксимВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Написал как говорил:

Код: plaintext
1.
2.
3.
PROCEDURE otree.Error
LPARAMETERS nError, cMethod, nLine
ACTIVATE SCREEN 
?cMethod
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32305475
МаксимВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал по другому:
Код: plaintext
1.
2.
3.
4.
5.
6.
PROCEDURE otree.Error
LPARAMETERS nError, cMethod, nLine

*!*	ACTIVATE SCREEN 
*!*	?cMethod

MESSAGEBOX(cMethod)

При двойном клике на форму выводит dblClick.
При клике на любом узле ошибка:API function_UserError() was called
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32305482
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смысл в следующем:
щелчок по ноде, на экране выводиться:
nodeclick
двойной щелчок по дереву вне ноды:
dblclick
двойной щелчок по ноде:
nodeclick
dblclick
Таким образом, при двойном щелчке на ноде происходят два события в определненной последовательности. При обработке первого события (nodeclick) устанавливается флаг (ThisForm.NodeClick), а во втором событии (dblclick) вызывается нужный метод, на основании того установлен флаг или нет, и сбрасывается флаг.
Если у тебя последовательность событий другая, то мой первоначальный вариант не будет работать. Но мне кажется, ты что-то перемудрил :)

ЗЫ проверил на TreeView Control 5.0 (SP2) - все работает аналогичным образом.
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32306319
МаксимВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет! Вчера уже поздновато было отвечать(у меня 3-тий час ночи был, а в понедельник на работу надо).
Сегодня создал форму так, как в первоначальном примере. Объект TreeView взял Microsoft TreeView Control 5.0 (SP2) и пришлось брать ImageList Control 5.0 (SP2). Узлы в "дерево" добавлял по примеру, только параметр l4 заменил на 4.
Добавил ERROR 1098 в процедуры, и описал Error для oTree(я вчера со слепу для формы описал)
Код: plaintext
1.
2.
3.
PROCEDURE otree.Error
LPARAMETERS nError, cMethod, nLine
ACTIVATE SCREEN 
?cMethod

Смысл задуманного я понял сразу(надеюсь правильно).
Только у меня по примеру получается так:
Вариант 1.
Один щелчок по ноде:
nodeclick
Двойной щелчок вне ноды:
dblclick
nodedblclick
У нас флаг не сброшен.

Вариант 2.
Один щелчок по ноде:
nodeclick
Двойной щелчок по ноде:
nodeclick
Двойной щелчок вне ноды:
dblclick
nodedblclick
Т.к. после щелчков по ноде не выплняется последовательность:
nodeclick->dblclick и соответственно опять не сбрасывается флаг.

Мне кажется, что мы идем не тем путем. Может быть дело не в VFP, а в самом
WINDOWS. Одно внешнее действие - двойной щелчок не обрабатывается как два:
одинарный щелчок+двойной. Я проверял в Dbugger, при помощи SECONDS(),
при двойном Click даже нет временного интервала между щелчками. Может в VFP8 что-то и придуманно, не знаю, у меня VFP6(повторяюсь).

Максим.
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32306389
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2МаксимВ

> Узлы в "дерево" добавлял по примеру, только параметр l4 заменил на 4.

да, там ошибка при копировании из программы в форум.

> Т.к. после щелчков по ноде не выплняется последовательность:
nodeclick->dblclick и соответственно опять не сбрасывается флаг.


Только что проверил на VFP5, последовательность та жа, а флаг действительно сбрасывается неверно. В nodeclick должно быть что-то вроде:
Код: plaintext
1.
2.
3.
4.
5.
6.
*** OLE Control Event ***
LPARAMETERS node
if node.children= 0 
	thisform.NodeClick=.T.
else
	thisform.NodeClick=.F.
endif

И тогда такой DblClick нормально отрабатывает
Код: plaintext
1.
2.
3.
4.
*** OLE Control Event ***
if thisform.NodeClick
	=MessageBox('DblClick!')
endif
thisform.NodeClick=.F.

> Мне кажется, что мы идем не тем путем. Может быть дело не в VFP, а в самом WINDOWS. Одно внешнее действие - двойной щелчок не обрабатывается как два:одинарный щелчок+двойной.

А какой у тебя windows? У меня только win2k, больше проверить не на чем.
...
Рейтинг: 0 / 0
зашел в тупик с TreeView
    #32306464
МаксимВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня тоже win2k.

Я дико извеняюсь, что столько времени у тебя отнял.
Еще раз пример просмотрел и увидел, что ТОРМОЖУ!!!
Я DblClick прописал для FORM1, а не для TREE.

ВСЁ РАБОТАЕТ! БОЛЬШОЕ СПАСИБО.

Максим.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / зашел в тупик с TreeView
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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