Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
y_s
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 31
1

Отображение дерева из базы данных

05.05.2014, 10:06. Просмотров 1191. Ответов 10
Метки нет (Все метки)

Помогите пожалуйста исправить программу.Решил добавить функцию для отображения дерева из базы данных в TreeView и тут началось самое интересное=). За раннее спасибо!
Delphi
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, FIBQuery, pFIBQuery, DB, Grids, DBGrids,
  FIBDataSet, pFIBDataSet, FIBDatabase, pFIBDatabase, math;
 
type
  TForm1 = class(TForm)
    DB: TpFIBDatabase;
    T: TpFIBTransaction;
    DSet: TpFIBDataSet;
    Grid: TDBGrid;
    DSr: TDataSource;
    Q: TpFIBQuery;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    TV: TTreeView;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  S: string;
  NN,NNN,i: integer;
  CurItem,NewItem: TTreeNode;
  id: integer;
  ID_Par: integer;
 
implementation
 
Function TForm1.CreateTree(Sender:TObject; OID:Integer; Par:TTreeNode) :BOOLEAN;
Var DIN_DS:DSet;
Begin
DIN_DS:=DSet.Create(Form1);
DIN_DS.Database:=NET_DB;
DIN_DS.Transaction:=NET_TR;
DIN_DS.UpdateTransaction:=NET_TR;
CreateTree:=TRUE;
with sender as DSet do begin
(sender as TpFibDataSet).Close;
SelectSQL.Clear;
SelectSQL.Add('select o.* from GIGA_TABLE o, MEGA_TABLE l where o.OID=l.right_and l.left_='+IntToStr(OID));
(sender as DSet).Open;
While not (sender as DSet).EOF DO
BEGIN
if Par=NIL then
CurItem:=Tree.Items.Add(Nil, (sender as DSet).FieldByName('NAME_').asString)
else Begin
CurItem:=Tree.Items.AddChild(Par, (sender as DSet).FieldByName('NAME_').asString)
CurItem.Expand(True);
End;
CurItem.Selected:=True;
CurItem.OverlayIndex:=(sender as DSet).FieldByName('OID').asInteger;
Application.ProcessMessages;
if CreateTree(DIN_DS,(sender as DSet).FieldByName('OID').asInteger,CurItem) then
begin end;
(sender as DSet).Next;
end;
end;
 
{$R *.dfm}
 
procedure Gen_S;
begin
S:='';
For i:=0 to NNN
Do
begin
NN:=RandomRange(65,90);
NNN:=RandomRange(3,8);
S:=S+Chr(NN+i);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Gen_S;
CurItem:=TV.Items.Add(Nil,S);
Q.SQL.Text:='insert into GIGA_TABLE (Class_,NAME_,INDEX_)  values (9,:S,0)';
Q.ParamByName('S').AsString:=S;
Q.ExecQuery;
Q.SQL.Text:= 'Select OID from GIGA_TABLE where OID=GEN_ID(gen_GIGA_TABLE_ID,0)';
Q.ExecQuery;
id:=Q.FieldByName('OID').AsInteger;
CurItem.OverlayIndex:=id;
Q.SQL.Text:='insert into MEGA_TABLE (Class_ID,LEFT_,Right_) values (9,:L,:R)';
Q.ParamByName('L').AsInteger:=0;
Q.ParamByName('R').AsInteger:=id;
Q.ExecQuery;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Gen_S;
CurItem:=TV.Selected;
Label1.Caption:=IntToStr(CurItem.Level);
NN:=CurItem.Level;
NewItem:=TV.Items.AddChild(CurItem,S);
CurItem.Expand(True);
Q.SQL.Text:='insert into GIGA_TABLE (Class_,NAME_,INDEX_)  values (9,:S,:N)';
Q.ParamByName('S').AsString:=S;
Q.ParamByName('N').AsInteger:=ID_Par;
Q.ExecQuery;
Q.SQL.Text:= 'Select OID from GIGA_TABLE where OID=GEN_ID(gen_GIGA_TABLE_ID,0)';
Q.ExecQuery;
id:=Q.FieldByName('OID').AsInteger;
CurItem.OverlayIndex:=id;
Q.SQL.Text:='insert into MEGA_TABLE (Class_ID,LEFT_,Right_) values (9,:L,:R)';
Q.ParamByName('L').AsInteger:=ID_Par;
Q.ParamByName('R').AsInteger:=id;
Q.ExecQuery;
end;
 
initialization randomize;
end.
Добавлено через 37 минут
Никак не могу отобразить дерево из базы данных IBExpert.БД имеет две таблицы:GIGA_TABLE(Поля:OID,NAME_,CLASS_,INDEX_),MEGA_TABLE(Поля: CLASS_ID,LEFT_,RIGHT_). Вывести дерево на TreeView хочу с помощью
Delphi
1
Function TForm1.CreateTree(Sender:TObject; OID:Integer; Par:TTreeNode) :BOOLEAN;
.Но программа сразу начинает ругаться((.
P.S.: Функцию в программе не вызывал.В дальнейшем необходимо вызвать её нажатием на кнопку Button1.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2014, 10:06
Ответы с готовыми решениями:

ComboBox и отображение базы данных DBGrid
Задача следующая: К примеру у меня есть ComboBox в котором Items (первая...

Как осуществить отображение картинки из базы данных в отчете FastReport?
Доброго времени суток всем, помогите пожалуйста в следующем вопросе. База...

При открытии базы данных FoxPro в приложение Delphi возникает ошибка драйвера внешней базы данных (8961)
При открытии базы данных FoxPro в приложение Delphi возникает ошибка драйвера...

Отображение дерева каталогов
Нужен код SelectDirectory, но чтоб окно было как на рисунке(с права). Проблема...

Вывод дат из базы в виде дерева
Подскажите как можно организовать такую функцию: имеется база данных, в ней в...

10
mss
2633 / 2258 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
05.05.2014, 10:17 2
Цитата Сообщение от y_s Посмотреть сообщение
Но программа сразу начинает ругаться
Не зажмуривайся аки барышня кисейная - читай текст "ругани", вникай в смысл)..
0
y_s
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 31
05.05.2014, 10:23  [ТС] 3
[Error] Unit1.pas(46): Undeclared identifier: 'NET_DB'.
Что присвоить NET_DB?
0
mss
2633 / 2258 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
05.05.2014, 10:43 4
Лучший ответ Сообщение было отмечено y_s как решение

Решение

объект TIBDatabase
1
y_s
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 31
05.05.2014, 11:45  [ТС] 5
исправил код,помогите пожалуйста при нажатии на кнопку Button3 запустить function?
Delphi
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
unit Unit1;
 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, FIBQuery, pFIBQuery, DB, Grids, DBGrids,
FIBDataSet, pFIBDataSet, FIBDatabase, pFIBDatabase, math;
 
type
TForm1 = class(TForm)
DB: TpFIBDatabase;
T: TpFIBTransaction;
DSet: TpFIBDataSet;
Grid: TDBGrid;
DSr: TDataSource;
Q: TpFIBQuery;
Button1: TButton;
Button2: TButton;
Button3: TButton;
TV: TTreeView;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
 
var
Form1: TForm1;
S: string;
NN,NNN,i: integer;
CurItem,NewItem: TTreeNode;
id: integer;
ID_Par: integer;
 
implementation
 
Function CreateTree(Sender:TObject; OID:Integer; Par:TTreeNode) :BOOLEAN;
Var DIN_DS: TpFIBDataSet; NET_DB:TpFIBDatabase; NET_TR:TpFIBTransaction; TV: TTreeView;
Begin
DIN_DS:=TpFIBDataSet.Create(Form1);
DIN_DS.Database:=NET_DB;
DIN_DS.Transaction:=NET_TR;
DIN_DS.UpdateTransaction:=NET_TR;
CreateTree:=TRUE;
with sender as TpFIBDataSet do begin
(sender as TpFIBDataSet).Close;
SelectSQL.Clear;
SelectSQL.Add('select o.* from GIGA_TABLE o, MEGA_TABLE l where o.OID=l.right_and l.left_='+IntToStr(OID));
(sender as TpFIBDataSet).Open;
While not (sender as TpFIBDataSet).EOF DO
BEGIN
if Par=NIL then
CurItem:=TV.Items.Add(Nil, (sender as TpFIBDataSet).FieldByName('NAME_').asString)
else
Begin
CurItem:=TV.Items.AddChild(Par, (sender as TpFIBDataSet).FieldByName('NAME_').asString) ;
CurItem.Expand(True);
End;
CurItem.Selected:=True;
CurItem.OverlayIndex:=(sender as TpFIBDataSet).FieldByName('OID').asInteger;
Application.ProcessMessages;
if CreateTree(DIN_DS,(sender as TpFIBDataSet).FieldByName('OID').asInteger,CurItem) then
begin end;
(sender as TpFIBDataSet).Next;
end;
end;
end;
 
 
{$R *.dfm}
 
procedure Gen_S;
var i: integer;
begin
S:='';
For i:=0 to NNN
Do
begin
NN:=RandomRange(65,90);
NNN:=RandomRange(3,8);
S:=S+Chr(NN+i);
end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Gen_S;
CurItem:=TV.Items.Add(Nil,S);
Q.SQL.Text:='insert into GIGA_TABLE (Class_,NAME_,INDEX_) values (9,:S,0)';
Q.ParamByName('S').AsString:=S;
Q.ExecQuery;
Q.SQL.Text:= 'Select OID from GIGA_TABLE where OID=GEN_ID(gen_GIGA_TABLE_ID,0)';
Q.ExecQuery;
id:=Q.FieldByName('OID').AsInteger;
CurItem.OverlayIndex:=id;
Q.SQL.Text:='insert into MEGA_TABLE (Class_ID,LEFT_,Right_) values (9,:L,:R)';
Q.ParamByName('L').AsInteger:=0;
Q.ParamByName('R').AsInteger:=id;
Q.ExecQuery;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Gen_S;
CurItem:=TV.Selected;
Label1.Caption:=IntToStr(CurItem.Level);
NN:=CurItem.Level;
NewItem:=TV.Items.AddChild(CurItem,S);
CurItem.Expand(True);
Q.SQL.Text:='insert into GIGA_TABLE (Class_,NAME_,INDEX_) values (9,:S,:N)';
Q.ParamByName('S').AsString:=S;
Q.ParamByName('N').AsInteger:=ID_Par;
Q.ExecQuery;
Q.SQL.Text:= 'Select OID from GIGA_TABLE where OID=GEN_ID(gen_GIGA_TABLE_ID,0)';
Q.ExecQuery;
id:=Q.FieldByName('OID').AsInteger;
CurItem.OverlayIndex:=id;
Q.SQL.Text:='insert into MEGA_TABLE (Class_ID,LEFT_,Right_) values (9,:L,:R)';
Q.ParamByName('L').AsInteger:=ID_Par;
Q.ParamByName('R').AsInteger:=id;
Q.ExecQuery;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
var Par:TTreeNode;
CreateTree(Par);
end;
 
 
initialization randomize;
end.
0
mss
2633 / 2258 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
05.05.2014, 12:00 6
Локальные переменные подпрограммы должны быть объявлены вне верхнеуровневого блока begin..end подпрограммы
1
y_s
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 31
05.05.2014, 12:08  [ТС] 7
Спасибо,не подметил.Но это роли не играет.Тут были мои тщетные попытки что-либо исправить,я просто забыл удалить эти строки.
Пытался разобраться в процедурах и функциях в Delphi, читал эту статью http://www.snkey.net/books/delphi/ch1-6.html.
Но в моём случае не могу понять как всё таки запустить функцию (видимо потому что не совсем понимаю её код). Вот незадача...
0
mss
2633 / 2258 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
05.05.2014, 12:44 8
Первая заповедь тру-разработчика - имена программных идентификаторов должны быть вменяемыми и нести смысловую нагрузку.

1. Замени имя формального параметра Par: TTreeNode на ARootNode: TTreeNode - этот параметр указывает функции корневой узел, откуда должно вырасти визуализируемое ею дерево.

2. Замени имя формального параметра Sender:TObject на TFIBDataSet - этот параметр указывает функции на готовый открытый объект-набор данных для визуализации дерева. Из тела ф-ции убери весь говнокод, занимающийся запросами к БД - все это должен делать внешний (по отношению к вызываемой функции) код.
1
y_s
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 31
05.05.2014, 13:29  [ТС] 9
Огромное спасибо за дельные советы,но я в программировании ноль.Всё на интуитивном уровне.Преподаватель задал это задание и поставил короткие сроки.В теории я понял то, что Вы хотите до меня донести, но практически я не знаю как это реализовать.Помогите пожалуйста переделать программу.Во вложении поместил сам проект и базу данных.Я буду Вам очень благодарен!
0
Вложения
Тип файла: rar База данных.rar (34.2 Кб, 8 просмотров)
Тип файла: rar Проект.rar (486.4 Кб, 8 просмотров)
mss
05.05.2014, 13:57
  #10

Не по теме:

У меня нет ни малейшего желания делать из чужого говнокода конфетку.
Обратись во Фриланс - там тут же найдется дюжина услужливых помощников)

0
y_s
0 / 0 / 0
Регистрация: 20.03.2013
Сообщений: 31
06.05.2014, 08:31  [ТС] 11
Стоило попробовать,думал,что люди добрые остались))Ну что ж, и на этом спасибо

Добавлено через 18 часов 31 минуту
Проблема решена,если кому интересно, вот листинг проекта:
Delphi
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, FIBQuery, pFIBQuery, DB, Grids, DBGrids,
  FIBDataSet, pFIBDataSet, FIBDatabase, pFIBDatabase, math;
 
type
  TForm1 = class(TForm)
    DB: TpFIBDatabase;
    T: TpFIBTransaction;
    DSet: TpFIBDataSet;
    Grid: TDBGrid;
    DSr: TDataSource;
    Q: TpFIBQuery;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    TV: TTreeView;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
      private
    { Private declarations }
  public
  Function CreateTree(Sender:TObject; OID:Integer; Par:TTreeNode) :BOOLEAN;
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  S: string;
  NN,NNN,i: integer;
  CurItem,NewItem: TTreeNode;
  id: integer;
  ID_Par: integer;
 
implementation
{$R *.dfm}
Function TForm1.CreateTree(Sender:TObject; OID:Integer; Par:TTreeNode) :BOOLEAN;
 
Var
DIN_DS: TpFIBDataSet;
 
Begin
DIN_DS:=TpFIBDataSet.Create(Form1);
DIN_DS.Database:=DB;
DIN_DS.Transaction:=T;
DIN_DS.UpdateTransaction:=T;
CreateTree:=TRUE;
with sender as TpFIBDataSet do begin
(sender as TpFIBDataSet).Close;
SelectSQL.Clear;
SelectSQL.Add('select o.* from GIGA_TABLE o , MEGA_TABLE l where o.OID=l.right_ and l.left_='+IntToStr(OID));
(sender as TpFIBDataSet).Open;
While not (sender as TpFIBDataSet).EOF DO
BEGIN
if Par=NIL then
CurItem:=TV.Items.Add(Nil, (sender as TpFIBDataSet).FieldByName('NAME_').asString)
else
Begin
CurItem:=TV.Items.AddChild(Par, (sender as TpFIBDataSet).FieldByName('NAME_').asString) ;
CurItem.Expand(True);
End;
CurItem.Selected:=True;
CurItem.OverlayIndex:=(sender as TpFIBDataSet).FieldByName('OID').asInteger;
Application.ProcessMessages;
if CreateTree(DIN_DS,(sender as TpFIBDataSet).FieldByName('OID').asInteger,CurItem) then
begin end;
(sender as TpFIBDataSet).Next;
end;
end;
end;
 
 
 
procedure Gen_S;
var i: integer;
begin
S:='';
For i:=0 to NNN
Do
begin
NN:=RandomRange(65,90);
NNN:=RandomRange(3,8);
S:=S+Chr(NN+i);
end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Gen_S;
CurItem:=TV.Items.Add(Nil,S);
Q.SQL.Text:='insert into GIGA_TABLE (Class_,NAME_,INDEX_)  values (9,:S,0)';
Q.ParamByName('S').AsString:=S;
Q.ExecQuery;
Q.SQL.Text:= 'Select OID from GIGA_TABLE where OID=GEN_ID(gen_GIGA_TABLE_ID,0)';
Q.ExecQuery;
id:=Q.FieldByName('OID').AsInteger;
CurItem.OverlayIndex:=id;
Q.SQL.Text:='insert into MEGA_TABLE (Class_ID,LEFT_,Right_) values (9,:L,:R)';
Q.ParamByName('L').AsInteger:=0;
Q.ParamByName('R').AsInteger:=id;
Q.ExecQuery;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
Gen_S;
CurItem:=TV.Selected;
ID_Par:=CurItem.OverlayIndex;
Label1.Caption:=IntToStr(CurItem.Level);
NN:=CurItem.Level;
NewItem:=TV.Items.AddChild(CurItem,S);
CurItem.Expand(True);
Q.SQL.Text:='insert into GIGA_TABLE (Class_,NAME_,INDEX_)  values (9,:S,:N)';
Q.ParamByName('S').AsString:=S;
Q.ParamByName('N').AsInteger:=ID_Par;
Q.ExecQuery;
Q.SQL.Text:= 'Select OID from GIGA_TABLE where OID=GEN_ID(gen_GIGA_TABLE_ID,0)';
Q.ExecQuery;
id:=Q.FieldByName('OID').AsInteger;
NewItem.OverlayIndex:=id;
Q.SQL.Text:='insert into MEGA_TABLE (Class_ID,LEFT_,Right_) values (9,:L,:R)';
Q.ParamByName('L').AsInteger:=ID_Par;
Q.ParamByName('R').AsInteger:=id;
Q.ExecQuery;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
DSet.Open;
if CreateTree(DSet,0,CurItem) then
begin end;
end;
 
initialization randomize;
end.
0
06.05.2014, 08:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2014, 08:31

Хранение и отображение *.pdf файлов из базы mysql
Всем привет. Ребята, такое дело, есть приложение на delphi 7.0, с базой mysql,...

Отображение фото из базы даных в поле Image
Добрый вечер подскажите как правильно прописать отображение полей с...

Экспорт данных из базы данных *.DB в Word через Table (DateSet)
Всем Hello! у меня проблема не могу выгрузить данные из DB через table много...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru