powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Создание базы данных с Treeview
29 сообщений из 29, показаны все 2 страниц
Создание базы данных с Treeview
    #38577711
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дана база data1.dbc, в ней таблица table1.dbf, в таблице поля id, znachenie, info.
Дана форма
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38577712
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я на это сайтике почитал http://kodu.neti.ee/~juri4/vfpplus/ax_treeview_03_ru.htm но как привязать поля с таблицы вообще не понял....
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38577720
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Claymore,

ну стандартное же дерево - {id, parentid , данные_узла}
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38577729
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть ли еще какое нибудь пошаговое создание базы данных в treeview foxpro???
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38577759
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Claymore,

А при чём тут ole контрол и создание БД?
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38577765
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG,

Сейчас попытаюсь объяснить всё)
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38577776
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот как бы самое начало чет прописал:
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38577785
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38577801
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38578255
P-232
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я увидел что ты тренируешься.
Лох.
Скажи свою фамилию, чтобы такого дибила на работу не брать.
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38578283
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P-232Я увидел что ты тренируешься.
Лох.
Скажи свою фамилию, чтобы такого дибила на работу не брать.

Ну зачем же так оскорбительно? Человек учится. Правда, лучше бы он для начала литературу почитал, чтоб не выглядеть смешным.
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38578450
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P-232,

Ты где живешь?
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38578453
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG,

Извини, что смешно выгляжу (V_V) прост, читал я литературу и чет, но как говорится, смотрю в книгу вижу фигу(
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38578750
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Claymore,

Treeveiw - это контрол на форме, который отображает какие-то данные (чаще всего из таблицы).
При чем здесь создание базы данных - непонятно.
Лучше формулируй свои вопросы.
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38578782
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG,

Да правильно, извини, что неграмотно выразился насчет БД, да я наверн попытаюсь сам разобраться в этом treeview, спасибо что не остаешься равнодушным)))
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38580563
Grin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Claymore,

У дерева есть события, например у вас на скриншоте есть событие Init, в котором прописан код построения веток дерева.
Если Вы пытаетесь на лету добавить\удалить\отредактировать данные в дереве, то соответственно нужно написать обработку событий дерева.

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

tanglir пытается вам подсказать, что у каждой ветки дерева есть свой id и parentid узла, вот по ним нужно определять что конкретно вы хотите обновить в таблице.
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38582064
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Claymore,

Как я понял, проблема вообще не в контроле.
Проблема в таблице, для хранения данных

Выше кто то уже подсказал. Стандартный вид таблицы для дерева это ID, parentID, Name

Думаю в инете найдешь описание этой структуры.
Но по простому есть ID, у него есть Name.
Этот Name отображается в наименовании узла.
У узла есть ветви, так вот, все parentID указывают на этот ID.

Не уверен, что ясно. Но тебе надо разобраться именно в этом.
Создать структуру. А потом уже привязать ее к контролу.

Примеров в инете масса.
Ну и естественно, имена полей могут быть другими
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38582733
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asdor,

Можешь кинуть ссылку на примеры, нахожу, но вообще не то, там не то что поля разные, там вообще не связано с таблицами...
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38583220
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, Вы хотите использовать объект TreeView для создания/изменения/удаления записей таблицы? В принципе, такое возможно, но уж больно "муторно". Придется писать много кода, но, что более важно, у Вас постоянно будут возникать проблемы с идентификацией уровня вложенности узла.

Чтобы было понятно в чем проблема, представьте такую картинку в TreeView

0_1
--- 1_1
0_2

Вы находитесь на узле "0_1" и нажимаете кнопку "Добавить". Где должен быть создан новый элемент? На каком уровне? Как элемент, вложенный внутрь узла "0_1" или как элемент, расположенный после узла "0_1", но на том же уровне вложенности? Если как вложенный, то первый или последний?

Ну, т.е. какая картинка должна получиться в TreeView после нажатия кнопки "Добавить"

Вариант 1

0_1
--- 1_1
0_3 <-- Новый узел
0_2

Вариант 2

0_1
--- 1_1
--- 1_2 <-- Новый узел
0_2

Вариант 3

0_1
--- 1_2 <-- Новый узел
--- 1_1
0_2

Вариант 4

0_1
--- 1_1
------- 1_1_1 <-- Новый узел
0_2


TreeView - это объект, имеющий 2 измерения, а кнопка "Добавить" дает "интуитивно понятное" указание только на одно измерение (добавить после/перед текущим узлом).

Это то, что касается чисто технической стороны вопроса. А есть еще организационный вопрос. TreeView - как собака, друг, но друг ОДНОГО человека. Того, кого она считает "вожаком". Ко всем другим "человекам" в лучшем случае равнодушна.

То же самое с TreeView. TreeView - это объект, понятный только тому, кто занимается его ведением. Т.е. хорош только для ОДНОГО человека. Любой другой человек будет постоянно путаться в том, что и где в этом самом TreeView находится и поминать "тихим не злым словом" того, кто ТАК расположил узлы. Ну, ведь "совершенно очевидно", что вот этот узел должен быть внутри вот этого узла, а не внутри вон того...

В любом случае, я бы Вам не советовал использовать объект TreeView для модификации данных. Только для отображения. Т.е в обычном Grid создаете/изменяете записи. А в TreeView только отображаете результат
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38583632
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

Только "Вариант 2" остальные исключаются!
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38583660
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Claymore,
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38583662
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38583665
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу сообразить как правильно написать код в init формы form1, помогите)
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38583686
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тут подумал, правильнее таблица будет выглядеть так:
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38583962
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38584056
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Claymore,

Не совсем понятно что бы хотите услышать своим "апом".
Вам же уже много кто сказал - id,parentid как правило... как правило оба int(id даже автоинкиментом можно сделать)
Ну а ключами нодов как вариант будут "_"+str(id)

Если три поля в таблице кажутся "правильнее" - дело Ваше, Вам сопровождать
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38584081
Claymore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rock-n-roll,

Ды понимаешь я не соображу как код написать в init (V_V)
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38584254
rock-n-roll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Claymore,

в смысле как- а что он должен делать?
Наполнять первый уровень тривью?(кстати, если поискать по этому же форуму-полно объяснений почему рекомендуется строить только "необходимое отображать в данный момент")- так и этому полно примеров на этом же форуме

Дай перефразирую твой вопрос-"Есть таблица id,parentid,name. Нужны обобщенные методы по наполнению тривьюхи"
Так?

Тогда делается это примерно так:
Рисуется метод (ADDLEVEL) который будет строить уровень по переданному ParentID также этот метод добавит по одному "ФИКТИВНОМУ" узлу для всех имеющих потомков в таблице только для того чтобы появился крест(здесь извини лень вырезать .is_color и .is_ico считай что .F.)
Код: 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.
PARAMETERS INT_ID,IS_FIRST&&,REC_ID
******************

LOCAL CHAR_ID,INT_TEKID,COL_CHILD,tcNameImage,tcIs_first,tcIs_Image,tnTally
*CHAR_ID=IIF(VARTYPE(REC_ID)=='C',REC_ID,'_'+ALLTRIM(STR(INT_ID)))
CHAR_ID='_'+ALLTRIM(STR(INT_ID))
SELECT ID,PARENTID,NAME,TYPE,FICT FROM (THIS.ALIAS) WHERE PARENTID=m.INT_ID INTO CURSOR (THIS.TEMP_CURS) ORDER BY SORT
tnTally=_tally
LOCAL taArray(tnTally,5)
COPY TO ARRAY taArray 

FOR i=1 TO tnTally
 m.INT_TEKID=taArray(i,1)
 m.KEY_ITEM='_'+ALLTRIM(STR(taArray(i,1)))
 m.tcNameImage='im'+ALLTRIM(STR(taArray(i,4)))
 m.tcIs_first=IIF(IS_FIRST,',','m.CHAR_ID,4')
 m.tcIs_Image=IIF(this.is_ico,IIF(OCCURS(','+m.tcNameImage+',',This.listim)=1,',"'+m.tcNameImage+'"',''),'')
  TEXT TO tcTempText NOSHOW TEXTMERGE PRETEXT 15
    THIS.TREEVIEW.Nodes.Add(<<m.tcIs_first>>,m.KEY_ITEM,taArray(i,3)<<m.tcIs_Image>>) 
  ENDTEXT
  &tcTempText
  THIS.TREEVIEW.Nodes(m.KEY_ITEM).ForeColor = IIF(this.is_color,THIS.ForeColor,0)
  THIS.TREEVIEW.Nodes(m.KEY_ITEM).BackColor = IIF(this.is_color,THIS.BackColor,16777215)&&&16777215=RGB(255,255,255)

  SELECT COUNT(id) as count FROM (THIS.ALIAS) WHERE PARENTID = m.INT_TEKID INTO CURSOR rez
  m.COL_CHILD=rez.count
  USE IN rez
  IF m.COL_CHILD>0&&достраиваем фиктивный узел   
    THIS.TREEVIEW.Nodes.Add(m.KEY_ITEM,4,'F'+m.KEY_ITEM,'')
  ENDIF
*  ENDIF 
ENDFOR 




Метод EXPEND тривьюхи если есть фиктивный-удаляет его и строит следующий уровень, если нет значит ветвь уже построена ранее
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
*** ActiveX Control Event ***
LPARAMETERS node
LOCAL KEY_CHILD
KEY_CHILD=node.Child.key&&собственно первый// если есть фиктивный он один и он же первый
IF KEY_CHILD=='F'+node.key
   WITH THIS.PARENT
    .REMOVENODE(KEY_CHILD)
    .ADDLEVEL(.KEY_TO_ID(node.key))
   ENDWITH  
ENDIF 
node.expanded=.t.&&&на случай если метод вызывается программно   





Итого что может быть в ините..
Ну наверно ADDLEVEL(0,.T.)
ну если все таки хочется придать "полуразвернутый вид" пару EXPEND

А я вообще правильно тебя понял?
Если да то не ленись, пошукай по форуму-сее уже обсуждалось и не раз
...
Рейтинг: 0 / 0
Создание базы данных с Treeview
    #38584294
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ClaymoreВладимирМ,

Только "Вариант 2" остальные исключаются!
Это Вы сейчас так думаете. Причем, насколько я понимаю, думаете только Вы. Мнением пользователей Вы не интересовались. О чем я и говорю. TreeView - друг ОДНОГО человека. В данном случае персонально Ваш.

ClaymoreЯ тут подумал, правильнее таблица будет выглядеть так:
Не то, чтобы описанная структура была не правильной, но она избыточна. Вам придется кроме генерации значения id еще как-то "сконструировать" генератор значения key.

Да, TreeView требует в качестве значения ключа узла символьное значение. Но ведь можно символьное значение получать "на лету" (в процессе построения дерева) из числового значения id. Например, переведя id в строку и добавив какой-нибудь символ. Например, "_".

Другими словами, вполне достаточно будет иметь такую структуру

Код: sql
1.
2.
3.
4.
5.
6.
7.
create cursor curTest (id i, parentid i, znachenie c(50))
insert into curTest (id, parentid, znachenie) values (1, 0, "Node 1")
insert into curTest (id, parentid, znachenie) values (2, 0, "Node 2")
insert into curTest (id, parentid, znachenie) values (3, 1, "Node 1A")
insert into curTest (id, parentid, znachenie) values (4, 1, "Node 1B")
insert into curTest (id, parentid, znachenie) values (5, 2, "Node 2A")
insert into curTest (id, parentid, znachenie) values (6, 2, "Node 2B")


А при заполнении TreeView формировать значение ключа примерно так

Код: sql
1.
key = "_"+ltrim(str(id))



ClaymoreНе могу сообразить как правильно написать код в init формы form1, помогите)

Существует 2 принципиальные стратегии заполнения TreeView

Вариант 1

Сразу заполнить все узлы дерева на всех уровнях вложенности

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

Правда, понятие "много узлов" сильно зависит от железа. Т.е. "много" - это когда время открытия формы больше 2..3 секунд. А сколько узлов можно успеть создать за это время напрямую зависит от используемого железа. От структуры дерева и алгоритма его наполнения время построения дерева зависит слабо.

Вариант 2

При открытии формы заполняется только первый уровень. А остальные уровни заполняются "по требованию". Обычно в момент первого раскрытия соответствующего узла. Так работает проводник в Windows.


Оба варианта требуют не очевидного программирования. Не сложного, а именно не очевидного. Не привычного.

Сразу заполнить все узлы дерева на всех уровнях вложенности

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

idparentid102153102150

Т.е. не получится просто просканировать таблицу сверху вниз и последовательно создавать узлы в дереве. Необходимо сначала "выстроить" записи в нужной последовательности. Замечу, что "хитрый индекс" здесь не поможет.

Если не создавать дополнительных полей сортировки с "обвязкой" в виде триггеров для поддержания этих полей в актуальном состоянии, то возможны два решения

1. Рекурсия
2. "Бесконечный" цикл с исключением ранее использованных значений

Системным ограничением FoxPro является ограничение на количество процедур, вызванных одна из другой. В данном случае это означает ограничение на количество рекурсий или количество уровней дерева. Для VFP9 - по умолчанию не более 128 вложенных процедур. Для младших версий - не более 32.

Если рассматривать решение с бесконечным циклом, то можно так

Код: sql
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.
* Делаем выборку во временную таблицу из исходной таблицы (исходная - это та, что в начале данного поста)
* добавляя два поля-флага, которые будут определять факт использования записи
select id, parentid, znachenie, .f. as isBuild, .f. as isParent ;
from curTest ;
into cursor curBuild readWrite

Local lnParentId, lcKey, lcParentId

* Первый родитель имеет код 0
* поскольку искать будем дочерние узлы, то это значение в поле ParentId
lnParentId = 0
lcParentId = "_" + ltrim(str(m.lnParentId))

* Для корректного входа в цикл выполняю поиск первой дочерней записи указанного родителя
select curBuild
locate for ParentId = m.lnParentId and isBuild = .F.

* Организую "бесконечный" цикл по факту нахождения записи
do while found('curBuild')

	* Перебираю все узлы, относящиеся напрямую к указанному родителю
	select curBuild
	scan for ParentId = m.lnParentId and isBuild = .F.
	    * Создаем узел в объекте TreeView, предполагая, что он лежит непосредственно на форме
	    * и имеет имя TreeView1
	    lcKey = "_" + ltrim(str(curBuild.id))
	    if m.lnParentId = 0
	         thisForm.TreeView1.Nodes.add(,,m.lcKey, alltrim(curBuild.znachenie))
	    else
	         thisForm.TreeView1.Nodes.add(m.lcParentId,4,m.lcKey, alltrim(curBuild.znachenie))
	    endif

	    * Помечаем запись как использованную при создании узла в TreeView
	    replace isBuild with .T.
	endscan

	* Помечаю запись с использованным кодом родителя 
	select curBuild
	locate for id = m.lnParentId
	if found('curBuild')
	    replace isParent with .T.
	endif

	* Беру нового родителя среди уже использованных при построении дерева
	select curBuild
	locate for isBuild = .T. and isParent = .F.

	* Обновляю значения кодов очередного родителя
	lnParentId = curBuild.id
	lcParentId = "_" + ltrim(str(m.lnParentId))

enddo
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Создание базы данных с Treeview
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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