Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Строки DB в TreeView [D7, MSSQL]


Jeeb ©   (2007-02-06 18:44:00) 

Привет всем. Возник вопрос... но не знаю, как осуществить, помогите... плз...

Компоненты:
TreeView (Tree), DBGrid (DBTree), ADOConnection (FDM.ADOConn), ADOTable (FDM.TblTree), DataSource (FDM.SrcTree).

FDM.TblTree имеет поля "Наименование", "Уровень", "Надуровень", где

Наименование: key*, varchar, 50
Уровень: int, 10
Надуровень: key*, varchar, 50

* - составной ключ

Пример:

| Наименование   | Уровень | Надуровень  |
|----------------+---------+-------------|
| Кузов          | 0       |             |
| Бампер         | 1       | Кузов       |
| Крыло          | 1       | Кузов       |
| Лев. пер.      | 2       | Крыло       |
| Прав. пер.     | 2       | Крыло       |
| Лев. зад.      | 2       | Крыло       |
| Прав. зад.     | 2       | Крыло       |
| Трансмиссия    | 0       |             |
| Ступенчатая    | 1       | Трансмиссия |
| Автоматическая | 1       | Трансмиссия |
...

Из примера видно, что в поле "Надуровень" записываются значения,
которые при создании Tree будут являться выше на 1 уровень от
значений, которые записываются  поле "Наименование", а сам
уровень указывается в поле "Уровень". Нужно заметить, что
записи, имеющие уровень 0, надуровня не имеют.

Есть вероятность того, что кортежи (строки) таблицы не
упорядочены, т.е. в разнобой...

Необходимо:
1. Упорядочить FDM.TblTree по полю "Уровень" (не обязательно).
2. Добавить ветки "Наименование" в Tree, где уровень равен 0.
3. Добавить ветки "Наименование" в Tree, где уровень равен 1,
  зная что добавление будет происходить в ветку с именем
  "Надуровень", где уровень равен 0.
4. По аналогии с пунктом 3, только повышая уровень на один.

Должно получиться (исходя из примера):

+ Кузов
|-- Бампер
|-+ Крыло
| |-- Лев. пер.
| |-- Прав. пер.
| |-- Лев. зад.
| |-- Прав. зад.
+ Трансмиссия
|-- Ступенчатая
|-- Автоматическая

Ну вот, в прочем, и все....

Надеюсь на помощь...


Ega23   (2007-02-07 08:26:00) [1]


> Да.. и эта еще.. нафигатор на фиг !


А строку делать ключевым полем - моветон.


MsGuns   (2007-02-06 22:44:00) [2]

Да.. и эта еще.. нафигатор на фиг !


Johnmen   (2007-02-06 19:29:00) [3]

Разбираться в вышенаписанном вряд ли у кого будет желание.
Единственное, что можно порекомендовать, так это перейти к общепринятым деревянным структурам и способам их построения и реализации, а не выдумывать велосипед с квадратными колёсами.


Jeeb   (2007-02-06 18:51:00) [4]

пардон за букараги...

Уровень, Уровень, Наименование, Наименование, Надуровень, Наименование, Наименование, Наименование... это букараги по порядку...


Jeeb   (2007-02-06 18:47:00) [5]

procedure TFTree.BUpdateClick(Sender: TObject);
var
 I, L, MaxL, J, K, M, N: Integer;
 S, P, Q: String;
begin
 MaxL:=0;
 for I:=1 to Navigator.DataSource.DataSet.RecordCount do
   begin
     L:=Navigator.DataSource.DataSet.FieldByName('Óðîâåí ;ü').AsInteger;
     if L>MaxL then
       MaxL:=L;
     Navigator.DataSource.DataSet.Next;
   end;
 L:=0;

 Navigator.DataSource.DataSet.First;
 for I:=1 to Navigator.DataSource.DataSet.RecordCount do
   begin
     L:=Navigator.DataSource.DataSet.FieldByName('Óðîâåí ;ü').AsInteger;
     if L=0 then
       Tree.Items.Add(Tree.TopItem, Navigator.DataSource.DataSet.FieldByName('Íàèìåí&# 238;âàíèå').AsString);
     if L>0 then
       begin
         P:=Navigator.DataSource.DataSet.FieldByName('Íàèìåí ;îâàíèå').AsString;
         M:=Navigator.DataSource.DataSet.RecNo;
         FDM.TblTree.Lookup('Íàäóðîâåíü ', P, 'Íàèìåíîâàíèå');
         for K:=0 to Tree.Items.Count-1 do
           begin
             Tree.Select(Tree.Items.Item[K]);
             if Tree.Selected.Text=Navigator.DataSource.DataSet.FieldByName('Íàè& #236;åíîâàíèå').AsString then
               N:=K;
           end;
         Tree.Select(Tree.Items.Item[N]);
         Tree.Items.AddChild(Tree.Selected, Navigator.DataSource.DataSet.FieldByName('Íàèìåí&# 238;âàíèå').AsString);
       end;
     Navigator.DataSource.DataSet.Next;
   end;
end;


Думал так сделать... но увы... не получается...


Наверх

Титульная страница Поиск, карта сайта Написать письмо