![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Заблокирован
Форумчанин
Регистрация: 30.12.2009
Сообщений: 544
|
![]()
Приветствую всех!
Просьба не смеяться, что задача банальная и дочитать до конца. Допустим,имеется 1 таблица базы со следующими полями: ID - идентификатор записи, тип строка (например, ID='A'); ParentID - ссылка на ID отца, тип строка. Name - имя записи,строка. Проблема в том,что алгоритм не работает,если ID и ParentID строки (а вот если числа - всё в порядке,хотя по логике действий ему вроде бы должно быть пофиг числа там или строки). Вся проблема в строчке TreeNode:=TreeCompanies.Items.AddCh ildObject(Node , qTreeCompanies.FieldByName('Name'). AsString , Pointer(qTreeCompanies.FieldByName( 'ID').AsString)); - здесь создаётся объект-потомок узла Node,в Node.Data по идее значение строкового ID должно запомниться,а не запоминается! Числового запоминается,а строкового нет! Вот код построения дерева из БД,немного переделал для себя,взято из статьи "DBTreeView своими руками". Код:
Темы для WordPress. Русские WordPress шаблоны
|
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 26.07.2009
Сообщений: 216
|
![]()
Запоминать в TTreeNode.Data адрес начала динамического массива (а string - это и есть динамический массив с точки зрения памяти) бессмысленно. Тем более что следом идет оператор qTreeCompanies.Next;
Что за адрес будет в Data предыдущего ноуда после его выполнения? Вопрос риторический. Если уж обойтись без строковых идентификаторов никак нельзя, то надо запоминать в Data экземпляры класса, каждый из которых в своем поле (свойстве) будет содержать нужный строковый ID. |
![]() |
![]() |
![]() |
#3 | |
Заблокирован
Форумчанин
Регистрация: 30.12.2009
Сообщений: 544
|
![]() Цитата:
Когда в TreeNode:=TreeCompanies.Items.AddCh ildObject(Node, qTreeCompanies.FieldByName('Name'). AsString ,Pointer(MyID.id)) пишу просто MyID Delphi на строчках MyID := TnID.Create(); IF Node = nil Then MyID.ID:='O' Else MyID.ID:=String(Node.Data); qTreeCompanies.Close; ругается Acess Violation in ... Код:
Темы для WordPress. Русские WordPress шаблоны
|
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 26.07.2009
Сообщений: 216
|
![]()
Та же ошибка - попытка записать в Data указатель на строку.
Вместо Pointer(MyID.id)) пишем: ..., TObject(MyID)). При "вытаскивании" строки из Data (как пример): Код:
|
![]() |
![]() |
![]() |
#5 |
Заблокирован
Форумчанин
Регистрация: 30.12.2009
Сообщений: 544
|
![]()
Стало чуть лучше - но id запоминается для самых последних потомков и
так для всех узлов одинаково. Исходник, скриншот исходной таблицы и дерева: Код:
Темы для WordPress. Русские WordPress шаблоны
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 26.07.2009
Сообщений: 216
|
![]()
Вообще то, последний вопрос на другую тему, а по правилам его надо задавать в другой теме форума.
А чтобы предметно понять в чем дело, логика заполнения Treeview не шибко ясна. Зачем, например, на 1-м и 2-м уровнях одни и те же наименования? И без "фиктивных" ноудов как-то всю жизнь обходились. |
![]() |
![]() |
![]() |
#7 | ||
Заблокирован
Форумчанин
Регистрация: 30.12.2009
Сообщений: 544
|
![]()
Karabash так в том-то и дело,что при данных значениях не должно быть
Цитата:
"Фиктивные" ноуды нужны - т.к. заранее я не знаю есть ли вообще потомки или нет, ну чтоб "+" отображался. Узнаю,что у узла есть потомки - только при раскрытии на OnExpanding. P.S. Я и сам бы рад сделать ID и ParentID - числами - меньше мудрежа. Ну так требование к моей программе такое,что ID и ParentID - строки. Неймы могут быть одинаковыми,потому и ID - уникален. А вообще,в рабочей версии у меня ID - строка длиной 22 символа, которая генерится через GUID_CREATE(). И полей больше... А в TreeView загружается любая Firebird-таблица,содержащая поля ID, ParentID, Name ну и GRP - признак группы Цитата:
Сколько ищу пример, где ID и ParentID - строки, Name - строка и никаких Level(где хранится сколько у узла потомков) нету.
Темы для WordPress. Русские WordPress шаблоны
|
||
![]() |
![]() |
![]() |
#8 |
Заблокирован
Форумчанин
Регистрация: 30.12.2009
Сообщений: 544
|
![]()
Приношу извинения, что тема щас немного не соответствует разделу - так дело-то
в строчке TreeCompanies.Items.AddChildObject( Node , qTreeCompanies.FieldByName('Name'). AsString , Pointer(TObject(MyID)));
Темы для WordPress. Русские WordPress шаблоны
|
![]() |
![]() |
![]() |
#9 | |
Форумчанин
Регистрация: 26.07.2009
Сообщений: 216
|
![]() Цитата:
По-мне так надо выполнить один запрос к таблице и по результату построить TreeView. Без "мудрежа". Если СУБД Firebird, то конструкция qTreeCompanies.RecordCount из области фантастики. Академический прием "сканирования" полученного от запроса результата выглядит в общем случае так: Код:
|
|
![]() |
![]() |
![]() |
#10 | |
Заблокирован
Форумчанин
Регистрация: 30.12.2009
Сообщений: 544
|
![]() Цитата:
1) Сначало формируются корневые элементы (со значением ParentID='O' или '0000000000000000000', если хотите). 2) При раскрытии 1-й из веток дерева вновь запускается процедура ExpandLevel,где ей передаётся выбранный Node. 3)Тут уже определяются потомки этого Node и фиктивная ветвь удаляется, ветка раскрывается... В общем посмотрите http://http://www.delphikingdom.com/...?catalogid=488 и попробуйте запустить этот пример, когда у вас ID и ParentID строки,а не числа. Работает??? ![]() P.S. Про while not qTreeCompanies.Eof do - я знаю, "пока не кончились записи в запросе делать то-то". Так и RecordCount - тож есть, количество записей,кот. возвращает запрос Query.
Темы для WordPress. Русские WordPress шаблоны
|
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Куда отследить куда утекает память? | TwiX | Общие вопросы Delphi | 6 | 02.03.2010 03:10 |
Исчезает Date and Time Picker! | Klim Bassenger | Microsoft Office Excel | 17 | 24.11.2009 18:25 |
запустится и маментально исчезает в не куда | gaka1995 | Общие вопросы C/C++ | 8 | 24.08.2009 15:37 |