|
#1
|
|||
|
|||
Treeview и путь
Вобщем появился вопрос.
Есть treeview, в него тащатся данные из БД(у меня видимо из-за этого ошибка, хотя это не важно я думаю). Пусть мы наоткрывали этот treeview до какого-то уровня и выделили какой-то node. Я хочу чтоб при нажатии на кнопку остался только прямой путь к этому nod'у а все остальные вложения на относящиеся конкретно к пути к этому ноду закрылись. Т.е. пусть мы сделали fullexpand и открыли весь treeview, затем выделили какой-то нод в какой-то ветке и при нажатии на кнопку оставался только путь к этому ноду, а все остальное закрылось. Может кто знает решение? |
#2
|
|||
|
|||
Как вариант - частичное решение (как сделать 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
|
|||
|
|||
Спасибо.
Код:
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; Цитата:
|
#4
|
|||
|
|||
Цитата:
Может быть здесь : Код:
while Assigned(aNode) and Assigned(aNode.Parent) do Если aNode = NIL, то обращение aNode.Parent может быть не корректным |
#5
|
|||
|
|||
Это вроде как и эквивалентно
Код:
while (aNode <> nil) and (aNode.Parent <> nil) do |
#6
|
|||
|
|||
Суть в том, что многое завист от логики компилятора.
Если компилятор "будет удовлетворен" результатом проверки : Assigned(aNode) для aNode=nil, то "все в порядке" А если "пойдет дальше" и проверит вторую часть условия : Assigned(aNode.Parent) при aNode=nil, то может быть RunTime-ошибка. Честно сказать, я не знаю логику "нынешних" компиляторов Delphi. Но в старых версиях такой конфуз случался. Поэтому стараюсь (на всякий случай) исключать такие потенциально опасные места на уровне исходников. |