X11
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Переписал с использованием датасетов Код: procedure TreeMoveUp(cxDBTreeList: TcxDBTreeList); var ANode: TcxDBTreeListNode; begin ANode := TcxDBTreeListNode(cxDBTreeList.FocusedNode);//выделенный узел, который нужно поднять на уровень вверх if ANode.ParentKeyValue = 0 then exit;//нулевой уровень, выше уже некуда переносить if ANode.Parent <> nil then//проверяем существование родителя with TpFibDataSet(cxDBTreeList.DataController.DataSource.DataSet) do begin DisableControls; Edit; //TcxDBTreeListNode(ANode.Parent).ParentKeyValue - значение ключевого поля нового родителя FBN('PARENT').Value := TcxDBTreeListNode(ANode.Parent).ParentKeyValue;//нужно переместить на уровень выше своего родителя. FBN('ID').Value := TcxDBTreeListNode(ANode).KeyValue;//какой узел перемещаем Post; EnableControls; end//with else with TpFibDataSet(cxDBTreeList.DataController.DataSource.DataSet) do begin//если у родителя нет родителя, то перемещение происходит со 1го на нулевой уровень, а значит parent = 0 DisableControls; Edit; FBN('PARENT').Value := 0;//перемещаем на самый верхний уровень FBN('ID').Value := TcxDBTreeListNode(ANode).KeyValue;//какой узел перемещаем Post; EnableControls; end;//with ANode.Focused := true; cxDBTreeList.SetFocus; end; procedure TreeMoveDown(cxDBTreeList: TcxDBTreeList); var ANode: TcxDBTreeListNode; APrevChildNode, ANextChildNode: TcxTreeListNode; begin ANode := TcxDBTreeListNode(cxDBTreeList.FocusedNode); APrevChildNode := ANode.Parent.GetPrevChild(ANode);//вышестоящий равноправный уровень ANextChildNode := ANode.Parent.GetNextChild(ANode);//нижестоящий равноправный уровень //в первую очередь стараемcя прилепиться к нижестоящему уровню в качестве дочернего узла if ANextChildNode <> nil then with TpFibDataSet(cxDBTreeList.DataController.DataSource.DataSet) do begin DisableControls; Edit; //TcxDBTreeListNode(ANode.Parent).ParentKeyValue - значение ключевого поля нового родителя FBN('PARENT').Value := TcxDBTreeListNode(ANextChildNode).KeyValue;//нужно переместить на уровень ниже своего родителя. FBN('ID').Value := TcxDBTreeListNode(ANode).KeyValue;//какой узел перемещаем Post; EnableControls; end//with else if APrevChildNode <> nil then with TpFibDataSet(cxDBTreeList.DataController.DataSource.DataSet) do begin DisableControls; Edit; //TcxDBTreeListNode(ANode.Parent).ParentKeyValue - значение ключевого поля нового родителя FBN('PARENT').Value := TcxDBTreeListNode(APrevChildNode).KeyValue;//нужно переместить на уровень ниже своего родителя. FBN('ID').Value := TcxDBTreeListNode(ANode).KeyValue;//какой узел перемещаем Post; EnableControls; end;//with ANode.Focused := true; cxDBTreeList.SetFocus; end; | Добавлено: Цитата: или дерево само по себе не дёргает датасет и нужно всё самому ручками в базе сделать? | дело в ом, что для Drag`N`Drop никаких особых усилий не прилагал, написал только одну строку: Accept := Sender = Source; всё, Drag`N`Drop работает, я к датасетам ручками не лезу, дерево всё само делает за меня, вот я и подумал, что перемещение по уровням тоже немного автоматизировано.
---------- /не мы такие, жизнь такая/ |
|