Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.09.2008, 18:59
SAWaGE SAWaGE вне форума
Прохожий
 
Регистрация: 09.09.2008
Сообщения: 34
Репутация: 10
По умолчанию Считываение БД в TreeView

Народ подскажите (лучше примером), как считать БД MSSQL в TreeView?
Ответить с цитированием
  #2  
Старый 22.09.2008, 19:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,095
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А тебе что конкретно нужно?
Структуру БД или все-таки данные из какой-то таблицы?
Ответить с цитированием
  #3  
Старый 22.09.2008, 20:06
SAWaGE SAWaGE вне форума
Прохожий
 
Регистрация: 09.09.2008
Сообщения: 34
Репутация: 10
По умолчанию

Взаимосвязь таблиц:
1.Главный Item -- "Year" -
2.Дочерний -- "Month"
3. ... -- "Realisation" ... и т.д

Хотя бы в общих чертах, от чего отталкиваться

Последний раз редактировалось SAWaGE, 22.09.2008 в 20:08.
Ответить с цитированием
  #4  
Старый 22.09.2008, 20:55
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,095
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Т.е. данные.
Тогда примерно так:
1. "Кладешь" TreeView.
2. При старте (открытии окна) загружаешь верхний уровень. Т.е. выполняешь запрос из Year и создаешь под него итемы. Для каждого итема в проперть Data кладешь ID соотв. записи и, ГЛАВНОЕ, создаешь подитем (пока пустой).
3. На открытие ветки (событие OnExpand) ставишь загрузку соотв. записей из дочерней таблицы, точно также ставя в Data ID и создавая подитемы (естественно, если уровнеь не последний).
4. Повторяешь с п.2., пока не будет написана загрузка всех уровней.

Тут есть еще один момент - как идентифицировать уровень. Я для этого обычно использую проперть StateIndex - она предназначена для хранения номера дополнительной картинки, так что можно вполне ею воспользоваться.

На самом деле это можно написать достаточно красиво и компактно, но при условии, что у тебя структура таблиц имеет некоторую однообразность.

Допустим, у тебя все таблицы имеют поля ID (уникальный идентификатор), ParentID (ссылка на родителя) и Name (собственно некоторое имя, которое и надо загрузить в TreeView).

Тогда будет что-то типа этого:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, DB, DBTables;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    qQuery: TQuery;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1Expanded(Sender: TObject; Node: TTreeNode);
  private
    procedure CreateItems(AParentNode: TTreeNode; AQuery: TDataSet; ALevel : Integer);
    procedure InitLoad;
    procedure Load(AParentNode : TTreeNode);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  levCount = 3;

  levYear = 1;
  levMonth = 2;
  levRealization = 3;

  tableNames : Array [1..levCount] Of String = ('Year','Month','Realisation');

  sqlQuery = 'SELECT ID, Name FROM Year';
  sqlSubQuery = 'SELECT ID, Name FROM %s WHERE ParentID = %d';

procedure TForm1.CreateItems(AParentNode : TTreeNode; AQuery : TDataSet; ALevel : Integer);
var
  ANode : TTreeNode;
begin
  AParentNode.DeleteChildren;
  ADataSet.First;
  While Not ADataSet..EOF Do
     Begin
        ANode := TreeView1.Items.AddChild(AParentNode, AQuery.FieldByName('Name').AsString);
        ANode.Data := Pointer(AQuery.FieldByName('Name').AsInteger);
        ANode.StateIndex := ALevel;
        If ALevel < levCount Then
          TreeView1.Items.AddChild(ANode,'');
        ADataSet.Next;
     End;
end;

procedure TForm1.InitLoad;
begin
  TreeView1.Items.Clear;
  qQuery.Active := False;
  qQuery.SQL.Clear;
  qQuery.SQL.Add(sqlQuery);
  qQuery.Active := True;
  CreateItems(Nil,qQuery,levYear);
  qQuery.Active := False;
end;

procedure TForm1.Load(AParentNode : TTreeNode);
var
  ALevel, AParentID : Integer;
  ASQL : String;
begin
  ALevel := AParentNode.StateIndex;
  AParentID := Integer(AParentNode.Data)
  ASQL := Format(sqlSubQuery,[tableNames[ALevel + 1],AParentID]);
  qQuery.Active := False;
  qQuery.SQL.Clear;
  qQuery.SQL.Add(ASQL);
  qQuery.Active := True;
  CreateItems(AParentID,qQuery,ALevel+1);
  qQuery.Active := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  InitLoad;
end;

procedure TForm1.TreeView1Expanded(Sender: TObject; Node: TTreeNode);
begin
  Load(Node);
end;

end.

Естественно, здесь нет ни подключения к БД, ни защиты от ошибок. Только канва.
Ответить с цитированием
  #5  
Старый 22.09.2008, 21:09
SAWaGE SAWaGE вне форума
Прохожий
 
Регистрация: 09.09.2008
Сообщения: 34
Репутация: 10
По умолчанию

Благодарствую lmikle!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:37.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025