Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.036 c
3-1164137692
DillerXX
2006-11-21 22:34
2007.02.11
Помогите составить SQL запрос...


15-1168857209
Expell
2007-01-15 13:33
2007.02.11
Разговоры о форматах


15-1169091116
Slider007
2007-01-18 06:31
2007.02.11
С днем рождения ! 18 января


4-1159027456
Чапаев
2006-09-23 20:04
2007.02.11
Запись строкового ресурса


2-1169733873
Help!
2007-01-25 17:04
2007.02.11
Runtime





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский