![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TreeView.Items.Clear - Access violation [D7, WinXP]
Я1 © (2005-03-14 11:25:00)Кто нибудь сталкивался с это проблемой?
При вызове Clear компонент перебирает все ноуды и для каждого помимо всего прочего выполняет это:
function TTreeNode.GetTreeView: TCustomTreeView;
begin
Result := Owner.Owner;
end;
У ноуда оунер - TTreeNodes
У TTreeNodes оунер - TCustomTreeView
Но как минимум у одного ноуда (у самого первого) нет оунера.
Так получается?
Самое интересное, что если в процедуре, где вызывается Clear, ставишь BreakPoint, то Access violation не происходит.
Digitman (2005-03-14 16:22:00) [1]
> ошибка происходит здесь:
> Result := Owner.Owner;
"Караул устал !" (с)
на то есть встр.дебагер, позволяющий определить, КТО есть нормально существующийобъект - то ли Self.Owner, то ли Self.Owner.Owner
Я1 (2005-03-14 13:42:00) [2]parents здесь ни причем.
ошибка происходит здесь:
Result := Owner.Owner;
Да и вообще, как может получаться, что если ставишь BreakPoint,
ошибки нет, убираешь - есть?
Может, ошибка происходит от того, что во время очистки ноудов TreeView пытается что-то прорисовать, и рисовать нечего?
Digitman (2005-03-14 13:32:00) [3]
> TreeView_DeleteAllItems(Owner.Handle) как раз и перебирает
и опять врешь
цитирую :
function TreeView_DeleteAllItems(hwnd: HWND): Bool;
begin
Result := Bool( SendMessage(hwnd, TVM_DELETEITEM, 0, Longint(TVI_ROOT)) );
end;
> Первый ноуд добавляю с помощью Add,
> в качестве сиблина передаю nil, остальные - передаю последний
> добавленный
видимо, ты путаешь Owner и Parent
ВСЕ узлы дерева как объекты-наследники класса TTreeNode имеют одного и того же Owner'а (ВНЕ зависимости от того, как и каким Add-методом узел был добавлен) - это объект-наследник TTreeNodes
Parent'а же имееют только те узлы, которые не являются корневыми
Я1 (2005-03-14 13:28:00) [4]пардон, не перебирает.
Но ошибка происходит именно здесь
function TTreeNode.GetTreeView: TCustomTreeView;
begin
Result := Owner.Owner;
end;
Я1 (2005-03-14 13:28:00) [5]пардон, не перебирает.
Но ошибка происходит именно здесь
function TTreeNode.GetTreeView: TCustomTreeView;
begin
Result := Owner.Owner;
end;
Я1 (2005-03-14 13:23:00) [6]OnDeletion ничего нет
TreeView_DeleteAllItems(Owner.Handle) как раз и перебирает.
Код долго показывать. Первый ноуд добавляю с помощью Add,
в качестве сиблина передаю nil, остальные - передаю последний добавленный
MBo (2005-03-14 12:38:00) [7]>Так получается?
procedure TForm1.Button1Click(Sender: TObject);
begin
Treeview1.Items.Clear;
end;
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
Memo1.Lines.Add(Node.TreeView.Name);
end;
Нет, не получается.
Код покажи.
Digitman (2005-03-14 12:34:00) [8]
> При вызове Clear компонент перебирает все ноуды и для каждого
> помимо всего прочего выполняет это
ой врешь ведь ...
фрагмент ComCtrls.pas (D7):
procedure TTreeNodes.Clear;
var
LHandleAllocated: Boolean;
begin
LHandleAllocated := Owner.HandleAllocated;
if LHandleAllocated then
BeginUpdate;
try
ClearCache;
if Owner.HandleAllocated then
TreeView_DeleteAllItems(Owner.Handle);
finally
if LHandleAllocated then
EndUpdate;
end;
end;
и ГДЕ ты здесь видишь какой-то "перебор" ?
а уж коль речь идет об обработке события TTreeView.OnDeletion, то ошибки в его обработчике - это твоипроблемы, а не проблемы компонента TTreeView
Erik1 (2005-03-14 12:15:00) [9]У TreeView вобще много заморочек, возми другой Tree. Я сейчас использую EhLib, там есть режим отображения дерева.