![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ссылка не обнуляется. [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);
Ересь!