![]()  | 
	
 
  | 
| 
		 
			 
			#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)
  | ||