Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / TreeView трабл с backcolor / 14 сообщений из 14, страница 1 из 1
31.10.2008, 11:54
    #35627463
Imperous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
Всем привет!
Нашел вот такой вот текст как залить тривью и вставил его в событие init этого treeview
Код: plaintext
1.
2.
3.
4.
5.
Declare INTEGER SendMessage IN user32;
   INTEGER ihWnd,;
   INTEGER iMsg,;
   INTEGER iwParam,;
   INTEGER ilParam
SendMessage(ThisForm.Olecontrol1.hWnd,  4381 ,  0 , RGB( 255 , 255 , 0 ))

но, когда открываются дочерние ноды, появляется белый просвет между верхним и нижним, некрасиво :(
как это решить?
...
Рейтинг: 0 / 0
31.10.2008, 12:22
    #35627626
Imperous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
еще в догонку вопросик - как сделать фон за текстом нода прозрачный?
(потому что заливка например светло-голубая, шрифт черный, а за текстом заливка белая)
...
Рейтинг: 0 / 0
31.10.2008, 12:44
    #35627733
Imperous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
с цветов за текстом разобрался:
TreeView.Nodes(index).BackColor=RGB(0,255,0)
...
Рейтинг: 0 / 0
27.11.2008, 12:51
    #35678845
Imperous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
неужели все используют белый цвет фона? :(
...
Рейтинг: 0 / 0
27.11.2008, 16:28
    #35679838
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
Imperousнеужели все используют белый цвет фона? :(
В основном, да.

Назначение FoxPro - это работа с базами данных, а не разработка "прикольных" интерфейсов. FoxPro на это просто не рассчитан. Сделать "красиво", в принципе, можно, но требует огромных трудозатрат. И не факт, что где-то еще не вылезет "косяк".

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

Цвет используется для того, чтобы обратить внимание пользователя на возможную проблему. А если вся форма "заляпана" разными цветными пятнами, то работать просто невозможно.

Ну, и наконец, ActiveX-компоненты - это "не родные" объекты FoxPro. Поэтому за их поведение FoxPro отвечать не может. Разрабатывали другие люди. И если эти "другие люди" не предусмотрели "штатное" изменение цвета фона, значит, придется искать обходные пути вообще вне идеологии среды разработки (в данном случае, API-функции)
...
Рейтинг: 0 / 0
01.12.2008, 18:36
    #35686304
Gendrive
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
Imperous,

Естьболее простой способ заполнить тривью:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SCAN 
	IF EMPTY(tbl.parent) then
		node1 = this.treeView.Nodes.add(, 1 ,ALLTRIM(tbl.Key),ALLTRIM(tbl.Descr), 0 )
	ELSE 
		node1 = this.treeView.Nodes.add(ALLTRIM(tbl.Parent),  4 , ALLTRIM(tbl.Key),ALLTRIM(tbl.Descr), 0 )
	ENDIF 
	node1.forecolor = tbl.colour_id
	node1.image = tbl.icon_id
ENDSCAN 


tbl - таблица содержащая данные для тривью. Желательно таблицу отсортировать по полю parent чтобы сначала залились корневые узлы а потом уже все остальные к ним. вообще я подготоваливаю таблицу перед заливкой определенным образом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT distinct parent FROM &tn WHERE EMPTY(parent) INTO CURSOR (curTemp1) readwrite

DO WHILE _tally >  0 
	SELECT * FROM &tn WHERE parent in (SELECT parent FROM (curTemp1)) INTO CURSOR (curTemp2) readwrite
	INSERT INTO (this.scoupname) SELECT * FROM (curTemp2)
	SELECT distinct key as parent FROM (curTemp2) INTO CURSOR (curTemp1) readwrite
ENDDO 

что то типа этого. позволяет физически данные курсорасформироватьтаким образом чтобы все родительские узлы любых уровней шли раншьше в курсоре чем дочерние.
...
Рейтинг: 0 / 0
02.12.2008, 00:28
    #35686718
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
Gendrive

Вообще-то, вопрос темы никак не связан с процессом заполнения TreeView. Вы опять торопитесь с ответом.

Однако если хотите знать какие есть еще способы заполнение TreeView, кроме описанного вами способа, то:

1. В таблице источнике создаются дополнительные поля (или дополнительные таблицы), позволяющие получить выборку либо за один запрос, либо за ограниченное (фиксированное) количество запросов. Нет "бесконечной" вложенности запросов. Вариантов таких структур довольно много...

2. TreeView заполняется "по требованию". Т.е. физически заполнены только те узлы, которые пользователь раскрыл. Заполнение происходит "на лету" в событии node.Expand(). Так работает проводник Windows.

3. "Классический" способ заполнения TreeView - это рекурсия. Т.е. в курсоре содержится только один шаг приведенного вами цикла. Сохранять это промежуточный результат после заполнения очередного уровня TreeView нет никакого смысла. Разумеется, если вы не готовите данные для отчета. Но к собственно заполнению TreeView это опять же не имеет отношения.
...
Рейтинг: 0 / 0
02.12.2008, 02:28
    #35686777
Gendrive
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
ВладимирМ,
а вы опять учите жизни других? Такое ощущение что для Вас существует либо ваше мнение либо неправильное.
Поскольку мы уже уже выяснили, что вы "не любите тривью, то смею предположить, что вы не пытались работать с ним более менее плотно. Поэтому вопрос скорости при заполнении тривью не рассматривали. А я этот вопрос изучал достаточно досконально.
Зачем лить воду в подобных сообщениях? Только для того чтобы показать свое превосходство?
...
Рейтинг: 0 / 0
02.12.2008, 05:40
    #35686806
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
Gendrive
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT distinct parent FROM &tn WHERE EMPTY(parent) INTO CURSOR (curTemp1) readwrite

DO WHILE _tally >  0 
	SELECT * FROM &tn WHERE parent in (SELECT parent FROM (curTemp1)) INTO CURSOR (curTemp2) readwrite
	INSERT INTO (this.scoupname) SELECT * FROM (curTemp2)
	SELECT distinct key as parent FROM (curTemp2) INTO CURSOR (curTemp1) readwrite
ENDDO 

Довольно медленный, м/у прочим, способ. Самое быстрое, что у меня получилось, это построение дерева на хвостовой рекурсии, по индексам (INT стек на массиве). Для чего курсор дважды проецируется в память и временный курсор дополнительно индексируется. Хрень полная, но деревья-милионники строятся в секунды.
...
Рейтинг: 0 / 0
02.12.2008, 07:13
    #35686822
Restavraciya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
авторTreeView трабл с backcolorЕсли разберетесь в басике то решение тут
...
Рейтинг: 0 / 0
02.12.2008, 17:28
    #35688722
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
GendriveВладимирМ,
а вы опять учите жизни других? Такое ощущение что для Вас существует либо ваше мнение либо неправильное.
Поскольку мы уже уже выяснили, что вы "не любите тривью, то смею предположить, что вы не пытались работать с ним более менее плотно. Поэтому вопрос скорости при заполнении тривью не рассматривали. А я этот вопрос изучал достаточно досконально.
Зачем лить воду в подобных сообщениях? Только для того чтобы показать свое превосходство?
Вы опять делаете поспешные и не обоснованные выводы. Можете привести хотя бы цитаты, на основании которых вы пришли именно к таким выводам?

Понимате, меня ввело в заблуждение ваше первое сообщение о том, что в вашей организации система учета работает более 12 лет и более 2 лет идет оптимизация этой системы. На основании этого я предположил, что вы как-то к этому процессу причастны и довольно много времени занимаетесь программированием вообще и TreeView в частности.

Поэтому я посчитал, что вы в курсе как сильных, так и слабых сторон TreeView и мне будет достаточно даже не намекнуть, а просто напомнить о слабых сторонах TreeView не разжевывая проблему.

Однако последующие ваши ответы показали довольно слабое владение предметом. Вы просто не понимаете о чем идет речь. Причем вместо того, чтобы попросить разьяснить о чем идет речь, вы постоянно огрызаетесь. Именно по приципу "существует два мнения: одно мое, другое не правильное"

Если очень хотите, я могу подтвердить это мнение вашими же цитатами. А вот сможете ли вы сделать то же самое? Не пытаетесь ли вы переложить собственные грехи на другого?

Кстати, вы хоть понимате где в вашем коде происходит замедление формирования TreeView? Вы поняли о каких других идеологиях заполнения TreeView я говорил в предыдущем посте?
...
Рейтинг: 0 / 0
02.12.2008, 17:30
    #35688733
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
Kruchinin PahanСамое быстрое, что у меня получилось, это построение дерева на хвостовой рекурсии, по индексам (INT стек на массиве). Для чего курсор дважды проецируется в память и временный курсор дополнительно индексируется. Хрень полная, но деревья-милионники строятся в секунды.
Получилось быстро наполнить TreeView или сформировать выборку в порядке следования узлов? Можете показать код выборки?
...
Рейтинг: 0 / 0
03.12.2008, 02:09
    #35689385
Gendrive
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
ВладимирМ,
о как! ну что я могу на это ответить? Вообще то на такие посты не следует отвечать, но фидошная юность не дает оставить такие вещи без ответа.
Владимир, ваше высокомерие, даже не смотря на ваши заслуги в составлении факов и всего такого на сайте слишком уж зашкаливает. оправдываться перед Вами и приводить вам какие то доводы и примеры считаю ненужной тратой времени. Ибо пользы от общения с вами никакой, а апломба и высокомерия - выше крыши. Вы никогда не отвечаете по сути (во всяком случае мне) но всегда с намерением поучать. ТАкое поведение на софтовом форуме по крайней мере странно.
...
Рейтинг: 0 / 0
03.12.2008, 06:05
    #35689419
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TreeView трабл с backcolor
ВладимирМKruchinin PahanСамое быстрое, что у меня получилось, это построение дерева на хвостовой рекурсии, по индексам (INT стек на массиве). Для чего курсор дважды проецируется в память и временный курсор дополнительно индексируется. Хрень полная, но деревья-милионники строятся в секунды.
Получилось быстро наполнить TreeView или сформировать выборку в порядке следования узлов? Можете показать код выборки?
На рекурсии покажу. На хвостовой рабочего демо-примера не получилось, много специфики вырезать надо.
Код: 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.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
CLOSE TABLES ALL

lcTestCursor = "CurTest"
CREATE CURSOR (lcTestCursor) (Kod I NULL, KodPar I NULL, Punkt C( 20 ), nLft I, nRgt I, nLev I)
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 1 , .NULL.)
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 2 , .NULL.)
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 3 ,  1 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 4 ,  1 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 5 ,  3 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 6 ,  5 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 7 ,  5 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 8 ,  5 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 9 ,  2 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 10 ,  2 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 11 ,  10 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 12 ,  10 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 13 ,  2 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 14 ,  11 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 15 ,  11 )
INSERT INTO (lcTestCursor) (Kod, KodPar) VALUES ( 16 ,  15 )
lnResult = BuildHierarhyIdx(.NULL.,  0 ,  0 , "Kod", "KodPar")
*-* (IGEL)  1 . 1  Строим иерархию...
IF lnResult != RECCOUNT()* 2 
	=MESSAGEBOX("ERROR1",  0 + 16 , "ERROR")
	RETURN .F.
ENDIF
INDEX ON nLft TO SYS( 2015 )
GO TOP
*-* (IGEL)  1 . 2  Обход дерева (для построения дерева стек уже не нужен).
LOCAL lcKey, lnLev
lcKey = ""
lnLev =  0 
SCAN	
	DO CASE
		CASE lnLev < nLev AND !ISNULL(KodPar)
			lcKey = lcKey + TRANSFORM(KodPar) + "."
		CASE lnLev > nLev AND !EMPTY(lcKey) 
			IF nLev >  1 
				lcKey = LEFT(lcKey, AT(".", lcKey, nLev -  1 ))
			ELSE
				lcKey = ""
			ENDIF				
	ENDCASE
	lnLev = nLev
	REPLACE Punkt WITH lcKey + TRANSFORM(Kod)
ENDSCAN

GO TOP
BROWSE LAST NOWAIT

FUNCTION BuildHierarhyIdx
	***********************************************************
	* Строим иерархию в текущем курсоре.
	LPARAMETERS tuNode, tnCounter, tnLevel, tcKeyField, tcParField

	PRIVATE ALL
	LOCAL lcOldAlias, lcNewAlias, lcIndex

	tnLevel		= tnLevel +  1 
	lcOldAlias	= ALIAS()
	lcNewAlias	= SYS( 2015 )
	lcIndex		= SYS( 2015 )
	*-* (IGEL)  1 . Строим индексы
	USE (DBF(lcOldAlias)) IN  0  ALIAS (lcNewAlias) AGAIN

	SELECT (lcNewAlias)
	INDEX ON &tcKeyField TAG KeyVal OF &lcIndex FOR NVL(&tcKeyField!=&tcParField, .T.) ADDITIVE
	INDEX ON &tcParField TAG ParVal OF &lcIndex ADDITIVE
	lcUslovie = TEXTMERGE([!INDEXSEEK(<<tcParField>>, .F., "<<lcNewAlias>>", "KeyVal")])

	*-* (IGEL)  2 . Основной цикл по данным
	SELECT (lcOldAlias)
	SCAN FOR !INDEXSEEK(&tcParField, .F., lcOldAlias, "KeyVal")
		tnCounter = tnCounter +  1 
		REPLACE nLft WITH tnCounter, ;
				nLev WITH tnLevel
		
		IF INDEXSEEK(&tcKeyField, .F., lcOldAlias, "ParVal")
			tnCounter = BuildHierarhyIdx_Iterate(&tcKeyField, tnCounter, tnLevel, lcOldAlias, tcKeyField, tcParField)
		ENDIF
				
		tnCounter = tnCounter +  1 
		REPLACE nRgt WITH tnCounter
	ENDSCAN

	*-* (IGEL)  3 . Вычищаем нами же построенные индексы
	USE IN SELECT(lcNewAlias)
	DELETE TAG KeyVal OF (lcIndex)
	DELETE TAG ParVal OF (lcIndex)
	TRY
		IF FILE(FORCEEXT(lcIndex, "CDX"))
			ERASE (FORCEEXT(lcIndex, "CDX"))
		ENDIF
	CATCH	
	ENDTRY

	RETURN tnCounter
ENDFUNC

FUNCTION BuildHierarhyIdx_Iterate
	LPARAMETERS tuNode, tnCounter, tnLevel, tcAlias, tcKeyField, tcParField
	LOCAL lnSaveRec
	lnSaveRec	= RECNO()
	IF tnCounter > RECCOUNT() *  2 
		=MESSAGEBOX(TEXTMERGE("Алгоритм BuildHierarhyIdx_Iterate зациклился на <<ALIAS()>>"),  0 + 16 , "Error")
		RETURN tnCounter
	ENDIF
	tnLevel		= tnLevel +  1 
	SCAN FOR &tcParField = tuNode
		IF NVL(&tcKeyField = &tcParField, .F.)
			LOOP
		ENDIF
		tnCounter = tnCounter +  1 
		REPLACE nLft WITH tnCounter, ;
				nLev WITH tnLevel
		
		IF INDEXSEEK(&tcKeyField, .F., tcAlias, "ParVal")
			tnCounter = BuildHierarhyIdx_Iterate(&tcKeyField, tnCounter, tnLevel, tcAlias, tcKeyField, tcParField)
		ENDIF
				
		tnCounter = tnCounter +  1 
		REPLACE nRgt WITH tnCounter
	ENDSCAN
	GOTO lnSaveRec
	RETURN tnCounter
ENDFUNC

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


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