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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2008, 14:38   #1
Constellation
Пользователь
 
Регистрация: 14.11.2007
Сообщений: 61
Вопрос TreeView и БД

Возможно ли организовать связь между деревом и БД таким образом, чтобы значения нулевого уровня записывались в одну базу, а значения первого - в другую, причем чтобы после нового открытия формы происходила правильная загрузка из баз и иерерхия сохранялась???
Constellation вне форума Ответить с цитированием
Старый 21.04.2008, 15:08   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Посмотрите
http://programmersclub.ru/files/dfaq.rar
У меня там именно так и организовано (только не в разные БД (???), а в разные таблицы одной БД).
Если устроит, объясню.
mihali4 вне форума Ответить с цитированием
Старый 21.04.2008, 15:38   #3
Constellation
Пользователь
 
Регистрация: 14.11.2007
Сообщений: 61
По умолчанию

Ой, Вы знаете, было бы вообще великолепно услышать пояснения. Думаю, это то, что мне нужно =)
Constellation вне форума Ответить с цитированием
Старый 21.04.2008, 15:50   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Тогда - структура таблиц:
TableTema
Id - autoincrement
Tema - string
TableRazdel
Id - autoincrement
IdTema - integer
Razdel - string
TableQuestion
Id - autoincrement
IdRazdel - integer
Question - string
Answer - memo
Процедура чтения базы:
Код:
procedure Tfmain.GetTree;
var nnod,nnor: TTreeNode;
    MyRecPtr: PMyRec;
    rnum,wnum: integer;
begin
TreeView.Items.BeginUpdate;
PLoad.Caption:='Подождите. Загрузка базы';
PLoad.Visible:=True;
Gauge.Visible:=PLoad.Visible;
Application.ProcessMessages;
rnum:=TQuest.RecordCount;
wnum:=0;
Gauge.Progress:=wnum;
Gauge.MaxValue:=rnum;
TreeView.SortType:=stNone;
TreeView.Items.Clear;
TTema.First;
if TTema.RecordCount>0 then
begin
while not TTema.Eof do
begin
New(MyRecPtr);
MyRecPtr^.FName:=TTemaId.Value;
MyRecPtr^.LName:='Tema';
MyRecPtr^.KName:=True;
nnod:=TreeView.Items.AddObject(nil, TTemaTema.Text, MyRecPtr);
TRazdel.Filter:='IdTema='+IntToStr(TTemaId.Value);
if TRazdel.RecordCount>0 then
begin
TRazdel.First;
while not TRazdel.Eof do
begin
New(MyRecPtr);
MyRecPtr^.FName:=TRazdelId.Value;
MyRecPtr^.MName:=TRazdelIdTema.Value;
MyRecPtr^.LName:='Razd';
MyRecPtr^.KName:=True;
nnor:=TreeView.Items.AddChildObject(nnod, TRazdelRazdel.Text, MyRecPtr);
TQuest.Filter:='IdRazdel='+IntToStr(TRazdelId.Value);
if TQuest.RecordCount>0 then
begin
TQuest.First;
while not TQuest.Eof do
begin
New(MyRecPtr);
MyRecPtr^.FName:=TQuestId.Value;
MyRecPtr^.MName:=TQuestIdRazdel.Value;
MyRecPtr^.LName:='Quest';
MyRecPtr^.KName:=TQuestFull.Value;
TreeView.Items.AddChildObject(nnor, TQuestQuestion.Text, MyRecPtr);
Inc(wnum);
Gauge.Progress:=wnum;
Application.ProcessMessages;
TQuest.Next;
end;
end;
TRazdel.Next;
end;
end;
TTema.Next;
end;
end;
TTema.Filter:='';
TRazdel.Filter:='';
TQuest.Filter:='';
Gauge.Visible:=False;
Application.ProcessMessages;
TreeView.SortType:=stText;
TreeView.Items.EndUpdate;
Application.ProcessMessages;
TreeView.Items.GetFirstNode;
GetLast(lastnod);
TreeView.Selected:=lastnode;
Application.ProcessMessages;
end;
В таком вот духе. Под себя, думаю, подгоните...
Объекты для нодов, если не нужны, исключите.
mihali4 вне форума Ответить с цитированием
Старый 21.04.2008, 16:11   #5
Constellation
Пользователь
 
Регистрация: 14.11.2007
Сообщений: 61
По умолчанию

Спасибо, попробую разобраться 8)
Constellation вне форума Ответить с цитированием
Старый 21.04.2008, 18:43   #6
Constellation
Пользователь
 
Регистрация: 14.11.2007
Сообщений: 61
По умолчанию

Можно еще пару вопросов?
Объясните, пожалуйста, что понимается под MyRecPtr и Gauge?
Constellation вне форума Ответить с цитированием
Старый 21.04.2008, 19:03   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Gauge - это стандартный компонент ТGauge...
MyRecPtr - указатель на экземпляр записи MyRec.
Вот его объявление:
Код:
type
PMyRec = ^TMyRec;
TMyRec = record
  FName, MName: longint;
  LName: string;
  KName: boolean;
end;
Это - для хранения информации об объекте, связанном с конкретной TNode (мне она понадобилась для упрощения поиска в дереве).
Я вам указал - если объекты не нужны - выкиньте их.
Тогда и соответствующие методы у вас немного изменятся, например
не TreeView.Items.AddChildObject, а TreeView.Items.AddChild.
Про это есть в хэлпе...

Последний раз редактировалось mihali4; 11.03.2010 в 14:11.
mihali4 вне форума Ответить с цитированием
Старый 23.04.2008, 15:39   #8
Constellation
Пользователь
 
Регистрация: 14.11.2007
Сообщений: 61
По умолчанию

Теперь встала другая проблема, над которой бьюсь уже второй день. Все хорошо, когда на создание формы происходит загрузка дерева из БД. Но сейчас я не могу редактировать и добавлять записи. Если раньше, ограничивая количество дочерних уровней, я использовала параметр level или значение индекса, то теперь я не могу понять, как эти данные отображаются в дереве, то есть как их идентифицировать, поскольку уже ни тот, ни другой параметры просто не определяются. В результате получается добавлять в режиме редактирования только родительский уровень. Что тут можно сделать?
Constellation вне форума Ответить с цитированием
Старый 23.04.2008, 17:18   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Constellation Посмотреть сообщение
В результате получается добавлять в режиме редактирования только родительский уровень. Что тут можно сделать?
Поработайте с моей программкой (включите режим администратора). Там добавление, редактирование и удаление производятся на любом уровне. Идентификация происходит как раз по объектным данным ноды. В частности, там содержится информация об уровне (типе) и конкретном идентификаторе записи. А имея его, можно добавить дочернюю запись.
Надеюсь, добавление дочерних нодов в дерево у вас затруднения не вызывает...
mihali4 вне форума Ответить с цитированием
Старый 23.04.2008, 23:43   #10
Constellation
Пользователь
 
Регистрация: 14.11.2007
Сообщений: 61
По умолчанию

Действительно, все оказалось не так страшно и сложно, стоило просто немного посидеть и разобраться 8) Спасибо Вам ОГРОМНОЕ!!!!!!!!!! Все сделала =)
Constellation вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TreeView _SERGEYX_ Общие вопросы Delphi 1 01.09.2008 17:29
Treeview forzi Помощь студентам 4 04.05.2008 23:50
TreeView и текст Stanislav Общие вопросы Delphi 5 28.03.2008 00:25
вопрос по TreeView Cyn4uk Общие вопросы Delphi 10 23.12.2007 21:34