Потихоньку подбираюсь к динамической загрузке веточек, по нажатию на узел, если в нём есть дети, он будет раскрываться. Но это в следующих статьях, сейчас простое запоминание свёрнутости узлов через базу. Для этого я добавил поле IsExpanded
Поле Integer, по правильному конечно нужно boolean, которое на самом деле TinyInt(1) в MySQL))
Создал соответствующий FDQuery
В коде реализация получилась следующая
2 пишущие процедуры в модуле DMDB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
procedure TDMDB.WriteCollapsings(Node: TTreeNode); begin if Node=nil then exit; with qExpanded.Params do begin ParamValues['IsExpanded']:=0; ParamValues['id']:=Integer(Node.Data^); qExpanded.ExecSQL; end; end; procedure TDMDB.WriteExpandings(Node:TTReeNode); begin if Node=nil then exit; with qExpanded.Params do begin ParamValues['IsExpanded']:=1; ParamValues['id']:=Integer(Node.Data^); qExpanded.ExecSQL; end; end; |
В главном модуле встают соответственно на обработку
1 2 3 4 5 |
procedure TMainForm.TreeView1Collapsed(Sender: TObject; Node: TTreeNode); begin DMDB.WriteCollapsings(Node); end; |
и
1 2 3 4 |
procedure TMainForm.TreeView1Expanded(Sender: TObject; Node: TTreeNode); begin DMDB.WriteExpandings(Node); end; |
Чтение “свернутости” из базы соответственно таким путем
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
procedure TDMDB.ReadExpandingsCollapsings(Sender: TObject; TreeView: TTreeView); var Node:TtreeNode; begin with qSelect do begin Open(); while not eof do begin Node:=Self.FindParentNode(FieldByName('id').AsInteger,TreeView); if Node<>nil then begin if FieldByName('IsExpanded').AsInteger=1 then Node.Expand(false) else Node.Collapse(false); end; Next; end; Close(); end; |
Вспомогательная процедура поиска узла в дереве по ключу
1 2 3 4 5 6 7 8 9 10 11 12 |
function TDMDB.FindParentNode(Key: integer;TreeView:TTreeView): TTreeNode; var i:integer; begin Result:=nil; for i := 0 to TreeView.Items.Count-1 do if Integer(TreeView.Items.Item[i].Data^)=Key then begin Result:=TreeView.Items.Item[i]; Break; end; |