Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
ВнизTreeView.Items.Clear - Access violation Найти похожие ветки
← →
Я1 (2005-03-14 11:25) [0]Кто нибудь сталкивался с это проблемой?
При вызове Clear компонент перебирает все ноуды и для каждого помимо всего прочего выполняет это:
function TTreeNode.GetTreeView: TCustomTreeView;
begin
Result := Owner.Owner;
end;
У ноуда оунер - TTreeNodes
У TTreeNodes оунер - TCustomTreeView
Но как минимум у одного ноуда (у самого первого) нет оунера.
Так получается?
Самое интересное, что если в процедуре, где вызывается Clear, ставишь BreakPoint, то Access violation не происходит.
← →
Erik1 © (2005-03-14 12:15) [1]У TreeView вобще много заморочек, возми другой Tree. Я сейчас использую EhLib, там есть режим отображения дерева.
← →
Digitman © (2005-03-14 12:34) [2]
> При вызове 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
← →
MBo © (2005-03-14 12:38) [3]>Так получается?
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;
Нет, не получается.
Код покажи.
← →
Я1 (2005-03-14 13:23) [4]OnDeletion ничего нет
TreeView_DeleteAllItems(Owner.Handle) как раз и перебирает.
Код долго показывать. Первый ноуд добавляю с помощью Add,
в качестве сиблина передаю nil, остальные - передаю последний добавленный
← →
Я1 (2005-03-14 13:28) [5]пардон, не перебирает.
Но ошибка происходит именно здесьfunction TTreeNode.GetTreeView: TCustomTreeView;
begin
Result := Owner.Owner;
end;
← →
Я1 (2005-03-14 13:28) [6]пардон, не перебирает.
Но ошибка происходит именно здесьfunction TTreeNode.GetTreeView: TCustomTreeView;
begin
Result := Owner.Owner;
end;
← →
Digitman © (2005-03-14 13:32) [7]
> 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:42) [8]parents здесь ни причем.
ошибка происходит здесь:Result := Owner.Owner;
Да и вообще, как может получаться, что если ставишь BreakPoint,
ошибки нет, убираешь - есть?
Может, ошибка происходит от того, что во время очистки ноудов TreeView пытается что-то прорисовать, и рисовать нечего?
← →
Digitman © (2005-03-14 16:22) [9]
> ошибка происходит здесь:
> Result := Owner.Owner;
"Караул устал !" (с)
на то есть встр.дебагер, позволяющий определить, КТО есть нормально существующий объект - то ли Self.Owner, то ли Self.Owner.Owner
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.038 c