Текущий архив: 2007.02.11;
Скачать: CL | DM;
ВнизTreeView + BDE Найти похожие ветки
← →
frameZ © (2007-01-26 01:21) [0]Здраствуйте.
Есть таблица вида ID | Name | IDPar, где IDPar - ID родителя в этой же таблице. В TreeView отображается дерево этой таблицы. Дерево загружается не все, а по частям (т.е. ветвь загружается при нажатии на +) Необходимо при добавлении новой записи обновить дерево и выделить ту запись, которая была выделена до внесения изменений.
← →
Palladin © (2007-01-26 01:23) [1]я так понял это ТЗ? цена вопроса не указана...
← →
frameZ © (2007-01-26 01:30) [2]нет это не ТЗ. После добавления записи я сворачиваю дерево и все... Я не могу выделить ту запись на которой был до изменения. я пробую развернуть 1 ветку, а получается что разворачивается все дерево... второй день не могу понять в чем дело
← →
Германн © (2007-01-26 01:53) [3]
> frameZ © (26.01.07 01:30) [2]
>
> нет это не ТЗ.
Тогда приводи свой код. Как ты делаешь и что не получается.
Поиск ошибок - конёк сего форума :)
← →
framez © (2007-01-26 01:59) [4]Я по разному пробовал но не получается он разворачивает все дерево а мне этого не надо.
procedure TMainForm.N10Click(Sender: TObject);
begin
// добавление подразделения
with TGroupEditForm.Create(Self, 0, 0, true) do
try
ShowModal;
finally
Free;
end;
ShowNode(GroupTView.Selected);
end;
procedure TMainForm.ShowNode(Node : TTreeNode);
var
List : TStringList;
I : integer;
begin
List := TStringList.Create;
while Node.Parent <> nil do
begin
List.Add(Node.Text);
Node := Node.Parent;
end;
GroupTView.FullCollapse;
GroupTView.Items.Item[0].Expand(true);
for I := List.Count-1 downto 1 do
begin
while Node.GetNextChild(Node) <> nil do
if Node.Text = List.Strings[i] then Node.Expand(true);
end;
List.Free;
end;
← →
alex_*** © (2007-01-26 11:27) [5]а зачем после добавления записи обновлять все дерево?
если так уж хочется обновлять, то непонятно что за проблемы развернуть ветку, не надо рекурсивно открывать её.
я пару дней назад переписывал работу с деревом - решил не заморачиваться на считывание данных по мере надобности и вычитываю сразу все и набору строю дерево. Записей около 2 тыс, строится за секунду.
type TNodeValue = class
public
Name: string;
node: TTreeNode;
id: Extended;
OrgID: Extended;
BSOType: Extended;
ParentID: Extended;
PlaceID: Extended;
constructor Create(ds: TDataSet);overload;
constructor Create(pid, pOrgID, pBSOType, pParentID, pPlaceID: Extended; pname:string);overload;
procedure AssignData(pid, pOrgID, pBSOType, pParentID, pPlaceID: Extended; pname:string);
end;
....
procedure TTempl.RebuildTree;
var root: TTreeNode;
nv: TNodeValue;
begin
TV.Items.BeginUpdate();
try
TV.Items.Clear();
FNodesManager.Clear();
cds.EmptyDataSet();
FillCDS(QueryTemplateTree);
cds.First();
if cds.RecordCount>0 then
begin
nv := TNodeValue.Create(cds);
root := TV.Items.AddChildObject(nil, nv.Name, nv);
nv.node := root;
FNodesManager.Add(nv);
FillChildren(cds, root, TV.Items, cds.FieldByName("TEMPLATEID").AsFloat);
end;
if TV.Items.GetFirstNode() <> nil then
Begin
TV.Items.GetFirstNode.Expand(false);
TV.Items.GetFirstNode.Selected := true;
end;
finally
TV.Items.EndUpdate;
end;
end;
procedure TTempl.FillChildren(ds: TClientDataSet; root: TTreeNode;
nodes: TTreeNodes; ParentID: extended);
var nd: TTreeNode;
i: integer;
lst: TList;
nv: TNodeValue;
pos: Integer;
begin
cds.SetRange([ParentID], [ParentID]);
lst := TList.Create();
try
while not cds.Eof do
Begin
nv := TNodeValue.Create(cds);
nd := nodes.AddChildObject(root, nv.Name, nv);
nv.node := nd;
lst.Add( Pointer(FNodesManager.Add(nv)) );
cds.Next();
ENd;
cds.CancelRange();
for i:=0 to lst.Count-1 do
Begin
pos := Integer(lst[i]);
nv := FNodesManager.Items[ pos ];
FillChildren(cds, nv.node, nodes, nv.id);
End;
finally
lst.Free();
end;
end;
...
procedure TTempl.TVChange(Sender: TObject; Node: TTreeNode);
var nv: TNodeValue;
begin
pmTemplateTreePopup( pmTemplateTree);
if Node = nil then
exit;
nv := TNodeValue(Node.Data);
SetSubDSParams(nv);
end;
cds это TClientDataSet, в нем должен существовать и быть активным индекс по ParentID
Страницы: 1 вся ветка
Текущий архив: 2007.02.11;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.045 c