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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.08.2009, 08:54
Qwed86 Qwed86 вне форума
Новичок
 
Регистрация: 12.09.2008
Сообщения: 66
Репутация: 10
По умолчанию Treeview и путь

Вобщем появился вопрос.
Есть treeview, в него тащатся данные из БД(у меня видимо из-за этого ошибка, хотя это не важно я думаю).
Пусть мы наоткрывали этот treeview до какого-то уровня и выделили какой-то node. Я хочу чтоб при нажатии на кнопку остался только прямой путь к этому nod'у а все остальные вложения на относящиеся конкретно к пути к этому ноду закрылись.
Т.е. пусть мы сделали fullexpand и открыли весь treeview, затем выделили какой-то нод в какой-то ветке и при нажатии на кнопку оставался только путь к этому ноду, а все остальное закрылось.
Может кто знает решение?
Ответить с цитированием
  #2  
Старый 25.08.2009, 10:35
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Как вариант - частичное решение (как сделать expand только для "полного" пути). Но как скрыть все ненужные узлы "выше" и "ниже" - с ходу не знаю.
Код:
procedure TForm1.SpeedButton3Click(Sender: TObject);
Var
 Node : TTreeNode;
 i,a_ind : integer;
begin
  ListBox1.Items.Clear;
  if Assigned(TreeView1.Selected) then begin
     //----------------------------------------
     //"формируем" путь
     Node:=TreeView1.Selected;
     ListBox1.Items.Insert(0,IntToStr(Node.AbsoluteIndex)+'='+Node.Text);
     Node.Collapse(true);
     while Assigned(Node.Parent) do
      begin
        Node:=Node.Parent;
        ListBox1.Items.Insert(0,IntToStr(Node.AbsoluteIndex)+'='+Node.Text);
     end;
     //----------------------------------------
     
     //----------------------------------------
     //"обрабатываем" путь
     TreeView1.Items[0].Collapse(true);
     i:=-1;
     while i<(ListBox1.Items.Count-1) do
      begin
       i:=i+1;
       a_ind:=StrToInt(ListBox1.Items.NAMES[i]);
       TreeView1.Selected:=TreeView1.Items[a_ind];
       TreeView1.Selected.Expand(false);
     end;
     //----------------------------------------
  end
  else begin
     ShowMessage('Не выбран узел');
  end;
end;
Ответить с цитированием
  #3  
Старый 25.08.2009, 12:29
Qwed86 Qwed86 вне форума
Новичок
 
Регистрация: 12.09.2008
Сообщения: 66
Репутация: 10
По умолчанию

Спасибо.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  aNode, bNode: TTreeNode;
begin
  TreeView1.Items.BeginUpdate;
  try
    aNode := TreeView1.Selected;
    bNode := aNode;
    TreeView1.FullCollapse;
    while Assigned(aNode) and Assigned(aNode.Parent) do
    begin
      aNode.Parent.Expand(False);
      aNode := aNode.Parent;
    end;
  finally
    TreeView1.Items.EndUpdate;
  end;
  if Assigned(bNode) then
  begin
    TreeView1.SetFocus;
    bNode.Selected := True;
    bNode.Focused := TRue;
  end;
end;
Вот этот вариант работает, но только если в treenode item'ы статичные похоже, у меня они из БД тащятся и при таком коде ошибка:
Цитата:
Access violation at address 00437A6C in module 'Project.exe'. Read of address 00000004
Пока не пойму в чём дело и как исправить.
Ответить с цитированием
  #4  
Старый 25.08.2009, 12:57
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Цитата:
Сообщение от Qwed86
Пока не пойму в чём дело и как исправить.

Может быть здесь :

Код:
 while Assigned(aNode) and Assigned(aNode.Parent) do

Если aNode = NIL, то обращение aNode.Parent может быть не корректным
Ответить с цитированием
  #5  
Старый 25.08.2009, 13:30
Qwed86 Qwed86 вне форума
Новичок
 
Регистрация: 12.09.2008
Сообщения: 66
Репутация: 10
По умолчанию

Это вроде как и эквивалентно
Код:
while (aNode <> nil) and (aNode.Parent <> nil) do
Ответить с цитированием
  #6  
Старый 25.08.2009, 15:32
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Суть в том, что многое завист от логики компилятора.
Если компилятор "будет удовлетворен" результатом проверки :
Assigned(aNode) для aNode=nil, то "все в порядке"
А если "пойдет дальше" и проверит вторую часть условия :
Assigned(aNode.Parent) при aNode=nil, то может быть RunTime-ошибка.

Честно сказать, я не знаю логику "нынешних" компиляторов Delphi.
Но в старых версиях такой конфуз случался.
Поэтому стараюсь (на всякий случай) исключать такие потенциально опасные места на уровне исходников.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter