Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-1108140456
Artur
2005-02-11 19:47
2005.03.27
Буфер обмена


1-1110364233
BALU1111
2005-03-09 13:30
2005.03.27
Создание компонент на форме


1-1111010691
Гость
2005-03-17 01:04
2005.03.27
Как писать что-нибудь в n-ной колонки ListView?


1-1110556503
redlord
2005-03-11 18:55
2005.03.27
Socket : TCustomWinSocket в качестве владельца


3-1109834628
Arnold
2005-03-03 10:23
2005.03.27
Как узнать индекс записи выбранной из DBGrid





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