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

Вниз

Вопрос по TTreeView.   Найти похожие ветки 

 
Drowsy ©   (2016-09-06 20:15) [0]

SourceIbXTreeView - потомок TTreeView.

// Переносим SourceIbXTreeView из основной формы в форму ввода.

     SavedOwner :=  SourceIbXTreeView.Owner;
     SavedOwner.RemoveComponent(SourceIbXTreeView);
     F_objred.InsertComponent(SourceIbXTreeView);

     SourceIbXTreeView.Parent := F_objred.Panel5;

====>

Вот здесь (при смене парента), вызывается удаление всех нодов.
У обработчик удаления выглядит так :

procedure TIBXTreeView_Pure.DelNode(Sender: TObject; Node: TTreeNode);
Var SpecialData : TItemRec;
begin
 if Assigned(Node) then
   if Assigned(Node.Data) then
   begin
     SpecialData:=Node.Data;
     SpecialData.Free;
     SpecialData:=nil;
     Node.Data:=nil;
==> Вот здесь не происходит обнуления Node.Data
   end;

end;


2 вопроса:
1) почему при смене парента удаляются ноды?
2) почему не обнуляются Node.Data?

Спасибо.



 
Drowsy ©   (2016-09-15 02:04) [1]

?


 
iop ©   (2016-09-15 10:59) [2]

2 вопроса:
1) почему при смене парента удаляются ноды?
2) почему не обнуляются Node.Data?


1. при смене парента никакие ноды не удаляются.
2. потому что у тебя еретический дизайн программы


 
Drowsy ©   (2016-09-20 03:37) [3]


> 1. при смене парента никакие ноды не удаляются.
> 2. потому что у тебя еретический дизайн программы




На форме 2 панели и кнопка На первой панели дерево. По кнопке перемещаю дерево на другую панель. При смене парента, вызывается событие удаление нодов.

unit UnitTmp;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type

 TForm1 = class(TForm)

   Panel1: TPanel;

   TreeView1: TTreeView;

   Panel2: TPanel;

   Button2: TButton;

   procedure Button2Click(Sender: TObject);

   procedure TreeView1Deletion(Sender: TObject; Node: TTreeNode);

 private

   { Private declarations }

 public

   { Public declarations }

 end;



var

 Form1: TForm1;

implementation

{$R *.dfm}





procedure TForm1.Button2Click(Sender: TObject);

var TmpTree : TTreeView;

begin

 TmpTree := TreeView1;

 TreeView1.Owner.RemoveComponent(TreeView1);

 Panel2.InsertComponent(TmpTree);

 TmpTree.Parent := Panel2;  // <- здесь происходит вызов  TreeView1Deletion для всех узлов дерева.

end;



procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);

begin

// OnDeletion – Генерируется при удалении Node дерева для каждого удаляемого Node.

// Параметр “Node” содержит Node, который удаляется.

// Таким образом, с помощью данного события удобно, к примеру,

// перед удалением Node разрушать связанные с ним данные,

// если таковые содержатся в его свойстве Data, и т.д.

end;



end.



 
iop ©   (2016-09-20 09:03) [4]

при смене парента никакие ноды не удаляются.


 
iop ©   (2016-09-20 09:06) [5]

TForm1.Button1Click(Sender : TObject);
f : TFotm;
begin
f := TForm2.Create(Application);
TreeView1.Parent := f;
end;

тыцнешь в кнопку сто раз - сто раз тривью сменит парента и не потеряет ни одного нода.
хотя можешь тыцнуть не сто, а тысячу раз.


 
Drowsy ©   (2016-09-20 10:04) [6]


> iop ©   (20.09.16 09:06) [5]


тыкнул сто, потом тысячу.
теперь ты :

создай событие  Tree.onDeletion и поставь в нём точку остановки.


procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin

// OnDeletion – Генерируется при удалении Node дерева для каждого удаляемого Node.

// Параметр “Node” содержит Node, который удаляется.

// Таким образом, с помощью данного события удобно, к примеру,

// перед удалением Node разрушать связанные с ним данные,

// если таковые содержатся в его свойстве Data, и т.д.

end;


 
iop ©   (2016-09-20 10:05) [7]

еще раз для погромистов:
при смене парента никакие узлы в тривью не удаляются.


 
Drowsy ©   (2016-09-20 19:53) [8]


> iop ©   (20.09.16 10:05) [7]

Если определено событие Tree.onDeletion, то при смене парента, оно вызывается. Согласен?


 
iop ©   (2016-09-20 20:57) [9]

при смене парента
событие вызывается,
ноды не удаляются.


 
iop ©   (2016-09-20 21:11) [10]

да и вызывается при смене парента оно не везде.

в ХЕ8 никакого OnDeletion при смене парента не вызывается вообще.

TTVExpandedEvent is used to respond to notifications of events that occur to the nodes of a tree view control. It is a generic event handler for various events that notify the tree view of something that happened to a node.

Sender is the tree-view control that contains the node that is the focus of the notification.

Node is the item that has been expanded, collapsed, deleted, or which is about to be drawn.

т.е. в ранних версиях возможно при любом чихе в дереве вызывались скопом все обработчики типа TTVExpandedEvent вне зависимости от того что там реально произошло.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2018.11.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.001 c
15-1475184602
Юрий
2016-09-30 00:30
2018.11.04
С днем рождения ! 30 сентября 2016 пятница


2-1473936376
lewka
2016-09-15 13:46
2018.11.04
передача нажатия клавиши стороннему приложению


2-1474009068
user
2016-09-16 09:57
2018.11.04
Заполнение форму html


2-1474206922
KropotkinGosha
2016-09-18 16:55
2018.11.04
Не выполняется код в функции


2-1473182108
Drowsy
2016-09-06 20:15
2018.11.04
Вопрос по TTreeView.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский