forum.rastrnet.ru  

Вернуться   forum.rastrnet.ru > Компьютеры и всё, что с ними связано > Программируем

 Сообщения за день       Добавить альбом       Поиск      Правила форума  


Ответ
 
Опции темы Опции просмотра
Старый 09.06.2006, 21:48   #1
МункаЛунка
Чужая
 
Аватар для МункаЛунка
 
Регистрация: 10.06.2005
Сообщений: 332
Отправить сообщение для МункаЛунка с помощью ICQ
По умолчанию Delphi

Подскажите как реализовать задумку
Имеется таблица (БД) TTree.db, состоит из 3 полей: ID class - key (integer), Name (alpha), Papa (integer). Имеет вид, как на рис. 1.
Мне требуется: чтобы по данной таблице строилось дерево (как в проводнике в Windows) - рис. 2 - то, что мне необходимо, но это вручную прорисованно. Что для этого нужно? Предоставляю текст, который есть сейчас:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids, ExtCtrls, ImgList, ComCtrls,
ToolWin, StdCtrls, Buttons;

type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Table1: TTable;
TreeView1: TTreeView;
ImageList1: TImageList;
Splitter1: TSplitter;
Splitter2: TSplitter;
ToolBar1: TToolBar;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
SpeedButton1: TSpeedButton;
procedure SpeedButton1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SpeedButton1Click(Sender: TObject); // кнопка выхода из программы
begin
Close;
end;
procedure TForm1.BitBtn1Click(Sender: TObject); // для кнопки "Добавить папку"
var
CaptionStr:String;
NewNode:TTreeNode;
begin
CaptionStr:='';
if not InputQuery('Ввод имени', 'Введите заголовок папки',CaptionStr) then exit;
NewNode:=TreeView1.Items.Add(TreeView1.Selected, CaptionStr);
if NewNode.Parent<>nil then
NewNode.ImageIndex:=1;
end;

procedure TForm1.BitBtn2Click(Sender: TObject); // для кнопки "Добавить подпапку"
var
CaptionStr:String;
NewNode:TTreeNode;
begin
CaptionStr:='';
if not InputQuery('Ввод имени подпапки',
'Введите заголовок подпапки',CaptionStr) then exit;
NewNode:=TreeView1.Items.AddChild(TreeView1.Selected, CaptionStr);
if NewNode.Parent<>nil then
NewNode.ImageIndex:=1;
end;

procedure TForm1.BitBtn4Click(Sender: TObject); // для кнопки "Редактировать заголовок"
var
CaptionStr:String;
begin
CaptionStr:='';
if not InputQuery('Ввод имени',
'Введите заголовок элемента',CaptionStr) then exit;
TreeView1.Selected.Text:=CaptionStr;
end;

procedure TForm1.BitBtn3Click(Sender: TObject); // процедура для кнопки "Удалить"
begin
if TreeView1.Selected<>nil then
TreeView1.Items.Delete(TreeView1.Selected);
end;

end.
__________________
Телефонный меланхолик.

Последний раз редактировалось МункаЛунка; 13.09.2006 в 08:31.
МункаЛунка вне форума   Ответить с цитированием
Старый 10.06.2006, 00:38   #2
COBEHOK
Новичок
 
Регистрация: 17.08.2004
Сообщений: 780
По умолчанию

1. В поле "Parent" корневых узлов помещаешь 0.
2. При создании формы делаешь "select * from tree where (parent=0)" и заполняешь ими дерево. В поле lParam каждого узла (смотри структуру TVITEM) помещаешь значение ID. В поле nChildren помещаешь 1
3. При попытки разворачивания ветки (событие TVN_ITEMEXPANDING) проверяешь флаг TVS_EXPANDEDONCE узла. Если он установлен, значит узел уже разворачивался и вся информация в него записана, если нет, то пункт 4.
4. получаешь значение ID и делаешь запрос "select * from tree where (parent=id)". Если кол-во записей больше нуля вставляешь их в дерево как в пункте 1. Если ноль, то делаешь SetItem(tvitem) для узла дерева поместив в в поле nChildren 0 (плюсик напротив ветки должен исчезнуть)

Общий алгоритм примерно такой. Из плюсов - не нужно при запуске перелопачивать всю таблицу. Она будет читатся кусками по мере необходимости. Нужно только проиндексировать поле "parent".
И имена поле с пробелами лучше не делать. В крайнем случае назови ID_class

Последний раз редактировалось COBEHOK; 10.06.2006 в 10:22.
COBEHOK вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книжки по Delphi CyCaHuH Техническая библиотека 6 22.11.2008 17:21
Delphi Chamal Программируем 13 19.06.2007 20:47
Компоненты для DELPHI 7 FATALITY Поиск 1 18.06.2007 07:27
Borland Delphi PAPA_KARLO Поиск 19 28.04.2007 22:29
Литература в эл. виде по Delphi 7 Leon Программируем 3 05.03.2005 23:46


Текущее время: 15:40. Часовой пояс GMT +7.


Powered by vBulletin® Version 3.8.4 Patch Level 5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Форум открыт в июле 2004 г.
Кошки и котята Красноярска и Сибири Живой Мир Сибири