Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.063 c
15-1169277534
lookin
2007-01-20 10:18
2007.02.11
Верх удовольствия от утреннего просмотра "Ивана Васильевича"...


2-1169764213
Label2
2007-01-26 01:30
2007.02.11
Есть ли функция "имя"ToString ?


2-1169793753
WhiteBarin
2007-01-26 09:42
2007.02.11
Расскажите пожалуйста про RAISE и исключения


15-1169105618
L@ti
2007-01-18 10:33
2007.02.11
О загрузке dll в самом начале приложения....


15-1169091964
Одя
2007-01-18 06:46
2007.02.11
Существуют ли программы перевода сишных макросов в Паскаль?