Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ссылка не обнуляется. [D7, WinXP]


VEZ ©   (2006-09-05 17:45:00) 

Усть объект:
unit uObjects;

interface

uses
 ComCtrls;

Type
 Ta=class
 private
   FNode:TTreeNode;
 public
   constructor Create(Node:TTreeNode);
   destructor Destroy; override;
 end;

implementation

constructor Ta.Create(Node:TTreeNode);
begin
FNode:=Node;
FNode.Data:=Self;
end;

destructor Ta.Destroy;
begin
FNode.Free;
FNode:=nil;
 inherited;
end;

В главной форме удаляем Node из TTreeView:
procedure TForm2.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
var
aa:Ta;
begin
aa:=Ta(Node.Data);
Node.Data:=nil;
aa.Free;
end;

но ссылка Node.Data при заходе в деструктор объекта каким-то чудесным образом восстонавливается, и начинается удаление нода, где в онделешен опять же ссылка как нивчём небывало, в результате процесс зацикливается и происходит переполнение стека, пробовал отключать оптимизацию(возможно оптимизатор делфи напарил) всё попрежнему(BDS 2006, WinXP, Win2003).


VEZ   (2006-09-05 22:37:00) [1]


> han_malign ©   (05.09.06 18:18) [4]
> destructor Ta.Destroy;begin     FNode.Data:= nil;     FNode.
> Delete;     inherited;end; - подумай над каждой строчкой,
>  посмотри реализацию TTreeNode.Delete


Спасибо, помогло.


VEZ   (2006-09-05 22:30:00) [2]


> - советую подумать при каком событии вызывается OnDeletion
> - это два.


Occurs when a node in the tree view is deleted.


VEZ   (2006-09-05 22:23:00) [3]


> Amoeba ©   (05.09.06 18:06) [1]
> > aa:=Ta(Node.Data);Ересь!


Что за ересь.


han_malign   (2006-09-05 18:18:00) [4]

destructor Ta.Destroy;
begin
    FNode.Data:= nil;
    FNode. Delete;
    inherited;
end;

- подумай над каждой строчкой, посмотри реализацию TTreeNode.Delete


Desdechado   (2006-09-05 18:15:00) [5]

а где у тебя в деструкторе  Node.Data


han_malign   (2006-09-05 18:09:00) [6]

Node.Data:=nil;
procedure TTreeNode.SetData(Value: Pointer);
begin
 if not Deletingand (Value <> Data) then
 begin
   FData := Value;
   if (TreeView.SortType in [stData, stBoth]) and Assigned(TreeView.OnCompare)
     and (not Deleting) and FInTree then
   begin
     if Parent <> nil then
       Parent.AlphaSort
     else
       TreeView.AlphaSort(False);
   end;
 end;
end;

- это раз...

- советую подумать при каком событии вызывается On Deletion- это два.


Amoeba   (2006-09-05 18:06:00) [7]


> aa:=Ta(Node.Data);

Ересь!


Наверх

Титульная страница Поиск, карта сайта Написать письмо