![]() |
|
|
#1
|
|||
|
|||
|
Вобщем появился вопрос.
Есть 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. Но в старых версиях такой конфуз случался. Поэтому стараюсь (на всякий случай) исключать такие потенциально опасные места на уровне исходников. |