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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.03.2013, 11:32
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию Учусь работать с TreeView

Проблема в организации повторяющегося кода.
Код:
procedure TForm1.dxBarButton1Click(Sender: TObject);
var
 DBNames : TStringList;
 DBName : string;
 NewItem : TTreeNode;
begin
DBNames := TStringList.Create;
MyConnection1.GetDatabaseNames(DBNames);

cxTreeView1.Items.BeginUpdate;
for DBName in DBNames do
begin
  NewItem := cxTreeView1.Items.Add(nil,DBName);
  NewItem.ImageIndex := 0;
  NewItem.SelectedIndex := 0;
  NewItem.HasChildren := True;
end;
cxTreeView1.Items.EndUpdate;
DBNames.Free;
end;

Получаю список БД с сервера MySQL. Создаю "корень дерева".
Далее обрабатываю OnExpanding (при развёртывании ветки), получая полный список таблиц

Код:
procedure TForm1.cxTreeView1Expanding(Sender: TObject; Node: TTreeNode;
  var AllowExpansion: Boolean);
var
 TblNames : TStringList;
 TblName : string;
 NewItem : TTreeNode;
begin
MyConnection1.Database := Node.Text;
MyConnection1.Connect;
TblNames := TStringList.Create;
MyConnection1.GetTableNames(TblNames);

cxTreeView1.Items.BeginUpdate;
Node.DeleteChildren;
  for TblName in TblNames do
  begin
    NewItem := cxTreeView1.Items.AddChild(Node,TblName);
    NewItem.ImageIndex := 1;
    NewItem.SelectedIndex := 1;
  end;
cxTreeView1.Items.EndUpdate;
TblNames.Free;
end;

Дальше у таблиц будут "колонки"... и вот тут запара.
Нужно писать третий раз "по сути" один и тот же код.
Как этот процесс ГРАМОТНО организовать?
Ответить с цитированием
  #2  
Старый 22.03.2013, 11:58
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Ну например вынести это в отдельную процедуру
Код:
procedure TForm1.AddChildrens(Node:TTreeNode;ChildrenNames:TStrings;ImageIndex:Integer);
var
  ChildrenName : String;
  NewItem:TTreeNode;
begin
   cxTreeView1.Items.BeginUpdate; 
   if Node = Nil then
      cxTreeView1.Items.Clear;
   else
      Node.DeleteChildren;
   for ChildrenName in ChildrenNames do
   begin
      NewItem := cxTreeView1.Items.AddChild(Node,ChildrenName );
      NewItem.ImageIndex := ImageIndex;
      NewItem.SelectedIndex := ImageIndex;
   end;
   cxTreeView1.Items.EndUpdate;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
Uniq! (22.03.2013)
  #3  
Старый 22.03.2013, 12:07
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Код:
    cxGrid1: TcxGrid;
    procedure dxBarButton1Click(Sender: TObject);
    procedure cxTreeView1Expanding(Sender: TObject; Node: TTreeNode;
      var AllowExpansion: Boolean);
    procedure cxTreeView1Change(Sender: TObject; Node: TTreeNode);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

А здесь это как выглядеть будет?
Ответить с цитированием
  #4  
Старый 22.03.2013, 17:08
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Ну, что всё разжёвывать ?

Код:
private
   procedure AddChildrens(Node:TTreeNode; ChildrenNames:TStrings; ImageIndex:Integer); 

Код:
procedure TForm1.dxBarButton1Click(Sender: TObject);
var DBNames : TStringList;  
begin
  DBNames := TStringList.Create; 
  MyConnection1.GetDatabaseNames(DBNames); 
  AddChildrens (nil,DBNames,0); 
  DBNames.Free; 
end;

procedure TForm1.cxTreeView1Expanding(Sender: TObject; Node: TTreeNode;   var AllowExpansion: Boolean); 
var 
  Names : TStringList;  
begin
  Names := TStringList.Create;
  try
    if Node.Level = 1 then 
    begin
      MyConnection1.Database := Node.Text; 
      MyConnection1.Connect; 
      MyConnection1.GetTableNames(TblNames); 
    end else
    if Node.Level = 2 then 
    begin
      // тут добавить код получения имён полей 
     // таблицы Node.Text в список Names
    end
     else Exit;
    AddChildrens (Node,Names,Node.Level); 
  finally
    Names.Free
  end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
Uniq! (22.03.2013)
  #5  
Старый 22.03.2013, 19:29
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от icWasya
Ну, что всё разжёвывать ?

Нет, что вы. Я разобрался. Просто секции для меня пока остаются загадкой. Никак руки не доходят изучить. Благодарю. Очень помогли.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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