|
#1
|
|||
|
|||
Как это работает
Суть проблемы разобраться с пониманием, остальное решено.
В сети есть пример добавления checkbox и radiobutton в treeview. (How to Add Check Boxes and Radio Buttons to a TTreeView, например на Код HTML:
Кто нибудь может пояснить, зачем нужна переменная tmp и что делает строчка: Код:
tmp := Node.Parent; (Т.е., например, строчка newbutton.Parent:=Form1 делает форму родителем новой кнопки, как это будет звучать при перемене мест?) C tmp вообще непонятно, зачем вводится дополнительно и как работа с ней приводит к изменениям на treeview? Код:
procedure ToggleTreeViewCheckBoxes( Node :TTreeNode; cUnChecked, cChecked, cRadioUnchecked, cRadioChecked :integer); var tmp:TTreeNode; begin if Assigned(Node) then begin if Node.StateIndex = cUnChecked then Node.StateIndex := cChecked else if Node.StateIndex = cChecked then Node.StateIndex := cUnChecked else if Node.StateIndex = cRadioUnChecked then begin tmp := Node.Parent; if not Assigned(tmp) then tmp := TTreeView(Node.TreeView).Items.getFirstNode else tmp := tmp.getFirstChild; while Assigned(tmp) do begin if (tmp.StateIndex in [cRadioUnChecked,cRadioChecked]) then tmp.StateIndex := cRadioUnChecked; tmp := tmp.getNextSibling; end; Node.StateIndex := cRadioChecked; end; // if StateIndex = cRadioUnCheckedend; // if Assigned(Node) end; (*ToggleTreeViewCheckBoxes*) |
#2
|
|||
|
|||
Вспоминаем, что на самом деле все объекты Делфи являются указателями.
Соответсвенно, присваивание переменной tmp некоторого объекта TreeView на самом деле просто указывает на один и тот же объект. Как, например, у тебя есть банка с водой. Если ты сделаешь еще одну дырку в стенке банки, то ты получишь доступ ровно к той же воде. Здесь сам объект - это вода, в дырки в банке - как раз указатели. Код:
type TForm1 = class(TForm) Label1 : TLabel; end; ... procedure TForm1.Button1Click(Sender : TObject); var tmp : TLabel; begin tmp := Label1; tmp.Caption := 'Изменено через tmp'; end; В примере мы tmp присваиваем значение поля Label1 и меняем знаяение свойства объекта через эту переменую. Как понятно, и в tmp и в Label1 находится одно и то же значение - адрес в памяти, по которому и размещен сам объект. |
#3
|
|||
|
|||
Благодарю, наконец то начала в голове проявляться картинка.
Можно все таки еще прокомментировать строчку: Код:
tmp := Node.Parent; И конкретно Parent c точки зрения объекта. И tmp и Node одного типа: TTreeNode. Что здесь означает Parent? |
#4
|
|||
|
|||
Ну а как ты будешь строить дерево.
В данном случае используется вариант двунаправленного списка. Т.е. каждый узел "знает" список своих субитемов (если правильно помню, то через свойство Items), и ссылка на вышестоящий узел через свойство Parent. Например, простое дерево: Код:
A / \ B C /\ D E - Items = [B,C] - Parent = Nil у узла B: - Items = [] - Parent = A у узла С: - Items = [D,E] - Parent = A у узла D: - Items = [] - Parent = C у узла E: - Items = [] - Parent = C |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Gerg74 (05.08.2024)
|