powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / TreeView
16 сообщений из 16, страница 1 из 1
TreeView
    #33879609
splayn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте все!. :) :) :)
Аннотация: Заметил забавную вещь, что когда заполняется, приблизительно минуту, TreeView и процессор загружен не полностью, то это дерево можно уже просматривать, листать...
Вопрос: Можно ли организовать заполнение дерева через отдельный поток, чтобы даже во время заполнения, дерево можно было юзать? Заранее благодарен.
...
Рейтинг: 0 / 0
TreeView
    #33880493
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
splaynЗдравствуйте все!. :) :) :)
Аннотация: Заметил забавную вещь, что когда заполняется, приблизительно минуту, TreeView и процессор загружен не полностью, то это дерево можно уже просматривать, листать...
Вопрос: Можно ли организовать заполнение дерева через отдельный поток, чтобы даже во время заполнения, дерево можно было юзать? Заранее благодарен.А чем не устраивает классическая технология заполнения дерева по частям?
...
Рейтинг: 0 / 0
TreeView
    #33881091
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UrriА чем не устраивает классическая технология заполнения дерева по частям?
А как вы в этом случае организуете поиск по дереву ? Или курсор - источник данных для TreeView всегда читается полностью?
С уважением, Алексей.
...
Рейтинг: 0 / 0
TreeView
    #33881482
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K UrriА чем не устраивает классическая технология заполнения дерева по частям?
А как вы в этом случае организуете поиск по дереву ? Или курсор - источник данных для TreeView всегда читается полностью?
С уважением, Алексей.
Я работаю по такой схеме:

При работе с деревом любой поиск организуется в таблицах-источниках (курсорах) на основании которых это дерево построено. Далее делается проверка того факта, что найденный узел физически создан в дереве. Если "нет", то достраиваются недостающие узлы.

По любому это работает быстрее, чем полное заполнение дерева и поиск узла в дереве.
...
Рейтинг: 0 / 0
TreeView
    #33883372
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
Я работаю по такой схеме:
При работе с деревом любой поиск организуется в таблицах-источниках (курсорах) на основании которых это дерево построено. Далее делается проверка того факта, что найденный узел физически создан в дереве. Если "нет", то достраиваются недостающие узлы.

По любому это работает быстрее, чем полное заполнение дерева и поиск узла в дереве.
А если элемента действительно нет, читается весь источник данных? Не так ли?. Т.е. ваш быстрый построитель дерева "работает" до первого неудачного поиска.
С уважением, Алексей
...
Рейтинг: 0 / 0
TreeView
    #33883480
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K ВладимирМ
Я работаю по такой схеме:
При работе с деревом любой поиск организуется в таблицах-источниках (курсорах) на основании которых это дерево построено. Далее делается проверка того факта, что найденный узел физически создан в дереве. Если "нет", то достраиваются недостающие узлы.

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

Это Вы о чем?

Поиск по источнику данных - это оптимизируемый процесс. Поиск по собственно TreeView - заведомо НЕ оптимизируемый процесс.

Если узла нет, SEEK() (или запрос) по таблице источнику вернет .F. практически мгновенно. По крайней мере здесь есть поле для оптимизации (ускорения).

При сканировании TreeView придется просканировать ВСЕ узлы, а это заведомо ОЧЕНЬ медленный процесс. Более того, здесь НЕТ поля для оптимизации. Придется сканировать именно все и именно одним единственным способом.

FoxPro "заточен" под работу с таблицами. Поиск в оперативной памяти (массивы, коллекции), в общем случае, заведомо более медленная операция, чем поиск по таблицам или курсорам (кроме весьма специфических ситуаций)


Если речь идет об операции построения дерева "по требованию", то схема такая:

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

По сути, формируются только те узлы дерева, которые реально просматриваются пользователем.
...
Рейтинг: 0 / 0
TreeView
    #33883494
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно.. Т.е. источник данных для TreeView вы читатет всегда весь, а строите дерево по мере раскрытия.
Способ хорош, если данные уже полностью "лежат" в локальном источнике, но не очень удобен, когда данные "лежат" на сервере (клиент-сервер) и данных не мало.
С уважением, Алексей
...
Рейтинг: 0 / 0
TreeView
    #33883522
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KПонятно.. Т.е. источник данных для TreeView вы читатет всегда весь, а строите дерево по мере раскрытия.
Способ хорош, если данные уже полностью "лежат" в локальном источнике, но не очень удобен, когда данные "лежат" на сервере (клиент-сервер) и данных не мало.
С уважением, Алексей
Алексей, ну пожалуйста, прежде чем возражать, прикиньте, как можно решить проблему и исходите из предположения, что оптимальное (в смысле быстрое) решение уже существует.

Данные лежат на сервере. Зачем мне для поиска качать на клиент ВСЕ данные? А ведь для того, чтобы просто построить ВСЕ дерево именно это и надо будет проделать (!)

При открытии формы я выкачал с сервера только данные по первому уровню. Для поиска записи я выполняю хранимую процедуру на сервере по нужным параметрам и получаю код искомого узла (или ничего не получаю, если такого нет). Далее достраиваю только необходимые узлы.
...
Рейтинг: 0 / 0
TreeView
    #33883542
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир, именно это я хотел уcлышать. Значит мы строим дерево для больших таблиц одинаково. Правда я закачиваю не только первый уровень, но уровень +1. Мне так удобнее. Картинкой Node я даю понять есть ли следующие уровни у данного Node.
С уважением, Алексей
...
Рейтинг: 0 / 0
TreeView
    #33894430
splayn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Если узла нет, SEEK() (или запрос) по таблице источнику вернет .F. практически мгновенно. По крайней мере здесь есть поле для оптимизации (ускорения).

Синтаксис покажите... пожалуста, все мои попытки найти по SEEK(node.key) увенчались лишь сообщением о неверной индексации.... а в МСДН не нашел.
...
Рейтинг: 0 / 0
TreeView
    #33894597
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
splayn ВладимирМ
Если узла нет, SEEK() (или запрос) по таблице источнику вернет .F. практически мгновенно. По крайней мере здесь есть поле для оптимизации (ускорения).

Синтаксис покажите... пожалуста, все мои попытки найти по SEEK(node.key) увенчались лишь сообщением о неверной индексации.... а в МСДН не нашел.
1. А как вы формируете Key для Node?
2. А есть ли у вас индекс по таблице, где вы используете SEEK и соответствует ли он Key Node?
С уважением, Алексей.
...
Рейтинг: 0 / 0
TreeView
    #33894649
splayn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-K splayn ВладимирМ
Если узла нет, SEEK() (или запрос) по таблице источнику вернет .F. практически мгновенно. По крайней мере здесь есть поле для оптимизации (ускорения).

Синтаксис покажите... пожалуста, все мои попытки найти по SEEK(node.key) увенчались лишь сообщением о неверной индексации.... а в МСДН не нашел.
1. А как вы формируете Key для Node?
2. А есть ли у вас индекс по таблице, где вы используете SEEK и соответствует ли он Key Node?
С уважением, Алексей.
Есть индекс в таблице, но данные выбираются рекурсивно, а если так строить дерево, когда строится сначала верхний уровень, а потом подуровни, то проблем нет... но нужно отображать все ветки из таблицы, к которым есть привязка определенных записей. Уровень вложенности не имеет значения.
...
Рейтинг: 0 / 0
TreeView
    #33895434
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как Вы организуете связь между узлом в дереве и записью таблицы? Т.е. как Вы определяете, что вот этот узел TreeView был построен на основании данных из вот этой записи?
...
Рейтинг: 0 / 0
TreeView
    #33895877
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KВладимир, именно это я хотел уcлышать. Значит мы строим дерево для больших таблиц одинаково. Правда я закачиваю не только первый уровень, но уровень +1. Мне так удобнее. Картинкой Node я даю понять есть ли следующие уровни у данного Node.
С уважением, АлексейОпять же, если хочется чтобы картинка Node или как бишь ее, всегда показывала правильно, есть ли следующие уровни у данного Node, все неоднозначно. В иных задачах быстрее просто проверить факт, что у данного уровня есть хотя бы один подуровень. А в иных, возможно, и правда быстрее будет построить по всем узлам уровень+1.
Самое быстрое решение - рисовать плюсик независимо от того, есть подуровни или нет. Там разберемся (щелкнем и поймем). Но это решение уж не самое удобное, факт.
Короче, дерево дереву рознь, и здесь нет универсального решения.
...
Рейтинг: 0 / 0
TreeView
    #33897027
splayn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМКак Вы организуете связь между узлом в дереве и записью таблицы? Т.е. как Вы определяете, что вот этот узел TreeView был построен на основании данных из вот этой записи?

Добавление объекта:
r и p - идентификационные номера.(типа r=2006000001 и p=2006000002)
thisform.o1.olecontrol3.Nodes.Add('1_'+transform(r)+'.'+TRANSFORM(p), 4, '1_'+transform(&k_id_tree)+'.'+transform(&k_id_parent), padr(ALLTRIM(GETWORDNUM(&k_famil,1,'-')),18,' ')+' '+DTOC(&k_dat_kontrl)+IIF(&k_podpis,' ! ',' ? ')+ALLTRIM(&k_nam_uzlov),0)

Позиционирование в таблице:
SELECT gurnal_xoz
LOCATE FOR gurnal_xoz.id_gurnal_x=VAL(SUBSTR(Node.Key,3,AT('.',Node.Key)-3))
...
Рейтинг: 0 / 0
TreeView
    #33897150
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, так какие проблемы вместо LOCATE использовать SEEK() в случае существования индекса по полю id_gurnal_x

Код: plaintext
SEEK(VAL(SUBSTR(Node.Key, 3 ,AT('.',Node.Key)- 3 )),"gurnal_xoz","id_gurnal_x")

Здесь я предполагаю, что в таблице gurnal_xoz создан индекс по полю id_gurnal_x, который так и называется id_gurnal_x.

Нагружать Key узла вспомогательной информацией нет никакой необходимости. Оставьте в значении Key только идентификатор записи таблицы. Всю вспомогательную информацию потом можно будет вытащить из найденной записи таблицы.

Зато упростится процесс поиска нужного узла в дереве. Примерно так:

Код: plaintext
1.
2.
3.
4.
5.
LOCAL lcNodeKey
lcNodeKey = ...
IF TYPE("ThisForm.o1.olecontrol3.Nodes(m.lcNodeKey)") <> "O"
* Нет узла со значением ключа равным m.lcNodeKey
ENDIF

Всю дополнительную информацию по узлу (если это необходимо), можно записать в свойство TAG узла. Это поле комментария. Оно никак не влияет на работу собственно TreeView.

Код: plaintext
1.
2.
3.
LOCAL loNode
loNode = ThisForm.o1.olecontrol3.Nodes.Add(...)
loNode.Tag = "А это примечание"

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

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


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