Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2010, 23:58   #1
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию БД +Treeview определить номер родительского раздела

Здраствуйте, пару часов порыл инет но подходяшего не нашёл.

Если кто сможет подскажите плз.
Суть проблемы: Использую Тривив + базу акцес.
тот фаил что используется для запоминания структуры тривив мне неподходит, в дальшнейшем придётся делать поиски поэтому наварганел такую таблицу для дублирования структуры тривив.

id (счётчик) -ади раздела
p-id (инегер) - ади родителя
name (текстовый) - название раздела
--------------------------------------------------------------------------
Привожу пример для наглядности

допустим у нас есть такая структура:

Раздел1
Раздел2
ПодРаздел21
Раздел3
Раздел4
Раздел5

в таблице этоу будит выглядеть так:

1 0 Раздел1
2 0 Раздел2
3 0 Раздел3
4 0 Раздел4
5 0 Раздел5
6 2 ПОдРаздел21
------------------------------------------------------------------------
И теперь сам вопрос: Как определить номер родительского раздела из базы даных при добавлении новго подраздела пользователем, т.е. как связать разделы с триви и записи БД???
(вот как узнать что "ПодРАздел21" пользователь хочет добавить имено во 2 раздел а не в третий или другой)

Прошу помоши своих мыслей уже нет... Наверное не хватает практики!

Заранее благодярю...

Последний раз редактировалось Dozent; 29.03.2010 в 00:01.
Dozent вне форума Ответить с цитированием
Старый 29.03.2010, 00:11   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вот тут я все подробненько разъяснял :
http://www.programmersforum.ru/showthread.php?t=17575

З.Ы. Если осталось непонятным - id заносим в качестве объекта.
Вот вам и жесткая привязка каждой ветки к базе...

Последний раз редактировалось mihali4; 29.03.2010 в 00:16.
mihali4 вне форума Ответить с цитированием
Старый 31.03.2010, 00:23   #3
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Спасибо за сылку почитал посмотрел...
Вообшем как я понимаю если сделать отображение из своего файла то будит проше работать.

Вот токо проблема с этим отображением

Код:
procedure readtree( intrn : integer; treenodetemp: ttreenode; ttree : ttreeview );
var
bflag: boolean;
begin
ADOQuery1.sql.clear;
bflag := false;
if intrn = -1 then
begin
ADOQuery1.sql.add('select id, p_id, name');
ADOQuery1.sql.add('from structure;');
ADOQuery1.open;
ADOQuery1.first;
intrn := ADOQuery1.fieldbyname('id').asinteger;
ADOQuery1.close;
ADOQuery1.sql.clear;
bflag := true;
end;
ADOQuery1.sql.add('select id, p_id, name');
ADOQuery1.sql.add('from structure where p_id = '+inttostr(intrn));
ADOQuery1.open;
ADOQuery1.first;
while not ADOQuery1.eof do
begin
if bflag = true then
readtree(ADOQuery1.fieldbyname('id').asinteger,ttree.items.addobject(nil, inttostr(ADOQuery1.fieldbyname('id').asinteger)
+':'+ inttostr(ADOQuery1.fieldbyname('p_id').asinteger)
+':'+ADOQuery1.fieldbyname('name').asstring, nil),
ttree)
else
readtree(ADOQuery1.fieldbyname('id').asinteger,
ttree.items.addchildobject(treenodetemp,
inttostr(ADOQuery1.fieldbyname('id').asinteger)+':'+
inttostr(ADOQuery1.fieldbyname('p_id').asinteger)+':'+
ADOQuery1.fieldbyname('name').asstring, nil),
ttree); //ðåêóðñèÿ
ADOQuery1.next;
end;
ADOQuery1.close;
ADOQuery1.destroy;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
readtree( -1, nil, TreeView1);
end;
Код взяли из вашего Dfaq.exe и подправил. При нажтии на кнопку отображения не происходит, при втором нажатии появляется ошибка

Цитата:
Access violation at address 0048AD54 in module "Project1.exe". Read of address 00000258
Dozent вне форума Ответить с цитированием
Старый 31.03.2010, 00:55   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ну вот, кусочек :
Код:
ttree.items.addchildobject(treenodetemp...
И это при том, что treenodetemp вы задаете как NIL...
Кому вы "детеныша" хотите добавить ?

Я вообще этот кусок не понимаю, как не понимаю и то, почему он проходит компиляцию :
Код:
else
readtree(ADOQuery1.fieldbyname('id').asinteger,
ttree.items.addchildobject(treenodetemp,
inttostr(ADOQuery1.fieldbyname('id').asinteger)+':'+
inttostr(ADOQuery1.fieldbyname('p_id').asinteger)+':'+
ADOQuery1.fieldbyname('name').asstring, nil),
ttree); //ðåêóðñèÿ
ADOQuery1.next;
end;

Последний раз редактировалось mihali4; 31.03.2010 в 01:03.
mihali4 вне форума Ответить с цитированием
Старый 31.03.2010, 01:03   #5
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Код:
ttree.items.addchildobject(ttree.Selected,
ПОлучается так надо? Но тут опять ошибка...

Цитата:
Access violation at address 00499090 in module "Project1.exe". Read of address 00000258
Цитата:
Я вообще этот кусок не понимаю, как не понимаю и то, почему он проходит компиляцию :
ПОчему он не должен пройти компиляцию? Что то не могу норм разобратся в этом коде...

НУ всмысле понимаю что он делает, а ошибки не вижу...

Последний раз редактировалось mihali4; 31.03.2010 в 01:08.
Dozent вне форума Ответить с цитированием
Старый 31.03.2010, 01:11   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Access violation - как правило, при обращении к чему-то несуществующему.
Пройдите по шагам вашу procedure readtree, найдите строку, после которой выдается ошибка.
Потом - еще раз, но уже с контролем всех переменных в этой строке.
mihali4 вне форума Ответить с цитированием
Старый 31.03.2010, 01:21   #7
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Код:
var
bflag: boolean;
begin
ADOQuery1.sql.clear; (после выполнения этой строки даже если изначально в строке скл есть чтонибудь)
bflag := false;
if intrn = -1 then
далее коментирую эту строку

Код:
if intrn = -1 then
begin
ADOQuery1.sql.add('select * from structure;');(после выполнения этой строки выдаёт ошибку)
ADOQuery1.open;
ADOQuery1.first;

Хм очень страная ошибка на очистку содержимого скл, неужели так кретично что нельзяа очистить пустую строку...

Последний раз редактировалось Dozent; 31.03.2010 в 01:27.
Dozent вне форума Ответить с цитированием
Старый 31.03.2010, 01:32   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ну попробуйте (я всегда именно так делаю) - не ADD, а вот так :
Код:
ADOQuery1.SQL.Text:='select id, p_id, name from structure;');
Хотя у вас, вроде бы, какие-то проблемы со строкой подключения...
Кстати, а ADOQuery1.Close вы не хотите делать в самом начале ?
mihali4 вне форума Ответить с цитированием
Старый 31.03.2010, 01:40   #9
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Цитата:
Кстати, а ADOQuery1.Close вы не хотите делать в самом начале ?
Зачем это делать?
Dozent вне форума Ответить с цитированием
Старый 31.03.2010, 01:50   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

"Хаароший" вопрос...
Вам никогда не приходилось обращаться к встроенной в Дельфи справке ?
Ну, тогда приведу пример из нее :
Цитата:
Delphi Object and Component Reference
SQL, ExecSQL example
___________________________________ ___________________
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('Delete from Country where Name = ''Argentina''');
Query1.ExecSQL;
По-простому, попытка любого изменения SQL без этого - сродни попытке замены поршневых колец на работающем двигателе...

Последний раз редактировалось mihali4; 31.03.2010 в 01:53.
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить номер клиента leontv Работа с сетью в Delphi 11 28.03.2010 23:19
В матрице определить номер и значение элемента. Tonik_A Паскаль, Turbo Pascal, PascalABC.NET 2 18.10.2009 13:53
Как определить номер выбранной строки в стринггриде Deathwatcher Общие вопросы Delphi 2 15.06.2009 14:40
определить номер текущей строки в synmemo LAGOX Компоненты Delphi 1 21.04.2009 01:25
Определить номер строки с наибольшей характеристикой. jenja Общие вопросы Delphi 2 26.03.2008 21:11